目录
前言
虽然只是做了点海思的应用层开发,但是对于各种颜色格式也有一定的了解。因为海思本身是YUV420sp
格式的数据。在开发的过程中,要把YUV420sp
的数据转换成rgb
数据,当然也是要用到opencv
。踩了很多坑,但最终成功的把YUV420sp
的数据转换成了rgb
数据。
学习!分享!感谢!
保存灰度图像
当从海思中使用HI_MPI_VI_GetFrame
获取图像时,获取的是yuv420sp
格式的图像。假设Y
分量:宽Width
,高Height
。那么,UV
分量就是(Width/2)*(Height/2)*2
,所以所占的字节数就是3*Width*Height/2
。YUV
格式参见
图文详解YUV420数据格式
最开始不懂图像格式的时候,使用的3518e保存图像到opencv IplImage结构体中的代码,成功的保存了一张灰度图像。
-
opencv
中创建IplImage
格式的方法:
这里需要用到两个函数cvCreateImageHeader
和cvCreateImage
。具体可以参见浅谈cvCreateImageHeader,cvCreateImage和cvCreateImageHeader导致内存不足的问题。
其中,需要注意的就是cvCreateImage
创建了图像头并且为图像分配了数据。而如果我们有了图像数据,就只需要创建图像头cvCreateImageHeader
,但是我们释放的注意要把图像头所占的内存释放掉,同时要把对应的图像数据所占内存释放掉,否则就会造成内存不足。 -
整理3518e保存图像到opencv IplImage结构体中9crk给的代码。
虽然代码量很少,但是这几句代码也是我切入openCV
的起始。毕竟所有的图像处理都是要先获取到图像资源的,虽然现在仍然对图像处理的知识一窍不通。但是也算有图像有了点皮毛的了解,知识只能慢慢学,慢慢实践,否则理解不深刻,过段时间又忘记了! -
main.cpp
#define WIDTH 1920
#define HEIGHT 1080
int main()
{
char data[WIDTH*HEIGHT];
int len; // Y分量的数据大小
vi_getFrameInit();
IplImage *img = cvCreateImageHeader(cvSize(WIDTH, HEIGHT), IPL_DEPTH_8U, 1); // IPL_DEPTH_8U表示8位无符号整数,也就是256色,1表示单通道
cvSetData(img, data, WIDTH);
len = vi_getYUV(data);
cvSaveImage("myImage.jpg", img);
cvReleaseImageHeader(&img); // 注意:&
}
int vi_getFrameInit()
{
HI_U32 u32Depth = 8;
VI_CHN ViChn = 0;
HI_S32 s32ret;
s32ret = HI_MPI_VI_SetFrameDepth(ViChn, u32Depth);
}
int vi_getYUV(char* yData)
{
HI_S32 s32ret;
VIDEO_FRAME_INFO_S stFrame;
HI_VOID* yPtr;
int len