轉載地址:http://mkhgg.blog.51cto.com/1741572/363489
OpenCV的移植
開源的計算機視覺類庫OpenCV( IntelÒ Open Source Computer Vision Library)由英特爾公司位於俄羅斯的研究實驗室所開發,它是一套可免費獲得的由一些C 函數和C ++ 類所組成的庫,用來實現一些常用的圖像處理及計算機視覺算法]。由於OpenCV 的源代碼是完全開放的,而且源代碼的編寫簡潔而又高效,特別是其中大部分的函數都已經過彙編最優化,以使之能高效而充分地利用Intel系列處理芯片的設計體系,OpenCV
的代碼執行效率是非常高的,所以近年來在國外的圖像處理相關領域中被廣泛地使用,成爲一種流行的圖像處理軟件。
2.1.1 OpenCV 的特點
相對於其它常用的圖像處理軟件來說,OpenCV有其顯著的不可比擬的優點,主要體現在如下幾個方面[1]:
(1)OpenCV是一個包含了超過300 個C 函數的應用編程接口,它不依賴於外部庫,既可以獨立運行,也可在運行時使用其它外部庫。
(2)高性能:OpenCV 中所有的算法都是基於封裝於IPL 的具有很高靈活性的動態數據結構,而且其中有一半以上的函數在設計及彙編時被Intel 公司針對其所生產的處理器進行了優化。
(3)開放性:不管對於商業的還是非商業的用途,OpenCV都是完全免費的,其源代碼完全開放,開發者可以對源代碼進行修改,將自己設計的新類添加到庫中,只要設計符合規範,自己的代碼也可以被別人廣泛使用。
(4)可移植性:由於OpenCV的大部分庫函數基本上採用C或C++語言編寫,因此可以方便地移植到其它如ARM、MPIS等嵌入式微處理器中。
2.1.2 OpenCV 的函數體系
OpenCV 中每個函數的命名都以“cv”開始,然後是該函數的行爲及目標。例如用來創建圖像的函數“cvCreateImage”,載入圖像的函數“cvLoadImage”。OpenCV是爲圖像處理及計算機視覺在實際工程中的應用而設計的一個類庫,其中所有的函數都由於其在實際應用中所實現的不同的功能而分屬不同的類型,主要的函數類型有:
(1)基本的圖像處理與分析函數:這個類型的函數主要用於實現一些基本的圖像處理與分析功能,例如圖像平滑函數cvSmooth,Sobel 算子cvSobel,Canny 邊緣分割函數cvCanny 等。
(2)結構分析函數:包括有輪廓處理函數,幾何學函數以及平面細分函數。
(3)運動分析與目標跟蹤函數:包括有用於運動分析與目標跟蹤的函數,例如背景重建函數cvAcc,用光流法或動態輪廓模型來實現目標跟蹤的函數cvCalcOpticalFlowBM 和cvSnakeImage 以及卡爾曼濾波函數CvKalman等。
(4)攝像機標定和3D 重建函數:包括有用於攝像機標定,姿態估計以及從兩個攝像機進行3D 相似重構的函數。
(5)GUI 與視頻處理函數:包括有高級圖形用戶接口highGUI 用以實現對圖像的載入、顯示及保存等基本操作以及用以實現視頻輸入輸出及處理的函數。
根據上述的函數體系,程序開發者可以根據自己所開發應用程序所要實現的功能來方便地選擇所需的庫函數,從而大大減少開發時間和精力,縮短程序開發的週期。
2.1.3 OpenCV移植
OpenCV提供了基於MS-Windows和基於Linux操作系統的源代碼,但這些源碼主要都針對PC機平臺,對於ARM開發平臺,OpenCV並沒有作具體的移植介紹,然而如果在嵌入式ARM平臺上利用OpenCV進行應用開發,則必須對OpenCV進行交叉編譯和移植。
我們在交叉編譯支持嵌入式ARM的OpenCV函數庫的過程中發現只有在編譯OpenCV的級圖形用戶接口highGUI目錄的內容時出現系統找不到gtk+-2.0和gdk-pixbuf-2.0的pkg-config腳本錯誤,通過對OpenCV的源碼和configure配置文件進行分析,發現OpenCV源碼中除了highGUI庫中的cvShowImage函數用到了GTK+-2.0中相關內容,該函數主要完成將圖像顯示在GTK+窗體上,而configure配置文件中因找不到GTK和GDK的包配置文件pkg-config的相關內容便將GTK相關配置選項進行了屏蔽,所以進行交叉編譯時無法通過。實際上在嵌入式Qt開發平臺中,基本上不用GTK中的相關內容,所以可將configure配置文件中檢測GTK和GDK的部分註釋掉,然後再進行交叉編譯便可生成支持嵌入式ARM微處理器的OpenCV動態庫,具體移植和編譯步驟:
(1)、配置文件的修改:
將configure文件下列內容註釋掉,只保留GTK_CFLAGS=""、GTK_LIBS=""、have_gtk=no三項內容(如下黑體所示);
# if test "$PKG_CONFIG" = "no" ; then
# echo "*** The pkg-config script could not be found. Make sure it is"
# echo "*** in your path, or set the PKG_CONFIG environment variable"
# echo "*** to the full path to pkg-config."
# else
# PKG_CONFIG_MIN_VERSION=0.9.0
# if $PKG_CONFIG --atleast-pkgconfig-version $PKG_CONFIG_MIN_VERSION; then
# echo "$as_me:$LINENO: checking for \"gtk+-2.0 gdk-pixbuf-2.0\"" >&5
echo $ECHO_N "checking for \"gtk+-2.0 gdk-pixbuf-2.0\"... $ECHO_C" >&6
# if $PKG_CONFIG --exists ""gtk+-2.0 gdk-pixbuf-2.0"" ; then
# echo "$as_me:$LINENO: result: yes" >&5
#echo "${ECHO_T}yes" >&6
# succeeded=yes
# echo "$as_me:$LINENO: checking GTK_CFLAGS" >&5
#echo $ECHO_N "checking GTK_CFLAGS... $ECHO_C" >&6
# GTK_CFLAGS=`$PKG_CONFIG --cflags ""gtk+-2.0 gdk-pixbuf-2.0""`
# echo "$as_me:$LINENO: result: $GTK_CFLAGS" >&5
#echo "${ECHO_T}$GTK_CFLAGS" >&6
#
# echo "$as_me:$LINENO: checking GTK_LIBS" >&5
#echo $ECHO_N "checking GTK_LIBS... $ECHO_C" >&6
# GTK_LIBS=`$PKG_CONFIG --libs ""gtk+-2.0 gdk-pixbuf-2.0""`
# echo "$as_me:$LINENO: result: $GTK_LIBS" >&5
#echo "${ECHO_T}$GTK_LIBS" >&6
# else
GTK_CFLAGS=""
GTK_LIBS=""
## If we have a custom action on failure, don't print errors, but
## do set a variable so people can do so.
# GTK_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors ""gtk+-2.0 gdk-pixbuf-2.0""`
# fi
# else
# echo "*** Your version of pkg-config is too old. You need version #$PKG_CONFIG_MIN_VERSION or newer."
# fi
# fi
# if test $succeeded = yes; then
# have_gtk=yes
#cat >>confdefs.h <<\_ACEOF
##define HAVE_GTK
#_ACEOF
# else
have_gtk=no
# fi
(2)、交叉編譯
執行make install命令後,OpenCV將編譯好的的庫文件保存在/usr/local/lib目錄下。主要的庫文件:libhighgui.so.0.9.9、libhighgui.la、libcxcore.so.0.9.9、libcxcore.la、libcvaux.so.0.9.9、libcvaux.la、libcv.so.0.9.9、libcv.la及相應的符號鏈接
(3)、環境境參數設置
將編譯好的庫文件和相應的符號鏈接下載到ARM開發平臺上/usr/qpe/lib目錄中,並利用export設置OpenCV工作時所需的環境參數LD_LIBRARY_PATH。