Доступ к компонентам R, G и B пикселя в изображении (8UC3) для выполнения операций с пикселями в Vivado Hls - PullRequest
0 голосов
/ 04 мая 2020

надеюсь, что в эти неудачные времена все в безопасности и чувствуют себя хорошо.

Я пытаюсь реализовать конвейер обработки изображений с 5 этапами в Vivado HLS. Третий этап моего конвейера - преобразование цвета (преобразование цвета и преобразование баланса белого). Для этого я должен манипулировать компонентами R, G и B каждого пикселя изображения. Я испытываю трудности с выделением значений этих компонентов цвета из типа 8UC3 (изображение с тремя каналами). Я написал и приложил код psuedo о том, как должны выполняться операции в конвейере, предполагая, что IDX дает значение каждого компонента цвета в каждом пикселе. Может кто-нибудь, пожалуйста, помогите мне с доступом к значению компонента цвета пикселя в IDX.

PS: Я новичок в Vivado Hls, cpp и OpenCV. Любые предложения будут очень полезны.

Заранее спасибо

/////header file(.hpp)

#include  "hls_video.h"
#include  "hls_math.h"
#include <ap_fixed.h>
#define MAX_WIDTH  512
#define MAX_HEIGHT 256
#define CHANNELS 3
typedef hls::stream<ap_axiu<24,1,1,1> >AXI_STREAM;
typedef hls::Mat<MAX_HEIGHT,MAX_WIDTH,HLS_8UC3> RGB_IMAGE;
void colour_transform_filter(AXI_STREAM& INPUT_STREAM, AXI_STREAM& OUTPUT_STREAM);//int rows, int cols);
float weights[3][3] = {{1.578706, -0.129182, 0.026785}, 
                       {-0.509131, 1.430037, -0.554129},
                       {-0.026729, -0.268639, 1.556603}};

//-----------------------------------------------------------------------------------------------------------                      

/////core.cpp (synthasizable in vivado HLS)

void colour_transform_filter(AXI_STREAM& INPUT_STREAM, AXI_STREAM& OUTPUT_STREAM);//int rows, int cols)
{
#pragma HLS INTERFACE axis port=INPUT_STREAM
#pragma HLS INTERFACE axis port=OUTPUT_STREAM

RGB_IMAGE  image(MAX_HEIGHT, MAX_WIDTH);
RGB_IMAGE  image_1(MAX_HEIGHT, MAX_WIDTH);
RGB_IMAGE  image_2(MAX_HEIGHT, MAX_WIDTH);
RGB_IMAGE  image_3(MAX_HEIGHT, MAX_WIDTH);
RGB_IMAGE  image_4(MAX_HEIGHT, MAX_WIDTH);
RGB_IMAGE  image_5(MAX_HEIGHT, MAX_WIDTH);
RGB_IMAGE  image_6(MAX_HEIGHT, MAX_WIDTH);

hls::AXIvideo2Mat(INPUT_STREAM, image);
///descaling the pixel value, dividing the each channel value of the pixel by 256 (in total 512*256*3 operations)
for( idx=0; idx< MAX_HEIGHT *  MAX_WIDTH * CHANNELS; idx++ ) /// 
{
    image_2[idx] = image[idx]/256.0;
}
////pixel wise transformation, multyplying with the weight matrix
for( idx=0; idx< MAX_HEIGHT *  MAX_WIDTH * CHANNELS; idx++ )
{
 int channel_number = (idx+1) % 3;  // 1--->Red, 2--->green, 3--->blue
 switch(channel_number){
     case 1: {  //red component
                image_3[idx] = image_2[idx] * weights[0][0] + 
                                image_2[idx+1] * weights[1][0] + 
                                image_2[idx+2] * weights[2][0];
                                break;
     }
     case 2: {  // green component
                image_3[idx] = image_2[idx-1] * weights[0][1] + 
                                image_2[idx] * weights[1][1] + 
                                image_2[idx+1] * weights[2][1];
                                break;
     }
     case 3: {  // blue component
                image_3[idx] = image_2[idx-2] * weights[0][2] + 
                                image_2[idx-1] * weights[1][2] + 
                                image_2[idx] * weights[2][2];
                                break;
     }
 }
}
////Rescaling the image, multyplying each channel value of the pixel with 255
for( idx=0; idx< MAX_HEIGHT *  MAX_WIDTH * CHANNELS; idx++ ) /// 
{
    image_4[idx] = image_3[idx]*255.0;
} 
///// bringing the pixel value to 255 if it exceeds the maximum and to zero if the value is negative.
for( idx=0; idx< MAX_HEIGHT *  MAX_WIDTH * CHANNELS; idx++ ) /// 
{
    image_5[idx] = fmin(image_4[idx],255);

} 

for( idx=0; idx< MAX_HEIGHT *  MAX_WIDTH * CHANNELS; idx++ ) /// 
{
        image_6[idx] = fmax(image_5[idx],0);
}

hls::Mat2AXIvideo(image_6, OUTPUT_STREAM);

//-------------------------------------------------------------------------------------------------------------

/////core_testbench.cpp

#include <hls_opencv.h>
#include <iostream>
using namespace std;
int main (int argc, char** argv)
 {
IplImage* src;
IplImage* dst;
AXI_STREAM src_axi, dst_axi;
src = cvLoadImage("input.bmp");
dst = cvCreateImage(cvGetSize(src), src->depth, src->nChannels);
IplImage2AXIvideo(src, src_axi);
colour_transform_filter(src_axi, dst_axi);//src->height,src->width);
AXIvideo2IplImage(dst_axi, dst);
cvSaveImage("output.bmp", dst);
cvReleaseImage(&src);
cvReleaseImage(&dst);
}
...