OpenCV中IplImage與Mat代碼風格比較

最近在做《圖像處理》的關於圖像去霧的作業,使用了暗通道先驗的方法,參看代碼如下文:

http://blog.sina.com.cn/s/blog_4d8730df0100m8lz.html

但是,代碼的風格是OpenCV1.0時代的C語言的風格,使用的是IplImage結構以及圍繞它的一系列函數。而本人比較熟悉的是與Matlab風格比較接近的OpenCV2.0時代的Mat類以及圍繞它的一系列函數。

所以,我決定將上文的代碼轉換爲Mat風格的代碼。

在此之前,我先了解了了IplImageMatCvMat的使用以及它們之間的一些轉換。

三者的概念可以參考下面的鏈接:

http://www.cnblogs.com/summerRQ/articles/2406109.html

Mat類型側重於計算,而IplImageCvMat更側重於圖像IplImageCvMat的關係有點類似於面向對象中的繼承關係,而在CvMat上面還有一個更加抽象的基類——CvArr,它在源代碼中比較常見。而現在,Mat被越來越廣泛地採納。

這樣一來,就涉及到了上面三個東西的轉換問題,可以參考下面的文章:

http://www.cnblogs.com/zcftech/archive/2013/04/10/3013027.html

但是,在比較高的OpenCV版本中(我用的是3.1的),似乎上文中的從IplImageMat的轉換出錯了,所以我又找到了下面的文章,用下面這種方法即可實現:

http://blog.sina.com.cn/s/blog_500bd63c0102vsf5.html



上面是做了一些前期的瞭解,接着就是對代碼的改造:

在改造的過程中,我發現在下面的這些地方,C風格的與C++風格的OpenCV都有一些差別:

1、彩色圖像三通道的分離;

OpenCV1.0風格:


其中,前四個變量都是IplImage*類型的。作用是:將srcBGR三個通道分離。

OpenCV2.0風格:


其中,srcMat類型,dst爲向量vector<cv::Mat>dst(src.channels());

2、定義感興趣區域ROI

OpenCV1.0風格:


其中,dst1imgroi1都是IplImage*類型的,ROI_rectCvRect類型的,作用就是將圖片dst1上面的感興趣區域ROI_rect複製到imgroi1上面。

OpenCV2.0風格:


其中,dst[0]表示上面說到的vector dst的第一個元素,ROI_rectRect類型(與CvRect相同),imgROI1Mat類型的。實現的效果是:將vector dst的第一個元素的感興趣區域ROI_rect複製到imgROI1上。

3、定義MatIplImage以及Rect時候的寬度和高度的順序,這一點可以查看另外一篇文章:

http://blog.csdn.net/qq295456059/article/details/51168868

4、在C風格的代碼中函數或者數據類型前兩個字母可能是“cv”,而在C++風格的函數中去除了"cv"

5、除了上面這些差別之外,在圖片的讀入,顯示,保存以及求最大最小值等方面的函數都有所不同,這些百度一下都可以找到,就不再贅述。

如果有需要詳細對比兩種風格的朋友,可以查看下面兩個鏈接進行進一步對比:

OpenCV1.0風格:

http://blog.sina.com.cn/s/blog_4d8730df0100m8lz.html

OpenCV2.0風格:

http://blog.csdn.net/qq295456059/article/details/51168500





發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章