在视觉分析领域opencv是少不了的库,所以在使用过程中将细节和容易混淆遗忘的部分慢慢记录下来。opencv是一个庞大的库,在使用过程中慢慢摸索吧。
以下有关代码可提供用时的参考,直接编译还需要完善。
YUV转RGB
- 读取YUV文件
int WIDTH, HEIGHT;
unsigned char buff[WIDTH*HEIGHT*3/2];
// read yuv file
FILE *yuv_file = fopen(fileName,"rb");
int i = 0;
while( !feof(yuv_file) )
{
unsigned char pixel= getc(yuv_file);
// printf("%u ",pixel);
buff[i++] = pixel;
}
- yuv转rgb
cv::Mat mYUV(HEIGHT + HEIGHT/2, WIDTH, CV_8UC1, (void*) buff);
cv::Mat mBGR(HEIGHT, WIDTH, CV_8UC3);
cvtColor(mYUV, mBGR, COLOR_YUV2RGB_I420, 3);
- opencv resize
cv::Mat dstBGR(HEIGHT, WIDTH, CV_8UC3);
cv::resize(mBGR, dstBGR, cv::Size(200, 200));
- 转浮点
mBGR.convertTo(mfloat_BGR, CV_32F, 1.0/255); // 将mRGB RGB值型转为float类型
- 分离RGB通道
cv::Mat(RGB) 的排列方式是
RGBRGBRGBRGB
RGBRGBRGBRGB
RGBRGBRGBRGB
在使用过程中可能需要转成一下格式
RRRRRRRRRRRR
GGGGGGGGGG
BBBBBBBBBBB
这个时候就可以使用cv::split() 函数。
cv::Mat mat(HEIGHT, WIDTH, CV_8UC3);
cv::Mat rgbChannnels[3];
split(mfloat_BGR,rgbChannnels);
int singleChannelSize = 500* 500;
float* yolo_rgb_plane = (float *)malloc(sizeof(float) * 500* 500* 3);
for(int i = 0; i< 3;i++)
{
float *singleChannel = (float *)rgbChannnels[i].data;
memcpy(yolo_rgb_plane+singleChannelSize*i, singleChannel, singleChannelSize * sizeof(float));
}