OPENCV3帶來的改變

2009年10月1日,OpenCV2.0發佈,這標誌着革命性的OpenCV2時代的來臨。OpenCV2帶來了全新的C++接口,將OpenCV的能力無限放大。在2.0的時代,OpenCV增加了新的平臺支持,包括iOS和Android,通過CUDA和OpenCL實現了GPU加速,爲Python和Java用戶提供了接口,基於Github和Buildbot構建了充滿藝術感的持續集成系統,所以纔有了被全世界的很多公司和學校採用的穩定易用的OpenCV 2.4.x。

  1. 項目架構的改變
    OpenCV是一個相對於整體的項目,各個模塊都是以整體的形式構建然後組合在一起的。然而,隨着功能的增加,OpenCV主體集成了各種各樣的功能模塊,變得越來越臃腫。

    而3.0的出現,就是爲了給日益發福的OpenCV減肥,因爲OpenCV3決定像其他大項目一樣,拋棄整體架構,使用內核十插件的架構形式。

    在GitHub中,除了存放着正式版OpenCV的主倉庫和新增加的“opencv_extra”倉庫以外,OpenCV3.0中還添加了一個名opencv_contrib的全新倉庫,這個新倉庫中有很多讓人興奮的功能:包括臉部識別和文本探測,以及文本識別、新的邊緣檢測器、充滿藝術感的圖像修復、深度地圖處理、新的光流和追蹤算法等。

    opencv的主倉庫地址:https://github.com/itseez/opencv
    opencv_extra倉庫地址:https://github.com/itseez/opencv_extra
    opencv_contrib倉庫地址: http://github.com/itseez/opencv_contrib

    正式版opencv與opencv-contrib之間的區別如下:

    • 兩者都由OpenCV官方開發團隊持續集成系統維護,雖然目前opencv_contrib倉庫中的代碼測試並沒有完成,很多功能不穩定。
    • 主體的opencv在GitHub中由ltseez提供,其有着非常穩定的API以及少部分的創新。
    • opencv-contnb倉庫是大多數實驗性代碼放置的地方,一些API可能會有改變,一直會歡迎廣大開發者們貢獻新的精彩算法。
    • opencv_contrib中的這些額外模塊可以在CMake中用OPENCVEXTRA_MODULESPATH=/moduIes傳遞給CMake文件,和OpenCV3主體中的代碼一起編譯和運行。
    • opencv_contrib的文檔是自動生成的,可以在http://docs.opencv.org/master/中找到,並會在隨後的版本中更加完善。
  2. 將OpenCV2代碼升級到0penCV3報錯時的一些策略由於OpenCV3的主體部分只是在OpenCV2的基礎上進行小幅度的史改,所以我們會發現不少OpenCV2下廾發的程序仍然可以在OpenCV3中正常編譯運行。
    然而,有一些版本升級導致的改變則會讓我們在OpenCV2下開發的程序在OpenCV3中報錯。
    1.〖問題一〗由於宏名稱的變更照成的“未聲明的標識符”系列問題

    有時候,遇到此類問題加入句"#include<cv.h>”便可以讓OpenCV3也能認識一些"CV”前綴的宏,將問題解決掉。因爲有不少OpenCVI的宏依然在OpenCV3的cv.h頭文件中有定義。

    症狀:在OpenCV3的環境下運行OpenCV2中寫的程序報"enorC2065:'CV_WINDOWAUTOSIZE,:未聲明的標識符”系列錯誤。
    分析:OpenCV3取消了OpenCV丨中殘留的"CV_”式的宏前綴命名規範,對這些cv一前綴的宏使用了新的命名覿範。這裏有幾種情況要分類討論。
    (1)情況1:直接去掉"CV_”前綴
    在這種情況下,比較典型的有如下一些函數。
    1)namedWindow函數中,例如將CV_WINDOW_AUTOSIZE改爲WINDOW_AUTOSIZE
    2)threshold函數中,例如將CV_THRESH_BINARY改爲THRESHBINARY
    3)line函數等一系列繪圖函數中,CV_FILLED改爲FILLED
    4)remap函數中,CV_INTER_LINEAR改爲INTER_LINEAR
    5)在鼠標操作函數SetMouseCaIIback中,將CV_EVENT_LBUITONUP改爲EVENT_LBUITONUP、CV_EVENT_LBUTTONDOWN改爲EVENT_LBUTTONDOWN、CV_EVENT_FLAG_LBUTTON改爲EVENT_FLAG_LBUITON、CV_EVENT_MOUSEMOVE改爲EVENT_MOUSEMOVE
    7)HoughCircles函數中,將CV_HOUGH_GRADIENT改成HOUGH_GRADIENT
    8)inpamt函數中,將CV_INPAINT_TELEA改爲INPAINT_TELEA、CV_INPAINT_NS寫作INPAINT_NS
    9)matchTemplate函數中,將CV_TM_SQDIFF改爲TM_SQDIFF、CV_TM_SQDIFF_NORMED改爲TM_SQDIFF_NORMED
    10)在imwrite函數相關使用中,將CV_IMWRITE_PNG_COMPRESSION改成IMWRITE_PNG_COMPRESSION
    11)設置攝像頭尺寸的時候,將CV_CAP_PROP_FRAME_WIDTH改爲CAP_PROP_FRAME_WIDTH、CV_CAP_PROP_FRAME_HEIGHT改爲CAP_PROP_FRAME_HEIGHT
    (2)情況2:需要用新的前綴替換
    在這種情況下,比較典型的有如下一些函數。
    1)line函數等一系列繪圖函數中,CV_AA改爲LINE_AA
    2)cvtCoIor函數中顏色空間轉換系的宏,全替換爲"COLOR_”前綴,如CV_BGR2HSV改爲COLOR_BGR2HSV
    3)normalize函數中,將CV_MINMAX改爲NORM_MINMAX
    4)morphologyEx函數中的宏,全部替換爲“MORPH_”前綴,如CV_MOP_OPEN改爲MORPH_OPEN
    5)threshold函數中的宏,全部替換爲"THRESH_”前綴,如將CV_THRESH_BINARY改THRESH_BINARY
    (3)情況3:需要在新的命名空間中使用宏
    在這種情況下,比較典型的有如下一些函數。
    1)TermCriteria函數中,CV_TERMCRIT_EPS改爲TermCriteria::EPS、CV_TERMCRITI_TER改爲TermCriterta::MAX_ITER
    2)CascadeClassifie::detectMultiScale函數中,CV_HAAR_SCALE_IMAGE改爲CASCADE_SCALE_IMAGE
    2.〖問題二〗使用vector容器之時提示“error C2065:“vecto產未聲明的標識符”系列錯誤
    症狀:在OpenCV3的環境下運行OpenCV2中寫的程序,使用了vector容器,而未包含STD命名空間,於是便會報"errorC2065:"vector”:未聲明的標識符“系列錯誤。
    分析:OpenCV3中並沒有在頭文件中使用標準程序庫std的命名空間。所以遇到這個錯誤,在我們寫的程序開頭加上一句“using namespace std;"使用C++的標準命名空間即可解決問題。
    上述兩個就是OpenCV2代碼升級OpenCV3時最常會遇到的問題。接下來,列舉一些OpenCV3升級時一些其他的改動細節,以結束此節。
    3.其他一些細節問題的解決方案
    1)features2d.hpp頭文件路徑的更改。將#include<opencv2/nonfree/features2d.hpp>
    改爲#include<opencv2/features2d.hpp>
    2)core.hpp頭文件路徑更改。將#include<opencv2/core/core.hpp>改爲#include
    <opencv2/core.hpp>
    3)用format進行格式化輸出時,將format(r,“python”)改成format(r,Formatter::FMT_PYTHON)
    4)定義尺寸時,將cvSize(-1,-1)改爲Size(-1,-1)
    5)在表示顏色時,將CV_RGB改爲ScaIar

    在OpenCV的官方開發網站的更新日誌頁面,可以看到歷代OpnCV官方詳細的改動日誌:http://code.opencv.org/projects/opencv/wlki/ChangeLog

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