在视觉分析领域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));
    复制代码