首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

OpenCVIplImage的widthStep参数

奇怪的是有个别图像显示是正确的.其实工作很简单,就是从一幅图片里切割出指定的若干区域而已.于是试了一下每次都切固定大小的区域,100*100,没问题,又正确了,再变回动态大小区域,问题又来了…按理说这个大小对我的代码应该没影响...…不经意的看了一下每次切的大小,发现切偶数大小rect时时正确的,奇数大小的rect则显示错误,忽然想到貌似IplImage里面有一个widthStep参数,看OpenCV文档里的例程貌似人家用过这个参数...分别取宽度为奇偶的图片,读这个widthStep参数,果然,偶数的话跟上面计算一样,奇数就会多出一些,那就不难理解为什么会产生错位了.一般对于奇数的width会填充一个RGB,也就是3bytes.那么现在要对IplImage...图像数据进行操作,就要按行取(IplImage的imageData是按照BGRBGRBGR按行存储的),然后每一行顺加一个widthStep了,不能傻傻的按照width x height的二维数组来计算了...… 小小一个参数困扰了我一个小时,看来以后对这些细节要很小心,要不是比较谨慎检查一下结果,拿这些图像去训练,就等于拿一坨垃圾去做冷面…馋冷面了,在家就吃了三回…还要注意的就是,用到象OpenCV这种库的时候

40240
您找到你想要的搜索结果了吗?
是的
没有找到

OpenCV Mat类型与IplImage类型的相互转换

OpenCV2.x以后,代码风格由C变为C++,同时引进了Mat类型。...这使得之前一些优秀的代码案例没办法直接移植,当然可以把代码重新写一遍,全部换成C++风格和Mat类型,但是如果只是测试使用的话,使用类型转换会更为方便。...IplImage转Mat (1)直接使用Mat的构造函数,原型如下: Mat(const IplImage* img, bool copyData=false); 第一个参数当然是要转换的IplImage...类型的图片,要注意的是第二个参数,copyData标志是否需要复制图像数据,若为false,则不复制数据,即两种格式的图像共享内存单元,也就是说转化后的图片改变了,之前的图片也会跟着改变;若为true,...(2)定义后要先对Mat类型的图初始化,否则代码异常。

1.6K30

OpenCv函数学习(一)

