opencv 使用笔记

版权声明:本文为博主原创文章,欢迎转载。转载请注明出处http://blog.csdn.net/jobbofhe https://blog.csdn.net/jobbofhe/article/details/84036095

在视觉分析领域opencv是少不了的库,所以在使用过程中将细节和容易混淆遗忘的部分慢慢记录下来。opencv是一个庞大的库,在使用过程中慢慢摸索吧。
以下有关代码可提供用时的参考,直接编译还需要完善。

YUV转RGB

  1. 读取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;
}
  1. 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);
  1. opencv resize
cv::Mat dstBGR(HEIGHT, WIDTH, CV_8UC3);
cv::resize(mBGR, dstBGR, cv::Size(200, 200));  
  1. 转浮点
mBGR.convertTo(mfloat_BGR, CV_32F, 1.0/255);  // 将mRGB RGB值型转为float类型
  1. 分离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));
}

猜你喜欢

转载自blog.csdn.net/jobbofhe/article/details/84036095