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生成的目录

扫描二维码关注公众号,回复: 4949738 查看本文章

选择需要使用的选项,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


原文:https://blog.csdn.net/yiyongzhifu/article/details/60571364 
 

猜你喜欢

转载自blog.csdn.net/WXXGoodJob/article/details/86508096