Цвет в градациях серого и фоновое вычитание в естественных условиях HLS

Я пишу проект CPP в естественных условиях, чтобы синтезировать его в FPGA. Я хочу преобразовать двухцветное изображение в оттенки серого и вычесть их, используя функцию «absDiff» в HLS.

Моя главная функция в top.cpp

 #include <hls_video.h>
#include <hls/hls_video_types.h>
#include "top.h"

void toGray(AXI_IN_STREAM &IN_STREAM_1, AXI_IN_STREAM &IN_STREAM_2, AXI_OUT_STREAM &OUT_STREAM_1, AXI_OUT_STREAM &OUT_STREAM_2,AXI_OUT_STREAM &OUT_STREAM_BACK, unsigned int cols, unsigned int rows){
#pragma HLS INTERFACE axis port=IN_STREAM_1
#pragma HLS INTERFACE axis port=OUT_STREAM_1

#pragma HLS INTERFACE axis port=IN_STREAM_2
#pragma HLS INTERFACE axis port=OUT_STREAM_2
#pragma HLS INTERFACE axis port=OUT_STREAM_BACK

#pragma HLS RESOURCE core=AXI_SLAVE variable=rows metadata="-bus_bundle CONTROL"#pragma HLS RESOURCE core=AXI_SLAVE variable=cols metadata="-bus_bundle CONTROL"#pragma HLS RESOURCE core=AXI_SLAVE variable=return metadata="-bus_bundle CONTROL"
#pragma HLS INTERFACE ap_stable port=rows
#pragma HLS INTERFACE ap_stable port=cols

hls::Mat<MAX_HEIGHT, MAX_WIDTH, HLS_8UC3> inMat_1(rows, cols);
hls::Mat<MAX_HEIGHT, MAX_WIDTH, HLS_8UC3> inMat_2(rows, cols);

hls::Mat<MAX_HEIGHT, MAX_WIDTH, HLS_8UC1> grayMat_1(rows, cols);
hls::Mat<MAX_HEIGHT, MAX_WIDTH, HLS_8UC1> grayMat_2(rows, cols);
hls::Mat<MAX_HEIGHT, MAX_WIDTH, HLS_8UC1> backMat(rows, cols);

//  hls::Mat<MAX_HEIGHT, MAX_WIDTH, HLS_8UC1> outMat(rows, cols);

hls::AXIvideo2Mat(IN_STREAM_1, inMat_1);
hls::AXIvideo2Mat(IN_STREAM_2, inMat_2);

hls::CvtColor<HLS_BGR2GRAY, HLS_8UC3, HLS_8UC1>(inMat_1, grayMat_1);
hls::CvtColor<HLS_BGR2GRAY, HLS_8UC3, HLS_8UC1>(inMat_2, grayMat_2);
//hls::EqualizeHist(grayMat, outMat );

hls::AbsDiff(grayMat_1,grayMat_2,backMat);

hls::Mat2AXIvideo(grayMat_1, OUT_STREAM_1);
hls::Mat2AXIvideo(grayMat_2, OUT_STREAM_2);
hls::Mat2AXIvideo(backMat, OUT_STREAM_BACK);
}

Мой top.h это

    #ifndef _TOP_H
#define _TOP_H

#include <hls_stream.h>
// maximum image size
#define MAX_WIDTH  320
#define MAX_HEIGHT 240typedef hls::stream<ap_axiu<24,1,1,1> >         AXI_IN_STREAM;
typedef hls::stream<ap_axiu<8,1,1,1> >          AXI_OUT_STREAM;void toGray(AXI_IN_STREAM &input_1, AXI_IN_STREAM &input_2, AXI_OUT_STREAM &output_1, AXI_OUT_STREAM &output_2,AXI_OUT_STREAM &output_back, unsigned int cols, unsigned int rows);

#endif

Моя тестовая функция

#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/core/types_c.h>
#include <hls_video.h>
#include <hls_opencv.h>
#include <opencv2/imgproc/imgproc.hpp>

//#include <opencv2/>
#include "top.h"
#define INPUT_FILE_1 "D:/TRACKING PRADNAYA/ball/1co1.jpg"#define INPUT_FILE_2 "D:/TRACKING PRADNAYA/ball/1co407.jpg"#define OUTPUT_FILE_1 "D:/TRACKING PRADNAYA/ball_out/backgroud/1co1_bg.jpg"#define OUTPUT_FILE_2 "D:/TRACKING PRADNAYA/ball_out/backgroud/1co407_bg.jpg"#define OUTPUT_FILE_BACK "D:/TRACKING PRADNAYA/ball_out/backgroud/1co407_back.jpg"

//#define OUTPUT_FILE_CV "D:/TRACKING PRADNAYA/ball_out/backgroud/1co1_cv_new.jpg"
int main(){
cv::Mat inputMat_1(MAX_HEIGHT, MAX_WIDTH, CV_8UC3);
cv::Mat inputMat_2(MAX_HEIGHT, MAX_WIDTH, CV_8UC3);inputMat_1 = cv::imread(INPUT_FILE_1, cv::IMREAD_COLOR);
inputMat_2 = cv::imread(INPUT_FILE_2, cv::IMREAD_COLOR);cv::Mat outputMat_1(inputMat_1.rows, inputMat_1.cols, CV_8UC1);
cv::Mat outputMat_2(inputMat_2.rows, inputMat_2.cols, CV_8UC1);
cv::Mat outputMat_back(inputMat_2.rows, inputMat_2.cols, CV_8UC1);

//  cv::Mat greyMat_cv(inputMat.rows, inputMat.cols, CV_8UC1);
//  cv::Mat diffMat(inputMat.rows, inputMat.cols, CV_8UC1);

AXI_IN_STREAM inStream_1;
AXI_OUT_STREAM outStream_1;

AXI_IN_STREAM inStream_2;
AXI_OUT_STREAM outStream_2;
AXI_OUT_STREAM outStream_back;cvMat2AXIvideo(inputMat_1, inStream_1);
cvMat2AXIvideo(inputMat_2, inStream_2);

toGray(inStream_1, inStream_2, outStream_1, outStream_2, outStream_back, inputMat_1.cols, inputMat_1.rows);
AXIvideo2cvMat(outStream_1, outputMat_1);
AXIvideo2cvMat(outStream_2, outputMat_2);
AXIvideo2cvMat(outStream_back, outputMat_back);cv::imwrite(OUTPUT_FILE_1, outputMat_1 );
cv::imwrite(OUTPUT_FILE_2, outputMat_2 );
cv::imwrite(OUTPUT_FILE_BACK, outputMat_back );return 0;
}

Я получаю фоновое вычтенное изображение, но не могу получить изображение в градациях серого. Вместо оттенков серого я получаю черные изображения.

Если я удаляю фоновое вычитание и делаю только оттенки серого с 2 входами и 2 выходами, это работает нормально.

Также я получаю предупреждение

WARNING: Hls::stream 'hls::stream<unsigned char>.7' is read while empty,
which may result in RTL simulation hanging.

0

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]