指针操作:【申请】、【释放】、【YUV2BGR】、【QT保存图像】
来源:互联网 发布:高考必知文学常识 编辑:程序博客网 时间:2024/06/13 21:28
【指针的申请】:
unsigned char *PRGB = new unsigned char[<span style="font-family:FangSong_GB2312;">640*480</span>*<span style="font-family:FangSong_GB2312;">3</span>]; //<span style="font-family:FangSong_GB2312;">申请640*480*3个字节的图像内存</span>//PRGB=(unsigned char*)malloc(<span style="font-family:FangSong_GB2312;">640*480</span>*<span style="font-family:FangSong_GB2312;">3</span>*sizeof(unsigned char));malloc 和 new 都可以申请内存,二选一.
【指针的释放】:
delete []PRGB; //释放数组指针PRGB =NULL;
【YUV2BGR】:
/***********************************************************************************@code unsigned char *PRGB = new unsigned char[nLen*2]; //nLen 是 YUV图像的length //因为YUV.length =Width*Height*3/2, BGR.length = Width*Height*3 //所以 BGR = YUV*2 v4lconvert_yuv420_to_bgr241__((const unsigned char*)pBuf, PRGB,nWidth, nHeight, 24);@encode***********************************************************************************/void Mythread::v4lconvert_yuv420_to_bgr241__(const unsigned char *src, unsigned char *dest,int width, int height, int yvu){ int i, j; const unsigned char *ysrc = src; const unsigned char *usrc, *vsrc; if (yvu) { vsrc = src + width * height; usrc = vsrc + (width * height) / 4; } else { usrc = src + width * height; vsrc = usrc + (width * height) / 4; } for (i = 0; i < height; i++) { for (j = 0; j < width; j += 2) {#if 1 /* fast slightly less accurate multiplication free code */ int u1 = (((*usrc - 128) << 7) + (*usrc - 128)) >> 6; int rg = (((*usrc - 128) << 1) + (*usrc - 128) + ((*vsrc - 128) << 2) + ((*vsrc - 128) << 1)) >> 3; int v1 = (((*vsrc - 128) << 1) + (*vsrc - 128)) >> 1; *dest++ = CLIP(*ysrc + u1); *dest++ = CLIP(*ysrc - rg); *dest++ = CLIP(*ysrc + v1); ysrc++; *dest++ = CLIP(*ysrc + u1); *dest++ = CLIP(*ysrc - rg); *dest++ = CLIP(*ysrc + v1);#else *dest++ = YUV2B(*ysrc, *usrc, *vsrc); *dest++ = YUV2G(*ysrc, *usrc, *vsrc); *dest++ = YUV2R(*ysrc, *usrc, *vsrc); ysrc++; *dest++ = YUV2B(*ysrc, *usrc, *vsrc); *dest++ = YUV2G(*ysrc, *usrc, *vsrc); *dest++ = YUV2R(*ysrc, *usrc, *vsrc);#endif ysrc++; usrc++; vsrc++; } /* Rewind u and v for next line */ if (!(i & 1)) { usrc -= width / 2; vsrc -= width / 2; } }}
【从内存读取数据到Mat】:
Mat YUVDATA(Size(nWidth,nHeight),CV_8UC3,Scalar(0));memcpy(YUVDATA.data,PRGB,nWidth*nHeight*3); //用memcpy将内存中的数据copy到Mat 中,然后<span style="font-family:FangSong_GB2312;">释放内存指针</span>delete []PRGB;PRGB =NULL;
【QT保存与读取图像】:
【保存成JPG图片】 QFile filebak(QString::fromStdString("/<span style="font-family:FangSong_GB2312;">yue</span>/info.jpg")); filebak.open(QFile::WriteOnly); filebak.write((const char*)pBuf, nLen); filebak.close();<span style="font-family:FangSong_GB2312;">【读取图片】: QPixmap pixmap("/yue/info.jpg"); </span>
【opencv解码JPG】:
<span style="font-size:18px;"> //因为JPG格式编码的图像,图像大小就等于它的Length Mat temp_mat = Mat(1,nLen,CV_8UC1,pBuf); </span><span style="font-size:18px;"> Mat jpgBuf = imdecode(temp_mat,CV_LOAD_IMAGE_COLOR); Mat reSizeMat; cv::resize(jpgBuf,reSizeMat,Size(iWidth,iHeight)); cv::cvtColor(reSizeMat,reSizeMat,CV_BGR2RGB);</span>
先申请一个一维的Mat来存jpg格式的数据(矩阵的长度就是图像的大小),然后imdecode解码,解码以后是BGR图像,需要转化成RGB
0 0
- 指针操作:【申请】、【释放】、【YUV2BGR】、【QT保存图像】
- Yuv2Bgr
- 指针申请内存和释放
- C++ 释放指针操作
- 关于QT的内存申请和释放
- 关于QT的内存申请和释放
- 类静态指针的申请和释放
- C指针(一) - 申请和释放内存
- 指针空间的申请和释放
- C指针(一) - 申请和释放内存
- 指针空间的申请和释放(C)
- 字符串指针申请空间,释放测试代码
- 二级指针的申请与释放
- 二级指针的申请与释放
- 指针空间的申请与释放
- 指针空间的申请和释放
- 数组内存申请和释放,指针数组和数组指针
- 内存操作(指针,变量的生存期及作用范围,良好的动态内存申请和释放习惯)(
- Ubuntu 14.04环境变量修改
- Android开发中对象的实例化示例
- Swift-扩展
- lightoj 1079 Just another Robbery
- 一个简单的双向链表的例子
- 指针操作:【申请】、【释放】、【YUV2BGR】、【QT保存图像】
- uva1587 - Box
- C++基础:各种输入方法总结,cin、cin.get()、cin.getline()、getline()、gets()、getchar()
- 时间转换
- getOutputStream() has already been called for this response异常的原因和解决方法[转]
- 深入了解Object类
- springamqp的exchange
- Swift-协议
- 74. Search a 2D Matrix