前言
在使用音视频处理芯片时,比较多的芯片支持硬件编解码以及格式转换等,减少了系统资源的耗损(CPU,GPU等)。在部分芯片中硬件编解码或转换需要自行按照demo封装,测试等可使用OpenCV前期先做测试处理,在使用过程中,遇到一些问题,在此做下记录以备后续之需。
准备工作
1)OpenCV中大量使用了二维数组,因此需要弄清楚宽高, 分辨率常使用宽x高表示, OpenCV中经常使用高x宽表示,对应的是rows和cols,即:
1920(width)x1080(height) -> 1920(cols)*1080(rows)
OpenCV封装基本都是列(rows)在前, 行(cols)在后。
2)因为yuv涉及到1.5小数,因此必须保证宽高是偶数,部分芯片还要求16位对齐,因此需要考虑这点,如无需考虑对齐问题, 可将w和h都减少1个像素即可(保证不会越界)。针对对齐,可以参考海思的上对齐和下对齐(后续补充,如有需要参考的同学留言, 我及时附上)。
3)常用的原始数据打开工具,支持各种YUV和BGR原始数据查看链接: 原始数据查看工具
封装为cv::Mat格式
1)使用OpenCV,首先需要将数据封装成cv::Mat格式,YUV420SP或YUV420P封装如下:
typedef struct rawInfo{
unsigned int width;
unsigned int height;
unsigned char *pData;
}
假定该pData已分配了堆栈
cv::Mat yuvMat(height*3/2, width, CV8UC1, pData);
这里要非常注意height在前,width在后,
格式转换
OpenCV中非常多的接口工具输入输出都是基于cv::Mat的,比较推BGR24,
比如使用编码等。
1)将YUV转为BGR24,转换按照如下:
cv::cvtColor(yuvMat, bgrMat, cv::COLOR_YUV420sp2BGR);
其中yuvMat为转换前数据, bgrMat为转化后的数据,本例是将yuv420sp转为BGR24,如果有其他需求,请使用如下宏对应选择。
enum ColorConversionCodes {
COLOR_BGR2BGRA = 0, //!< add alpha channel to RGB or BGR image
COLOR_RGB2RGBA = COLOR_BGR2BGRA,
COLOR_BGRA2BGR = 1, //!< remove alpha channel from RGB or BGR image
COLOR_RGBA2RGB = COLOR_BGRA2BGR,
COLOR_BGR2RGBA = 2, //!< convert between RGB and BGR color spaces (with or without alpha channel)
COLOR_RGB2BGRA = COLOR_BGR2RGBA,
COLOR_RGBA2BGR = 3,
COLOR_BGRA2RGB = COLOR_RGBA2BGR,
COLOR_BGR2RGB = 4,
COLOR_RGB2BGR = COLOR_BGR2RGB,
COLOR_BGRA2RGBA = 5,
COLOR_RGBA2BGRA = COLOR_BGRA2RGBA,
COLOR_BGR2GRAY = 6, //!< convert between RGB/BGR and grayscale, @ref color_convert_rgb_gray "color conversions"
COLOR_RGB2GRAY = 7,
COLOR_GRAY2BGR = 8,
COLOR_GRAY2RGB = COLOR_GRAY2BGR,
COLOR_GRAY2BGRA = 9,
COLOR_GRAY2RGBA = COLOR_GRAY2BGRA,
COLOR_BGRA2GRAY = 10,
COLOR_RGBA2GRAY = 11,
COLOR_BGR2BGR565 = 12, //!< convert between RGB/BGR and BGR565 (16-bit images)
COLOR_RGB2BGR565 = 13,
COLOR_BGR5652BGR = 14,
COLOR_BGR5652RGB = 15,
COLOR_BGRA2BGR565 = 16,
COLOR_RGBA2BGR565 = 17,
COLOR_BGR5652BGRA = 18,
COLOR_BGR5652RGBA = 19,
COLOR_GRAY2BGR565 = 20, //!< convert between grayscale to BGR

最低0.47元/天 解锁文章
3万+

被折叠的 条评论
为什么被折叠?



