注:博客中有些圖片部分爲了省事,借用了別人博客的圖片,相關部分注意事項相同。若有侵權,請聯繫刪除!
一,Opencv3.2移植到arm
Opencv3.2
ubuntu16.04
目標板:飛凌嵌入式iMx6-ul
前一:把opencv源碼,/modules/highgui/src/windows.cpp 文件第583行和654行註釋掉!!!非常重要!!!
583 行: CV_NO_GUI_ERROR("cvshowImage")
654行:CV_NO_GUI_ERROR("cvWaitKey")
不然程序運行時會提示如下讓先安裝gtk+2.x之類的錯誤。應該是沒有顯示屏顯示的原因。
“OpenCV Error: Unspecified error (The function is not implemented. Rebuild the library with Windows, GTK+ 2.x or Carbon support. If you are on Ubuntu or Debian, install libgtk2.0-dev and pkg-config, then re-run cmake or configure script) in cvNamedWindow”
1,配置交叉編譯環境,見imx6-ul軟件手冊
2,在源碼目錄下打開終端 /cmake-gui // 啓動cmake
在cmake界面中進行配置
第一步:
第二步:
第三步:
1),下圖爲網上流傳非常廣泛的配置方法:在這個配置中填寫的目標系統的名稱會導致opencv庫中V4L無法使用(因爲在本次工程中沒有使用opencv的V4L驅動庫,可以忽略),應該爲“Linux”
2),注意編譯器的選擇爲交叉編譯器,與下圖中的區別。
3),target root 注意事項與下圖相同
第四步:
1),建議使用靜態庫編譯,選擇動態庫編譯需要把動態庫拷貝到arm板中,比較麻煩。
第五步:
4.按照上述配置完成後,進入編譯文件目錄(進入自己配置的目錄)
然後執行 make 進行編譯
鑑於網上的參考教程,大多數人這裏會報錯,這裏將錯誤總結如下:
(1)報錯:
Linking CXX executable ../../bin/opencv_test_calib3d
../../lib/libopencv_core.so: undefined reference to`pthread_key_create'
../../lib/libopencv_core.so: undefined reference to`pthread_getspecific'
....................
collect2: ld returned 1 exit status
make[2]: *** [bin/opencv_test_calib3d] Error 1
make[1]: ***[modules/calib3d/CMakeFiles/opencv_test_calib3d.dir/all] Error 2
make: *** [all] Error 2
或者
報錯:undefined reference to “dlopen”
undefined reference to “dlysm”
解決方案:修改上圖中“編譯文件目錄”目錄下的CMakeCache.txt,CMAKE_EXE_LINKER_FLAGS原來爲空,保險起見,加上-lpthread -lrt -ldl,如下圖:
5.報錯按照上述方法解決,再make後,執行sudo make install ,此時編譯好的庫就按照在你指定的目錄下了.
NOTE: 如果sudo make install 出現 Cmakeerror at apps/annotation/cmake_install.cmake:42(FILE):之類的錯誤,直接打開文文件 apps/annotation/cmake_install.cmake把42行註釋掉。
(一共有3個類似錯誤,對應三個文件,我這是都在第42行,都註釋掉)
6.進入上述的安裝庫,若沒有取消BUILD_SHARED_LI選項,則生產的是.so後綴的庫文件,將這些庫文件拷貝到板子的/lib目錄下。
二,工程代碼編譯
7.在Ubuntu上編譯的時候,建議使用CMakeList.txt 通過cmake編譯
因爲需要交叉編譯,配置方法如下:
配置完makefile之後,直接make生成可執行文件,如果opencv爲靜態庫,可執行文件拷貝至板子中即可運行。
8.CMakeLists.txt編譯方式;
1), Linux下undefined reference to ‘pthread_create’’pthread _join’問題
在自己的工程目錄下的CMakeCache.txt,CMAKE_EXE_LINKER_FLAGS,加上-lpthread -lrt –ldl。
9,若電腦中裝有多個版本的opencv,使用指定的OPENCV版本
在CMakeLists.txt文件中設置opencv文件夾路徑
在cmake-gui中指定路徑