最近利用做项目,遇到了一个问题:我是用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的字节对齐问题相关推荐

  1. OpenCV中 IplImage 与 Mat的区别

    IplImage: 在OpenCV中IplImage是表示一个图像的结构体,也是从OpenCV1.0到目前最为重要的一个结构: 在之前的图像表示用IplImage,而且之前的OpenCV是用C语言编写 ...

  2. OpenCV中IplImage与Qt中的QImage转化

    OpenCV中IplImage与Qt中的QImage转化 在工程中由于要涉及到OpenCV中IplImage与Qt中的QImage转化,所以写了两个类: #ifndef IMAGETRANSFORM_ ...

  3. Opencv中IplImage的四字节对齐问题

    一.结构解释 IplImage数据结构体中有两个宽度: 1 是width属性,表示图像的每行像素数: 2 是widthStep属性,表示存储一行像素需要的字节数. 在OpenCV里边,widthSte ...

  4. OpenCV中IplImage/CvMat/Mat转化关系

    原文链接:http://www.cnblogs.com/summerRQ/articles/2406109.html 如对内容和版权有何疑问,请拜访原作者或者通知本人. opencv中常见的与图像操作 ...

  5. 嵌入式开发过程中结构体字节对齐问题pragma pack(1)

    一.引言 曾经刚入门嵌入式在开发一个应用时,用到了自定义结构体,底层嵌入式单片机运行该结构体没问题,但是在Qt开发应用软件对接协议时,一直通不过,仔细分析才发现是QT这边的结构体字节并没有按照单字节对 ...

  6. 谈谈我对opencv中IplImage图像参数widthstep的理解

    最近在弄vs与MATLAB混合编程实现图像识别的东西,刚接触到opencv还生疏的很,遇到了各种各样奇葩的问题,其中不管怎样释放内存都不会少的内存泄露实在是让我很头疼,现在开始一点点的弄每个图像的参数 ...

  7. OpenCV中IplImage和单字节char*的相互转换

    已知 IplImage* image 和 char* data 从 IplImage 到 char* : data = image->imageData //对齐的图像数据 或者 data =  ...

  8. OpenCV 中Iplimage结构详解

    Iplimage数据结构 主要困扰我许久的就是其中的widthStep与width*nChannels是否相等,事实上我们可以在源码opencv\modules\core\src\array.cpp中 ...

  9. 看懂OpenCV中IplImage转换成CvMat的语句:CvMat sstub, *src = cvGetMat(srcarr, sstub);

    图像处理开发需求.图像处理接私活挣零花钱,请加微信/QQ 2487872782 图像处理开发资料.图像处理技术交流请加QQ群,群号 271891601 知识预备请看链接: IplImage, CvMa ...

最新文章

  1. python pip换源方法
  2. wampserver下升级php7
  3. Python调用MySQL模块初试
  4. 嵌入式开发板上常用术语
  5. GNOME 3.31.91 发布,3.32 发布周期第二个 beta 版
  6. 计算机安装调试的专业名称,【注意】计算机安装调试维修员国家职业标准
  7. 龙岩学院计算机专业宿舍,龙岩学院的各个学院位置有谁能说下
  8. 利用ping/ipconfig/nslookup/dig/whois简单工具测试DNS
  9. SOTA来啦!BERT又又又又又又魔改了!DeBERTa登顶GLUE~
  10. JSP -java service pages
  11. 刷机-升级到4.01M33-2的方法
  12. 手机打车APP的机遇与挑战
  13. 谷歌刷新纪录:将圆周率精确到了小数点后31万亿位,光存储就占了几个大硬盘!
  14. W ndows10如何清理使用痕迹,Windows10操作技巧系列——删除最常用,最常访问,快速访问记录...
  15. PAT(甲级) 1003. Emergency
  16. Log4j2最近被爆出巨大漏洞
  17. 吸顶灯怎么固定天花板_客厅里的那种大的吸顶灯玻璃怎么往天花板上固定结实!因为灯外面全是玻璃的所以要牢...
  18. 对聚合数据历史上得今天API分析
  19. linux 3.10在mini210s上移植----01. tftp安装
  20. Pandownload作者被抓,破解百度网盘的哥们!

热门文章

  1. css表格设置行列的颜色,CSS:为表格中的选定行设置颜色
  2. python treeview显示多列_Python Gtk TreeView列数据显示
  3. SpringBoot 2.0 Actuator监控系统
  4. B-treeB+tree数据库索引原理
  5. 工程项目成本/进度综合控制方法及应用
  6. 应用在tomcat下的四种部署方式(原创)
  7. 【VS开发】【DSP开发】地址对齐
  8. Android RecyclerView 滑动到指定位置 RecyclerView 滑动到顶部
  9. Vue学习--前后端交互
  10. layui 表格点击图片放大