IplImage大小 */ 4 int ID; /* 版本 (=0)*/ 5 int nChannels; /* 大多数OPENCV函数支持1,2,3 或 4 个通道 */ 6 int alphaChannel..._16S, IPL_DEPTH_32S, 8 IPL_DEPTH_32F 和IPL_DEPTH_64F */ 9 char colorModel[4]; /* 被OpenCV忽略 */ 10 char...被忽略*/ 26 int BorderConst[4]; /* 同上 */ 27 char *imageDataOrigin; /* 指针指向一个不同的图像数据结构(不是必须排列的),是为了纠正图像内存分配准备的...* CvCloneImage(const IplImage *p) 在使用函数之前,不用特地开辟内存,即该函数会自己开一段内存,然后复制好image里面的数据,然后把这段内存中的数据返回....CreateCvImage IplImage* cvCreateImage(CvSize size, int depth, int channels) 作用申请一个图片结构大小的内存,比如创建灰色图像

28610

OpenCV 2.2版本号以上显示图片到 MFC 的 Picture Control 控件中

所以在了解了一些gdi画图之后结合网上的代码写了例如以下的函数,仅仅需调用就能够将OpenCV的图片显示在上面了(仅仅支持三通道不支持单通道),初步測试效率跟原来两个文件差点儿相同。...配置好 OpenCV 后,在文件头部加入例如以下一行代码: #define WIDTHBYTES(bits) (((bits)+31)/32*4)//用于使图像宽度所占字节数为4byte的倍数...对于上面的那份代码,是能够适用于普通情况的画图工作的。然而假设须要进一步优化性能还是大有可为的,比方将程序拆分成“初始化”,“主体部分”,“内存释放”三个部分。...便不用每次显示图片都进行初始化和内存释放,会进一步的提高程序的效率。以下将改动版本号的代码也放上来。...參数一为 OpenCV的图像数据结构类,參数二为控件id void drawpic(IplImage* img);//画图到MFC的 Picture Control 控件相关函数,參数一为 OpenCV

50420

Mat对象与它各种用法

Mat对象起源: 当OpenCV 1.0发布时候没有Mat对象,是个C语言风格的数据结构IPlImage来表示内存中图像对象,但是OpenCV开发者在做复杂图像处理算法分析与计算时候,创建了很多IplImage...Intel发现自己做的库居然这么渣,广大群众不满意,决定从OpenCV 2.0开始使用一个新的内存对象Mat来表示内存中的图像对象。...它是C++风格的数据结构,自动实现内存分配与回收,这样OpenCV开发者就再也不用担心因为使用OpenCV的图像对象数据结构而导致内存泄漏问题了。...Mat对象构造函数 自从OpenCV2.0引入Mat对象之后,在通过imread函数读入一张图像的时候开发者无需先分配内存然后使用完之后释放它,因为OpenCV框架会帮你完成这些事情,自动管理Mat相关的内存...Mat作为OpenCV 2.0之后推出新图像内存对象数据结构,是每个学习OpenCV的开发者都必须熟知与掌握的基本API知识点。

1.6K81

OpenCV 学习日记(二)---牛刀小试:输入输出图像和视频

于 2016/6/15 Visual studio2010 + openCV 2.4.9 这一部分主要是举了几个简单的例子,以便大家对openCV有个初步的了解。...声明一下,这几个例子,包括以后举得一些例子及其程序代码都是来自于: 清华大学出版社的《学习openCV》,Gary Bradski & Adrian Kaehler 著,于仕琪 刘瑞祯 译。...上面几行程序其实是openCV1.x里面的了,时C语言的接口,一般在OpenCV2.x以上版本,都是下面这么显示图像,方便快捷, #include #include<opencv2...常用的基于C接口的OpenCV1.x的六个函数(I/O)  1. 图像载入函数 函数cvLoadImage载入指定图像文件,并返回指向该文件的IplImage指针。...图像销毁函数 函数cvReleaseImage 销毁已定义的IplImage指针变量,释放占用内存空间。

83200

【从零学习OpenCV 4】Mat类介绍

其实在最早的OpenCV 1.0版本中,图像使用名为IplImage的C语言结构体进行存储的,所以在很多比较老的OpenCV版本教程中常会看到其身影。...但是使用IplImage类型存在需要用户手动释放内存的缺点,如果程序结束后存在没有释放内存IplImage变量,就会造成内存泄漏的问题。...值得庆幸的是,随着OpenCV版本的更新,OpenCV引入C++接口,提供Mat类用于存储数据,利用自动内存管理技术很好的解决了内存自动释放的问题,当变量不再需要时立即释放内存。...为了解决这个问题,在OpenCV中复制和传递图像时,只是复制了矩阵头和指向存储数据的指针,因此在创建Mat类时可以先创建矩阵头后赋值数据,其方法如代码清单2-1所示。...我们可以通过代码清单2-3的方式创建一个声明通道数和数据类型的Mat类: 代码清单2-3 通过OpenCV数据类型创建Mat类 cv::Mat a(640,480,CV_8UC3) //创建一个640*

97920

Android将camera获取到的YuvData在jni中转化为Mat方法

很多时候我们将得到的yuv数据直接传入jni中的c++使用,减少上层转化图像格式的过程yuv420本身属于单通道图像,若图像处理中只需要获取灰度图像,可以在c++中直接通过Mat构造函数构造生成灰度图像,代码如下...<opencv2/imgproc/imgproc_c.h #include <opencv2/opencv.hpp using namespace std; using namespace...srcImg = mGray; IplImage CannyImg = *mCanny; IplImage ResultImg = mResult; cvCanny(&srcImg, &CannyImg...对于一个YUV420在内存中存放的大小: Y = width*height U = Y/4 v = Y/4 所以获取灰度图只需要Y的数据大小就可以,所以构造函数中宽高都是图像的宽高,而要获取YUV彩色图像则需要获取的内存长度为...构造函数中图像高度需再加上1/2*height,代码如下: JNIEXPORT int JNICALL Java_com_ProjectName_nativecaller_ClassName_readYUV420SP

87530
领券