图像处理-将uchar*数据转换成Mat,Iplimage*
2016-05-12 14:37
691 查看
1.Mat基础
在计算机内存中,数字图像是已矩阵的形式保存的。
OpenCV2中,数据结构Mat是保存图像像素信息的矩阵,它主要包含两部分:矩阵头和一个指向像素数据的矩阵指针。
矩阵头主要包含,矩阵尺寸、存储方法、存储地址和引用次数等。
矩阵头的大小是一个常数,不会随着图像的大小而改变,但是保存图像像素数据的矩阵则会随着图像的大小而改变,通常数据量会很大,比矩阵头大几个数量级。
这样,在图像复制和传递过程中,主要的开销是由存放图像像素的矩阵而引起的。
因此,OpenCV使用了引用次数,当进行图像复制和传递时,不再复制整个Mat数据,而只是复制矩阵头和指向像素矩阵的指针。
2.IplImage
在OpenCV中IplImage是表示一个图像的结构体。
IplImage 通过cvCreateImage, 创建后复制像素到创建的内存,或者cvCreateImageHeader和cvSetImageData创建。
3.将uchar*数据转换成Mat,Iplimage*代码
在计算机内存中,数字图像是已矩阵的形式保存的。
OpenCV2中,数据结构Mat是保存图像像素信息的矩阵,它主要包含两部分:矩阵头和一个指向像素数据的矩阵指针。
矩阵头主要包含,矩阵尺寸、存储方法、存储地址和引用次数等。
矩阵头的大小是一个常数,不会随着图像的大小而改变,但是保存图像像素数据的矩阵则会随着图像的大小而改变,通常数据量会很大,比矩阵头大几个数量级。
这样,在图像复制和传递过程中,主要的开销是由存放图像像素的矩阵而引起的。
因此,OpenCV使用了引用次数,当进行图像复制和传递时,不再复制整个Mat数据,而只是复制矩阵头和指向像素矩阵的指针。
2.IplImage
在OpenCV中IplImage是表示一个图像的结构体。
IplImage 通过cvCreateImage, 创建后复制像素到创建的内存,或者cvCreateImageHeader和cvSetImageData创建。
3.将uchar*数据转换成Mat,Iplimage*代码
// 注:frame为camera得到的帧 int height = frame->height; int width = frame->width; int nYUVSize = height * width; int a = 0; int i = 0; // convert data to yuv420p uchar *yuvBuffer = (uchar*) malloc(nYUVSize * 1.5); uchar *pBGR24 = (uchar*) malloc(nYUVSize * 3); for (i = 0; i < height; i++) { memcpy(yuvBuffer + a, frame->data[0] + i * frame->linesize[0], width); a += width; } for (i = 0; i < height / 2; i++) { memcpy(yuvBuffer + a, frame->data[1] + i * frame->linesize[1], width / 2); a += width / 2; } for (i = 0; i < height / 2; i++) { memcpy(yuvBuffer + a, frame->data[2] + i * frame->linesize[2], width / 2); a += width / 2; } //std::cout<<"convert y420p to bgr24."<<std::endl; // convert y420p to bgr24 double t3 = cvGetTickCount(); const long len = width * height; unsigned char* yData = yuvBuffer; unsigned char* vData = &yData[len]; unsigned char* uData = &vData[len >> 2]; int bgr[3] = { 0 }; int yIdx, uIdx, vIdx, idx; for (int i = 0; i < height; i++) { for (int j = 0; j < width; j++) { yIdx = i * width + j; vIdx = (i / 2) * (width / 2) + (j / 2); uIdx = vIdx; bgr[0] = (int) (yuvBuffer[yIdx] + 1.370705 * (vData[uIdx] - 128)); // b分量 bgr[1] = (int) (yuvBuffer[yIdx] - 0.698001 * (uData[uIdx] - 128) - 0.703125 * (vData[vIdx] - 128)); // g分量 bgr[2] = (int) (yuvBuffer[yIdx] + 1.732446 * (uData[vIdx] - 128)); // r分量 for (int k = 0; k < 3; k++) { idx = (i * width + j) * 3 + k; if (bgr[k] >= 0 && bgr[k] <= 255) pBGR24[idx] = bgr[k]; else pBGR24[idx] = (bgr[k] < 0) ? 0 : 255; } } } nCouta++; char sWord[20] = { 0 }; sprintf(sWord, "%d", nCouta); std::string sNumber(sWord); IplImage *iplImage = NULL; //得到IplImage 类型 if (iplImage) { cvReleaseImageHeader(&iplImage); } iplImage = cvCreateImageHeader(cvSize(width, height), IPL_DEPTH_8U, 3); cvSetData(iplImage, pBGR24, width * 3); Mat image = Mat(iplImage); //得到Mat 类型 cv::imshow("orginal", image);
相关文章推荐
- 解决Web部署 svg/woff/woff2字体 404错误(转)
- 《Python核心编程》18.多线程编程(二)
- linux svn客户端 常用命令
- NGUI实现小地图 地图不动,人物图标动
- windows下在Eclipse中启动的tomcat没有乱码,单独部署到tomcat下乱码解决方案
- apache编译安装方法及配置
- 剑指offer之面试题37两个链表的第一个公共结点
- C/C++函数指针
- 应用于app的数据追踪----自动生成文件路径
- Afaria注册表修改
- 使用dom4j生成和解析XML文档
- CentOS 7搭建本地yum源
- orace后台执行
- 机房网络规划
- 226. Invert Binary Tree [easy] (Python)
- Asp.net 面向接口可扩展框架之业务规则引擎扩展组件
- ASP.NET MVC Bootstrap模板选中菜单高亮显示当前项方法
- [FZU1977] Pandora adventure
- 面试笔试题4--如何判断主机是大端小端?
- 摄像头采集QT5显示和分辨率适配