1. 程式人生 > >OpenCV在IMX6上的移植

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 Systemarm-linuxCC++工具選擇安裝的交叉編譯,用絕對地址,Target Root選工具的地址,Finish

選上BUILD_JPEGBUILD_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