最近接触图像处理的项目,花了一周时间把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
原文:https://blog.csdn.net/yiyongzhifu/article/details/60571364
参考:https://blog.csdn.net/lang523493505/article/details/85272672