OpenCV在IMX6上的移植
最近接觸影象處理的專案,花了一週時間把OpenCV的移植搞定,現記錄下自己的安裝過程、出現的錯誤和解決辦法。
環境:ubuntu10.0.4+ eclipse luna + OpenCV2.4.13
1 依賴庫的安裝
首先安裝可能使用到的環境,安裝命令如下:
sudo apt-get install build-essential
sudo apt-get install cmake git libgtk2.0-dev pkg-config libavcodec-dev libavformat-dev libswscale-dev
sudo apt-get install python-dev python-numpy libtbb2 libtbb-dev libjpeg-dev libpng-dev libtiff-dev libjasper-dev libdc1394-22-dev
安裝ffmpeg:
sudo add-apt-repository ppa:kirillshkrogalev/ffmpeg-next
sudo apt-get update
sudo apt-get install ffmpeg
安裝之後,檢視:
ffmpeg -v
出來很多資訊,是安裝成功了(不成功會出現not
found)。這裡使用cmake來對opencv進行編譯,因此先檢查cmake、cmake-gui是否安裝。
cmake -version
如果已安裝,跳過;若沒有,執行以下命令:
sudo apt-get install cmake
檢查cmake-gui是否安裝:
cmake-gui -version
安裝命令:sudo apt-get install cmake-qt-gui
2 OpenCV安裝
將OpenCV安裝包解壓到固定資料夾(opencv版本2.4.13,),進入OpenCV資料夾,執行cmake-gui命令:
sudo cmake-gui
選擇原始碼目錄和build生成的目錄
選擇需要使用的選項,BUILD_JPEG 、BUILD_PNG,
更改生成安裝目錄,
點選Configure
點選Generate
然後進入剛才選擇的build目錄,執行安裝命令:
sudo make
sudo make install
即可完成opencv的安裝。
安裝中出現的錯誤見:
3 eclipse中配置 OpenCV
然後到eclipse的配置,開啟eclipse,新建一個C++工程
右鍵屬性,修改兩個地方
1、編譯時標頭檔案的地址
連結時庫的地址(庫可以根據用到而新增,不一定要全部加進去,可以加的庫在安裝目錄的lib資料夾裡面)
庫檔案目錄根據自己的安裝位置輸入,找到庫檔案後再確認目錄:
然後,寫入示例程式
#include<core.hpp>
#include<highgui.hpp>
#include<imgproc.hpp>
using namespace cv;
int main(void)
{
Mat pic;
pic=imread("test.jpg");
if(pic.empty())return -1;
imshow("pic",pic);
waitKey(0);
return 0;
}
編譯,應該能成功,點執行,應該不行,因為還沒配置opencv的執行環境,這裡編譯全都用絕對地址去找,編譯和連結應該是沒問題的,但是執行的時候會找不到庫,這個時候配置opencv環境。
Sudo gedit /etc/ld.so.conf.d/opencv.conf
在空白的檔案中加上鍊接庫的地址,本文中的環境:
/usr/local/opencv/lib
使改動生效,輸入命令:
sudo ldconfig
然後修改另一個檔案,Sudo gedit /etc/bash.bashrc
在結尾處新增如下內容:
PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/usr/local/opencv/lib/pkgconfig
Export PKG_CONFIG_PATH
路徑地址根據根據安裝地址改變,儲存關閉,將圖片放到工程目錄下點執行,程式就執行起來。
4、嵌入式OpenCV移植
類似上一章節教程,進入opencv原始碼資料夾,使用cmake-gui命令,選擇源和編譯後放的地方:
點Configture,選擇第四個,Next
Operating System填arm-linux,C和C++工具選擇安裝的交叉編譯,用絕對地址,Target Root選工具的地址,Finish
選上BUILD_JPEG和BUILD_PNG,修改安裝地址(同上節)。
修改CMakeCache.txt檔案:
cd opencv-arm/
sudo gedit CMakeCache.txt
大約200行,找到CMAKE_EXE_LINKER_FLAGS:STRING=' '
改為
CMAKE_EXE_LINKER_FLAGS:STRING='-lpthread -lrt -ldl'
回到opencv-arm目錄
sudo make
sudo make install
完成安裝,make過程中可能出現的錯誤:
1、
/usr/local/gcc-linaro-arm-linux-gnueabihf-4.7-2013.04-20130415_linux/bin/../lib/gcc/arm-linux-gnueabihf/4.7.3/../../../../arm-linux-gnueabihf/bin/ld: ../../3rdparty/lib/libzlib.a(crc32.obj): relocation R_ARM_THM_MOVW_ABS_NC against `a local symbol' can not be used when making a shared object; recompile with -fPIC
../../3rdparty/lib/libzlib.a: could not read symbols: Bad value
collect2: error: ld returned 1 exit status
modules/core/CMakeFiles/opencv_core.dir/build.make:586: recipe for target 'lib/libopencv_core.so' failed
make[2]: *** [lib/libopencv_core.so] Error 1
CMakeFiles/Makefile2:460: recipe for target 'modules/core/CMakeFiles/opencv_core.dir/all' failed
make[1]: *** [modules/core/CMakeFiles/opencv_core.dir/all] Error 2
Makefile:116: recipe for target 'all' failed
make: *** [all] Error 2
解決辦法:將3rdparty/zlib/CMakeFiles/zlib.dir/flags.make內的C_FLAGS = -W -Wall 為 C_FLAGS = -fPIC -W -Wall,同時將所有類似路徑下(3rdparty/***/CMakeFiles/***.dir/flags.make)的flag.make檔案內的C_FLAGS全部改過來。
2
Linking CXX static library ../../lib/libopencv_haartraining_engine.a
[ 80%] Built target opencv_haartraining_engine
Scanning dependencies of target opencv_createsamples
[ 80%] Building CXX object modules/haartraining/CMakeFiles/opencv_createsamples.dir/createsamples.o
Linking CXX executable ../../bin/opencv_createsamples
../../lib/libopencv_highgui.so.2.2.0: undefined reference to `cvCreateCameraCapture_V4L(int)'
collect2: ld returned 1 exit status
make[2]: *** [bin/opencv_createsamples] Error 1
make[1]: *** [modules/haartraining/CMakeFiles/opencv_createsamples.dir/all] Error 2
make: *** [all] Error 2
解決辦法:將opencv版本從3.2.0換成了,2.4.13就OK啦,沒太深究其中原因。eclipse配置OpenCV,使用交叉編譯工具
安裝成功後要配置eclipse,設定編譯工具和opencv標頭檔案地址:
選擇檢查編譯工具:
選擇include路徑:
新增庫檔案及路徑:
設定好後編輯程式碼,然後編譯
#include <iostream>
using namespace std;
#include <cv.h>
#include <cxcore.h>
#include <highgui.h>
#include <core_c.h>
//#include <opencv2\opencv.hpp>
using namespace cv;
int main() {
Mat pic;
pic = imread("test.jpg");
if(pic.empty())return -1;
Mat gray_image;
cvtColor(pic,gray_image,CV_BGR2GRAY);
imwrite("gray.jpg",gray_image);
return 0;
}
編譯中可能出現的錯誤:
1找不到cv.h
解決辦法:包含路徑不對,重新檢查。
2.找不到core_c.h
解決辦法:將所有庫檔案複製交叉編譯工具鏈下的lib資料夾下(問題可以解決,不明白為什麼)
3.執行時,識別不到opencv的庫檔案
解決辦法:更新交叉編譯工具鏈,或者降低opencv的版本。本文使用後者,將opencv3.0.0版本換成2.4.13後有效。
imx6上執行
編譯成功後,生成arm可執行的檔案。然後將/usr/local/arm/opencv/lib中的庫檔案複製到開發板中的/lib資料夾,將生成的可執行檔案複製與圖片到arm板統一目錄下,給予可執行許可權,即可執行。因為使用的嵌入式板子不帶螢幕,因此使用的是將一個彩色圖片轉換成灰度影象程式,程式執行後複製到虛擬機器檢視,如下圖。
過程可能出現位置錯誤,耐心尋找原因,不著急就能解決,祝看到這篇文章的人好運。
參考:http://blog.csdn.net/u012354697/article/details/50670715
http://blog.csdn.net/zdyueguanyun/article/details/51322295