Цвет в градациях серого и фоновое вычитание в естественных условиях 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 240


typedef 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 ответов

Другие вопросы по тегам