关于OpenCV中IplImage的字节对齐问题
最近利用做项目,遇到了一个问题:我是用opencv读的图像,然后自己新开辟了一个空间,以下是代码
Byte *inputImage=NULL;
IplImage* image_get=NULL;
image_get=cvLoadImage(imageName,0);
imageWidth=image_get->width;
imageHeight=image_get->height;
inputImage=new Byte(imageHeight * imageWidth);
inputImage=image_get->imageData;
这时候出问题了。我给inputimage分配的是一个imageHeight * imageWidth的空间,然而,读入的图像为800*600的时候还没问题
当为801*601的时候发现处理出来的结果不是那么回事了。后来查看发现image_get里面的widthstep为804,而不是801.这才开始查找问题
以下是引用的别人的文章:解决此问题。
OpenCV里IplImage数据结构极易出错的问题
对OpenCV稍有了解的同学都知道里边用于存储图像数据的IplImage,其中有两个属性非常值得关注,稍不留神就会导致错误(后附错例一则):
一是width属性;二是widthStep属性。
前者是表示图像的每行像素数,后者指表示存储一行像素需要的字节数。
在OpenCV里边,widthStep必须是4的倍数,从而实现字节对齐,有利于提高运算速度。
如果8U单通道图像宽度为3,那么widthStep是4,加一个字节补齐。这个图像的一行需要4个字节,只使用前3个,最后一个空着。
也就是一个宽3高3的图像的imageData数据大小为4*3=12字节。
需要注意的是,空着的那个像素并不是无效的,它仍然可以被操作,这就是导致错误的根源。
范例:
错例: 假如现在有一个char* data的指针指向一个17*15的灰度图像(17列,15行)的数据起始地址,我们想把图像数据通过cvShowImage函数显示出来,比较直观的一种做法如下:
...... IplImage* image = cvCreateImage(cvSize(17, 15), 8, 1);
memcpy(image->imageData, data, 17*15);
cvNamedWindow("window");
cvShowImage("window", image);
cvWaitKey();
cvReleaseImage(&image);
cvDestroyWindow("window"); ......
你会发现,显示的图像奇怪的往左下角歪过去了。
当你看完这篇文章后希望不要再因为这个问题浪费你的时间了(shamed:这个问题郁闷了我整整一天)。
其实原因就在于,在cvCreateImage的时候,OpenCV为实现字节对齐,使得每行数据实际有16个字节(多出一个),在使用memcpy的过程中,这些多出的字节就把对应的数据给“吃”了,因为这些数据在cvShowImage的时候并不会显示出来,这样,第二行就少一个字节,第三行少两个字节,……,所以整个图像就偏向左下角了!
知道这一点后可以将memcpy语句更改如下:
for(int i = 0; i<15; i++){ memcpy(image->imageData + image->widthStep*i, data + 17*i, 17); }
这样,程序才能按我们的设想运行。
注:如果是16bit数据,则每行数据大小需*2,即“data + 17*i*2, 17*2
Fr:http://blog.csdn.net/yihandk666/article/details/6960671
关于OpenCV中IplImage的字节对齐问题相关推荐
- OpenCV中 IplImage 与 Mat的区别
IplImage: 在OpenCV中IplImage是表示一个图像的结构体,也是从OpenCV1.0到目前最为重要的一个结构: 在之前的图像表示用IplImage,而且之前的OpenCV是用C语言编写 ...
- OpenCV中IplImage与Qt中的QImage转化
OpenCV中IplImage与Qt中的QImage转化 在工程中由于要涉及到OpenCV中IplImage与Qt中的QImage转化,所以写了两个类: #ifndef IMAGETRANSFORM_ ...
- Opencv中IplImage的四字节对齐问题
一.结构解释 IplImage数据结构体中有两个宽度: 1 是width属性,表示图像的每行像素数: 2 是widthStep属性,表示存储一行像素需要的字节数. 在OpenCV里边,widthSte ...
- OpenCV中IplImage/CvMat/Mat转化关系
原文链接:http://www.cnblogs.com/summerRQ/articles/2406109.html 如对内容和版权有何疑问,请拜访原作者或者通知本人. opencv中常见的与图像操作 ...
- 嵌入式开发过程中结构体字节对齐问题pragma pack(1)
一.引言 曾经刚入门嵌入式在开发一个应用时,用到了自定义结构体,底层嵌入式单片机运行该结构体没问题,但是在Qt开发应用软件对接协议时,一直通不过,仔细分析才发现是QT这边的结构体字节并没有按照单字节对 ...
- 谈谈我对opencv中IplImage图像参数widthstep的理解
最近在弄vs与MATLAB混合编程实现图像识别的东西,刚接触到opencv还生疏的很,遇到了各种各样奇葩的问题,其中不管怎样释放内存都不会少的内存泄露实在是让我很头疼,现在开始一点点的弄每个图像的参数 ...
- OpenCV中IplImage和单字节char*的相互转换
已知 IplImage* image 和 char* data 从 IplImage 到 char* : data = image->imageData //对齐的图像数据 或者 data = ...
- OpenCV 中Iplimage结构详解
Iplimage数据结构 主要困扰我许久的就是其中的widthStep与width*nChannels是否相等,事实上我们可以在源码opencv\modules\core\src\array.cpp中 ...
- 看懂OpenCV中IplImage转换成CvMat的语句:CvMat sstub, *src = cvGetMat(srcarr, sstub);
图像处理开发需求.图像处理接私活挣零花钱,请加微信/QQ 2487872782 图像处理开发资料.图像处理技术交流请加QQ群,群号 271891601 知识预备请看链接: IplImage, CvMa ...
最新文章
- python pip换源方法
- wampserver下升级php7
- Python调用MySQL模块初试
- 嵌入式开发板上常用术语
- GNOME 3.31.91 发布,3.32 发布周期第二个 beta 版
- 计算机安装调试的专业名称,【注意】计算机安装调试维修员国家职业标准
- 龙岩学院计算机专业宿舍,龙岩学院的各个学院位置有谁能说下
- 利用ping/ipconfig/nslookup/dig/whois简单工具测试DNS
- SOTA来啦!BERT又又又又又又魔改了!DeBERTa登顶GLUE~
- JSP -java service pages
- 刷机-升级到4.01M33-2的方法
- 手机打车APP的机遇与挑战
- 谷歌刷新纪录:将圆周率精确到了小数点后31万亿位,光存储就占了几个大硬盘!
- W ndows10如何清理使用痕迹,Windows10操作技巧系列——删除最常用,最常访问,快速访问记录...
- PAT(甲级) 1003. Emergency
- Log4j2最近被爆出巨大漏洞
- 吸顶灯怎么固定天花板_客厅里的那种大的吸顶灯玻璃怎么往天花板上固定结实!因为灯外面全是玻璃的所以要牢...
- 对聚合数据历史上得今天API分析
- linux 3.10在mini210s上移植----01. tftp安装
- Pandownload作者被抓,破解百度网盘的哥们!