надеюсь, что в эти неудачные времена все в безопасности и чувствуют себя хорошо.
Я пытаюсь реализовать конвейер обработки изображений с 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);
}