【opencv-1】YUV转RGB、转浮点、分离通道

在视觉分析领域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));
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值