OpenCV中IplImage与Mat代码风格比较
2016-04-16 17:08
337 查看
最近在做《图像处理》的关于图像去雾的作业,使用了暗通道先验的方法,参看代码如下文:
http://blog.sina.com.cn/s/blog_4d8730df0100m8lz.html
但是,代码的风格是OpenCV1.0时代的C语言的风格,使用的是IplImage结构以及围绕它的一系列函数。而本人比较熟悉的是与Matlab风格比较接近的OpenCV2.0时代的Mat类以及围绕它的一系列函数。
所以,我决定将上文的代码转换为Mat风格的代码。
在此之前,我先了解了了IplImage、Mat、CvMat的使用以及它们之间的一些转换。
三者的概念可以参考下面的链接:
http://www.cnblogs.com/summerRQ/articles/2406109.html
Mat类型侧重于计算,而IplImage和CvMat更侧重于“图像”。IplImage和CvMat的关系有点类似于面向对象中的继承关系,而在CvMat上面还有一个更加抽象的基类——CvArr,它在源代码中比较常见。而现在,Mat被越来越广泛地采纳。
这样一来,就涉及到了上面三个东西的转换问题,可以参考下面的文章:
/article/5981500.html
但是,在比较高的OpenCV版本中(我用的是3.1的),似乎上文中的从IplImage到Mat的转换出错了,所以我又找到了下面的文章,用下面这种方法即可实现:
http://blog.sina.com.cn/s/blog_500bd63c0102vsf5.html
上面是做了一些前期的了解,接着就是对代码的改造:
在改造的过程中,我发现在下面的这些地方,C风格的与C++风格的OpenCV都有一些差别:
1、彩色图像三通道的分离;
OpenCV1.0风格:
其中,前四个变量都是IplImage*类型的。作用是:将src的BGR三个通道分离。
OpenCV2.0风格:
其中,src为Mat类型,dst为向量vector<cv::Mat>dst(src.channels());
2、定义感兴趣区域ROI;
OpenCV1.0风格:
其中,dst1和imgroi1都是IplImage*类型的,ROI_rect是CvRect类型的,作用就是将图片dst1上面的感兴趣区域ROI_rect复制到imgroi1上面。
OpenCV2.0风格:
其中,dst[0]表示上面说到的vector
dst的第一个元素,ROI_rect为Rect类型(与CvRect相同),imgROI1是Mat类型的。实现的效果是:将vector
dst的第一个元素的感兴趣区域ROI_rect复制到imgROI1上。
3、定义Mat,IplImage以及Rect时候的宽度和高度的顺序,这一点可以查看另外一篇文章:
/article/8049780.html
4、在C风格的代码中函数或者数据类型前两个字母可能是“cv”,而在C++风格的函数中去除了"cv"。
5、除了上面这些差别之外,在图片的读入,显示,保存以及求最大最小值等方面的函数都有所不同,这些百度一下都可以找到,就不再赘述。
如果有需要详细对比两种风格的朋友,可以查看下面两个链接进行进一步对比:
OpenCV1.0风格:
http://blog.sina.com.cn/s/blog_4d8730df0100m8lz.html
OpenCV2.0风格:
/article/8049779.html
http://blog.sina.com.cn/s/blog_4d8730df0100m8lz.html
但是,代码的风格是OpenCV1.0时代的C语言的风格,使用的是IplImage结构以及围绕它的一系列函数。而本人比较熟悉的是与Matlab风格比较接近的OpenCV2.0时代的Mat类以及围绕它的一系列函数。
所以,我决定将上文的代码转换为Mat风格的代码。
在此之前,我先了解了了IplImage、Mat、CvMat的使用以及它们之间的一些转换。
三者的概念可以参考下面的链接:
http://www.cnblogs.com/summerRQ/articles/2406109.html
Mat类型侧重于计算,而IplImage和CvMat更侧重于“图像”。IplImage和CvMat的关系有点类似于面向对象中的继承关系,而在CvMat上面还有一个更加抽象的基类——CvArr,它在源代码中比较常见。而现在,Mat被越来越广泛地采纳。
这样一来,就涉及到了上面三个东西的转换问题,可以参考下面的文章:
/article/5981500.html
但是,在比较高的OpenCV版本中(我用的是3.1的),似乎上文中的从IplImage到Mat的转换出错了,所以我又找到了下面的文章,用下面这种方法即可实现:
http://blog.sina.com.cn/s/blog_500bd63c0102vsf5.html
上面是做了一些前期的了解,接着就是对代码的改造:
在改造的过程中,我发现在下面的这些地方,C风格的与C++风格的OpenCV都有一些差别:
1、彩色图像三通道的分离;
OpenCV1.0风格:
其中,前四个变量都是IplImage*类型的。作用是:将src的BGR三个通道分离。
OpenCV2.0风格:
其中,src为Mat类型,dst为向量vector<cv::Mat>dst(src.channels());
2、定义感兴趣区域ROI;
OpenCV1.0风格:
其中,dst1和imgroi1都是IplImage*类型的,ROI_rect是CvRect类型的,作用就是将图片dst1上面的感兴趣区域ROI_rect复制到imgroi1上面。
OpenCV2.0风格:
其中,dst[0]表示上面说到的vector
dst的第一个元素,ROI_rect为Rect类型(与CvRect相同),imgROI1是Mat类型的。实现的效果是:将vector
dst的第一个元素的感兴趣区域ROI_rect复制到imgROI1上。
3、定义Mat,IplImage以及Rect时候的宽度和高度的顺序,这一点可以查看另外一篇文章:
/article/8049780.html
4、在C风格的代码中函数或者数据类型前两个字母可能是“cv”,而在C++风格的函数中去除了"cv"。
5、除了上面这些差别之外,在图片的读入,显示,保存以及求最大最小值等方面的函数都有所不同,这些百度一下都可以找到,就不再赘述。
如果有需要详细对比两种风格的朋友,可以查看下面两个链接进行进一步对比:
OpenCV1.0风格:
http://blog.sina.com.cn/s/blog_4d8730df0100m8lz.html
OpenCV2.0风格:
/article/8049779.html
相关文章推荐
- 适配器模式的分析、结构图及基本代码
- c++的多态
- Teleport Ultra/Teleport Pro的冗余代码批量清理方法
- 【QT】:QT中的单选框和复选框的使用
- Spring MVC @Transactional注解方式事务失效的解决办法
- (有意思的东西)python面向对象----->类与实例强势解读
- C++函数指针
- PHP多维数组和日期时间函数
- Java 多态运行顺序&&多态上转型对象
- 汉诺塔——递归的应用
- Java学习(二)
- SpringMVC拦截器(资源和权限管理)
- [Spring]Annotation-based container configuration_AnotationBasis_01
- SpringMVC中使用Interceptor拦截器
- struts2中OGNL详解
- 据廖雪峰python3教程----python学习第十三天
- Spring与Struts2整合的执行原理.
- spring入门
- eclipse导入工程中文乱码问题
- Ubuntu 14.04 安装jdk