opencv2.3.1在arm端的移植( 更新测试结果)
2012-07-10 13:48
337 查看
更新:测试结果就是,本文中使用的main.cpp这个例子,在SBC3730这块板子上运行成功!
所以我估计在omapl138上也会成功。
更新:更新了 编译命令 `pkg-config --cflags --libs opencv` 的更改以及使用方法
首先,opencv是个好东西,对于我这样的菜鸟,来说,既是好用的工具,也是最好的学习资料。
此次移植是在ubuntu12.04 32位,针对omapl138的arm端来进行的。(其实只要是arm应该都一样)
本来呢,是想移植到c6748的。但是我感觉这个对我来说难度有点大。。而网上对于移植arm的资料也很多。
所以先移植到arm再说把。
不过还是希望有高手能给我指导一下,将opencv移植至c6748该怎么做。在CCS里或者linux里都行。因为我想使用gpp+dsp模式。将算法做成包,然后跑在dsp端。
此文有一部分综合了网上多人的方法,也有自己在进行移植时的经验。
当然,移植的效果还没有给出,因为板子不在身边,无法进行测试。等有板子了,再进行测试,确定是否移植成功。
结果会在本文更新。
好。先下载opencv。
下载OpenCV 2.3.1 , http://sourceforge.net/projects/opencvlibrary/files/
然后解压
tar xvf OpenCV-2.3.1.tar.bz2
在此要说明的是,此次移植是在前面omapl138的DVSDK都安装并且配置好的情况下进行的。
我的DVSDK安装路径是/home/yr/ti-dvsdk_omapl138-evm_04_03_00_06
我使用omapl138中的交叉编译链。
即交叉编译链存在于
/home/yr/ti-dvsdk_omapl138-evm_04_03_00_06/linux-devkit/bin 这个目录中。
刚才解压了opencv,现在在你的工作目录里建立一个新的文件夹opencv_arm。名称和具体路径看个人爱好。
然后进入终端运行cmake-gui。如果以前没有安装过,终端会提示你使用apt-get命令安装。
安装好之后就可以运行了。
cmake-gui
之后出现下面的界面
选择source code目录 /home/yr/OpenCV-2.3.1
以及build目录 /home/yr/opencv_arm
点configure
然后按照下图中所选择的:
generator为Unix Makefiles,选择Specify options for cross-compiling
next之后,在下图这几个位置填写路径
Operating System填写arm-arago-linux
Compilers里,C选择 /home/yr/ti-dvsdk_omapl138-evm_04_03_00_06/linux-devkit/bin/arm-arago-linux-gnueabi-gcc
C++选择 /home/yr/ti-dvsdk_omapl138-evm_04_03_00_06/linux-devkit/bin/arm-arago-linux-gnueabi-g++
可以看出来我都是用的DVSDK中的目录。
Target Root选择 /home/yr/ti-dvsdk_omapl138-evm_04_03_00_06/linux-devkit
然后finish。
cmake便返回下图
图中红色部分是我们可以配置的位置。这里要提醒一下的是,更改完配置之后,记得再点一下左下角的configure按钮。不然更改不会应用。
具体的配置当然是根据需要来进行的。
这里要说明一下:
因为在之前安装过opencv 是x86版本的,即在PC上使用的,所以/usr/local中的include以及lib都有opencv的相关库存在,
所以为了方便自己使用以及不出问题,建议将arm版的opencv的安装目录更改一下,
我将下图位置的CMAKE_INSTALL_PREFIX后面的/usr/local改成了
/usr/local/arm
同时,我还更改了一些配置,却掉了一些我不用的功能,以及导致编译出错的功能。比如
WITH_CUDA是我用不到的功能,
WITH_TIFF是因为我在编译的时候出错了,
然后我去掉了这个功能。(我在网上看到,有人没有去掉这个功能也能编译,可能是因为我系统里缺少什么东西吧?)
配置更改完了之后点一下左下角的configure。然后再点generate.
到这里,cmake的工作做完了。
从终端进入 opencv_arm这个文件夹然后
make。
但是,肯定会出错。
必然会遇到的错误如下:
/home/yr/OpenCV-2.3.1/modules/flann/include/opencv2/flann/dist.h:
In function 'T cvflann::abs(T) [with T = long double]':
/home/yr/OpenCV-2.3.1/modules/flann/include/opencv2/flann/dist.h:63:
error: 'fabsl' was not declared in this scope
make[2]: *** [modules/flann/CMakeFiles/opencv_flann_pch_dephelp.dir/opencv_flann_pch_dephelp.obj] Error 1
make[1]: *** [modules/flann/CMakeFiles/opencv_flann_pch_dephelp.dir/all] Error 2
make: *** [all] Error 2
解决方法:
修改OpenCV-2.3.1/modules/flann/include/opencv2/flann/dist.h文件第63行的源码:{ return fabsl(x); }改为{ return fabs(x); }
其实就是删了个l这个字母。
然后再
make
当然,还有非常大概率遇到一下错误:
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'
../../lib/libopencv_ts.so: undefined reference to `pthread_key_delete'
../../lib/libopencv_core.so: undefined reference to `pthread_once'
../../lib/libopencv_core.so: undefined reference to `clock_gettime'
../../lib/libopencv_core.so: undefined reference to `pthread_setspecific'
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
解决方法:
修改opencv_arm目录下的CMakeCache.txt,CMAKE_EXE_LINKER_FLAGS原来为空,加上-lpthread
-lrt,如下图:
注意:每次错误产生,经修改后,只要再次执行make命令就接着编译,
编译成功后,执行
sudo make intall
就会安装opencv。
将opencv安装到
/usr/local/arm
这个位置。
安装好之后,来尝试交叉编译一个例子试试。
我这里使用的是opencv中文官网中的例子。
只不过考虑到我目前是通过NFS,在终端中使用minicom来运行omapl138中的linux,所以将里面涉及到窗口及显示的函数去掉了。
例子如下,命名为main.cpp:(功能是将一副彩色图片转换为灰度图)
下面说一下我的编译方法。依然使用DVSDK中的交叉编译链。
我为了方便将main.cpp拷入/home/yr/ti-dvsdk_omapl138-evm_04_03_00_06/linux-devkit/bin文件夹,即交叉编译器所在文件夹
并且在终端中进入。直接
cd /home/yr/ti-dvsdk_omapl138-evm_04_03_00_06/linux-devkit/bin
在终端运行如下命令(此命令为手动输入库文件极其目录的方法):
./arm-arago-linux-gnueabi-gcc main.cpp -o main1 -I/usr/local/arm/include/opencv -I/usr/local/arm/include -L/usr/local/arm/lib -lpthread -ldl -lopencv_core -lrt
-lopencv_highgui
然后出现了警告:
/home/yr/ti-dvsdk_omapl138-evm_04_03_00_06/linux-devkit/bin/../lib/gcc/arm-arago-linux-gnueabi/4.3.3/../../../../arm-arago-linux-gnueabi/bin/ld:
warning: ../../lib/libopencv_core.so, needed by /usr/local/arm/lib/libopencv_highgui.so, not found (try using -rpath or -rpath-link)
/home/yr/ti-dvsdk_omapl138-evm_04_03_00_06/linux-devkit/bin/../lib/gcc/arm-arago-linux-gnueabi/4.3.3/../../../../arm-arago-linux-gnueabi/bin/ld:
warning: ../../lib/libopencv_imgproc.so, needed by /usr/local/arm/lib/libopencv_highgui.so, not found (try using -rpath or -rpath-link)
这个问题是因为交叉编译器没有找到这两个库(网上是这么说的)。我将libopencv_core.so,libopencv_imgproc.so,这两个库拷贝到了
/home/yr/ti-dvsdk_omapl138-evm_04_03_00_06/linux-devkit/lib 中,即交叉编译器的lib中。
然后再运行编译命令。就ok了。没有任何错误和警告了。
这里要说明的是:
./arm-arago-linux-gnueabi-gcc main.cpp -o main1 -I/usr/local/arm/include/opencv
-I/usr/local/arm/include -L/usr/local/arm/lib -lpthread -ldl -lrt -lopencv_core -lopencv_highgui
这个命令中。-I后面都是头文件include目录。-L后面是库文件目录。而那些带 - 的参数,就是我们要用到的库文件,这个例子里我只用到了
libopencv_core.so和libopencv_highgui.so这两个库,所以就只有-lopencv_core
-lopencv_highgui这两个。
要是程序用到了其他库,那么在参数后面添加就行了。
/*以下是更新部分
以上是编译程序的第一种方法,另外一种便是通过配置
/usr/local/lib/pkgconfig中的opencv.pc文件并使用 `pkg-config
--cflags --libs opencv` 来进行编译
这种方法面去了输入一大堆配置参数的麻烦。建议使用这种方法
因为我在以前安装过PC版的正常的opencv,所以在/usr/local/lib/pkgconfig里会有opencv.pc这个文件。
如果以前没有安装过,可能就没有这个文件,可以尝试自己新建一个,应该也行。
首先 sudo gedit /usr/local/lib/pkgconfig/opencv.pc
将第一行的
prefix=/usr/local
更改为
prefix=/usr/local/arm
这个目录在cmake配置的时候提到过。即arm的opencv的安装目录。
然后再在Libs里加入-lpthread
-lrt。
下面将整个opencv.pc文件贴出。
保存了opencv.pc之后,建议将/usr/local/arm/lib 里的13个文件都复制进/home/yr/ti-dvsdk_omapl138-evm_04_03_00_06/linux-devkit/lib
中,
不然会出现类似与上面蓝色字体的警告。
进入/home/yr/ti-dvsdk_omapl138-evm_04_03_00_06/linux-devkit/bin目录,并运行命令
./arm-arago-linux-gnueabi-gcc `pkg-config --cflags
--libs opencv` main.cpp -o main
就ok了。
以上是更新部分*/
例子编译完啦。到底能不能在arm上运行,这个还要等板子在身边之后再测试了。结果会在此文更新。
所以我估计在omapl138上也会成功。
更新:更新了 编译命令 `pkg-config --cflags --libs opencv` 的更改以及使用方法
首先,opencv是个好东西,对于我这样的菜鸟,来说,既是好用的工具,也是最好的学习资料。
此次移植是在ubuntu12.04 32位,针对omapl138的arm端来进行的。(其实只要是arm应该都一样)
本来呢,是想移植到c6748的。但是我感觉这个对我来说难度有点大。。而网上对于移植arm的资料也很多。
所以先移植到arm再说把。
不过还是希望有高手能给我指导一下,将opencv移植至c6748该怎么做。在CCS里或者linux里都行。因为我想使用gpp+dsp模式。将算法做成包,然后跑在dsp端。
此文有一部分综合了网上多人的方法,也有自己在进行移植时的经验。
当然,移植的效果还没有给出,因为板子不在身边,无法进行测试。等有板子了,再进行测试,确定是否移植成功。
结果会在本文更新。
好。先下载opencv。
下载OpenCV 2.3.1 , http://sourceforge.net/projects/opencvlibrary/files/
然后解压
tar xvf OpenCV-2.3.1.tar.bz2
在此要说明的是,此次移植是在前面omapl138的DVSDK都安装并且配置好的情况下进行的。
我的DVSDK安装路径是/home/yr/ti-dvsdk_omapl138-evm_04_03_00_06
我使用omapl138中的交叉编译链。
即交叉编译链存在于
/home/yr/ti-dvsdk_omapl138-evm_04_03_00_06/linux-devkit/bin 这个目录中。
刚才解压了opencv,现在在你的工作目录里建立一个新的文件夹opencv_arm。名称和具体路径看个人爱好。
然后进入终端运行cmake-gui。如果以前没有安装过,终端会提示你使用apt-get命令安装。
安装好之后就可以运行了。
cmake-gui
之后出现下面的界面
选择source code目录 /home/yr/OpenCV-2.3.1
以及build目录 /home/yr/opencv_arm
点configure
然后按照下图中所选择的:
generator为Unix Makefiles,选择Specify options for cross-compiling
next之后,在下图这几个位置填写路径
Operating System填写arm-arago-linux
Compilers里,C选择 /home/yr/ti-dvsdk_omapl138-evm_04_03_00_06/linux-devkit/bin/arm-arago-linux-gnueabi-gcc
C++选择 /home/yr/ti-dvsdk_omapl138-evm_04_03_00_06/linux-devkit/bin/arm-arago-linux-gnueabi-g++
可以看出来我都是用的DVSDK中的目录。
Target Root选择 /home/yr/ti-dvsdk_omapl138-evm_04_03_00_06/linux-devkit
然后finish。
cmake便返回下图
图中红色部分是我们可以配置的位置。这里要提醒一下的是,更改完配置之后,记得再点一下左下角的configure按钮。不然更改不会应用。
具体的配置当然是根据需要来进行的。
这里要说明一下:
因为在之前安装过opencv 是x86版本的,即在PC上使用的,所以/usr/local中的include以及lib都有opencv的相关库存在,
所以为了方便自己使用以及不出问题,建议将arm版的opencv的安装目录更改一下,
我将下图位置的CMAKE_INSTALL_PREFIX后面的/usr/local改成了
/usr/local/arm
同时,我还更改了一些配置,却掉了一些我不用的功能,以及导致编译出错的功能。比如
WITH_CUDA是我用不到的功能,
WITH_TIFF是因为我在编译的时候出错了,
然后我去掉了这个功能。(我在网上看到,有人没有去掉这个功能也能编译,可能是因为我系统里缺少什么东西吧?)
配置更改完了之后点一下左下角的configure。然后再点generate.
到这里,cmake的工作做完了。
从终端进入 opencv_arm这个文件夹然后
make。
但是,肯定会出错。
必然会遇到的错误如下:
/home/yr/OpenCV-2.3.1/modules/flann/include/opencv2/flann/dist.h:
In function 'T cvflann::abs(T) [with T = long double]':
/home/yr/OpenCV-2.3.1/modules/flann/include/opencv2/flann/dist.h:63:
error: 'fabsl' was not declared in this scope
make[2]: *** [modules/flann/CMakeFiles/opencv_flann_pch_dephelp.dir/opencv_flann_pch_dephelp.obj] Error 1
make[1]: *** [modules/flann/CMakeFiles/opencv_flann_pch_dephelp.dir/all] Error 2
make: *** [all] Error 2
解决方法:
修改OpenCV-2.3.1/modules/flann/include/opencv2/flann/dist.h文件第63行的源码:{ return fabsl(x); }改为{ return fabs(x); }
其实就是删了个l这个字母。
然后再
make
当然,还有非常大概率遇到一下错误:
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'
../../lib/libopencv_ts.so: undefined reference to `pthread_key_delete'
../../lib/libopencv_core.so: undefined reference to `pthread_once'
../../lib/libopencv_core.so: undefined reference to `clock_gettime'
../../lib/libopencv_core.so: undefined reference to `pthread_setspecific'
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
解决方法:
修改opencv_arm目录下的CMakeCache.txt,CMAKE_EXE_LINKER_FLAGS原来为空,加上-lpthread
-lrt,如下图:
注意:每次错误产生,经修改后,只要再次执行make命令就接着编译,
编译成功后,执行
sudo make intall
就会安装opencv。
将opencv安装到
/usr/local/arm
这个位置。
安装好之后,来尝试交叉编译一个例子试试。
我这里使用的是opencv中文官网中的例子。
只不过考虑到我目前是通过NFS,在终端中使用minicom来运行omapl138中的linux,所以将里面涉及到窗口及显示的函数去掉了。
例子如下,命名为main.cpp:(功能是将一副彩色图片转换为灰度图)
#include "cv.h" #include "highgui.h" int main( int argc, char** argv ) { IplImage* pImg; //声明IplImage指针 //载入图像,强制转化为Gray if( argc == 3 && (pImg = cvLoadImage( argv[1], 0)) != 0 ) { IplImage* pImg2 = cvCreateImage(cvGetSize(pImg), pImg->depth, pImg->nChannels); cvCopy(pImg, pImg2, NULL); cvSaveImage(argv[2], pImg2);//把图像写入文件 cvReleaseImage( &pImg ); //释放图像 cvReleaseImage( &pImg2 ); //释放图像 return 0; } return -1; }
下面说一下我的编译方法。依然使用DVSDK中的交叉编译链。
我为了方便将main.cpp拷入/home/yr/ti-dvsdk_omapl138-evm_04_03_00_06/linux-devkit/bin文件夹,即交叉编译器所在文件夹
并且在终端中进入。直接
cd /home/yr/ti-dvsdk_omapl138-evm_04_03_00_06/linux-devkit/bin
在终端运行如下命令(此命令为手动输入库文件极其目录的方法):
./arm-arago-linux-gnueabi-gcc main.cpp -o main1 -I/usr/local/arm/include/opencv -I/usr/local/arm/include -L/usr/local/arm/lib -lpthread -ldl -lopencv_core -lrt
-lopencv_highgui
然后出现了警告:
/home/yr/ti-dvsdk_omapl138-evm_04_03_00_06/linux-devkit/bin/../lib/gcc/arm-arago-linux-gnueabi/4.3.3/../../../../arm-arago-linux-gnueabi/bin/ld:
warning: ../../lib/libopencv_core.so, needed by /usr/local/arm/lib/libopencv_highgui.so, not found (try using -rpath or -rpath-link)
/home/yr/ti-dvsdk_omapl138-evm_04_03_00_06/linux-devkit/bin/../lib/gcc/arm-arago-linux-gnueabi/4.3.3/../../../../arm-arago-linux-gnueabi/bin/ld:
warning: ../../lib/libopencv_imgproc.so, needed by /usr/local/arm/lib/libopencv_highgui.so, not found (try using -rpath or -rpath-link)
这个问题是因为交叉编译器没有找到这两个库(网上是这么说的)。我将libopencv_core.so,libopencv_imgproc.so,这两个库拷贝到了
/home/yr/ti-dvsdk_omapl138-evm_04_03_00_06/linux-devkit/lib 中,即交叉编译器的lib中。
然后再运行编译命令。就ok了。没有任何错误和警告了。
这里要说明的是:
./arm-arago-linux-gnueabi-gcc main.cpp -o main1 -I/usr/local/arm/include/opencv
-I/usr/local/arm/include -L/usr/local/arm/lib -lpthread -ldl -lrt -lopencv_core -lopencv_highgui
这个命令中。-I后面都是头文件include目录。-L后面是库文件目录。而那些带 - 的参数,就是我们要用到的库文件,这个例子里我只用到了
libopencv_core.so和libopencv_highgui.so这两个库,所以就只有-lopencv_core
-lopencv_highgui这两个。
要是程序用到了其他库,那么在参数后面添加就行了。
/*以下是更新部分
以上是编译程序的第一种方法,另外一种便是通过配置
/usr/local/lib/pkgconfig中的opencv.pc文件并使用 `pkg-config
--cflags --libs opencv` 来进行编译
这种方法面去了输入一大堆配置参数的麻烦。建议使用这种方法
因为我在以前安装过PC版的正常的opencv,所以在/usr/local/lib/pkgconfig里会有opencv.pc这个文件。
如果以前没有安装过,可能就没有这个文件,可以尝试自己新建一个,应该也行。
首先 sudo gedit /usr/local/lib/pkgconfig/opencv.pc
将第一行的
prefix=/usr/local
更改为
prefix=/usr/local/arm
这个目录在cmake配置的时候提到过。即arm的opencv的安装目录。
然后再在Libs里加入-lpthread
-lrt。
下面将整个opencv.pc文件贴出。
# Package Information for pkg-config prefix=/usr/local/arm exec_prefix=${prefix} libdir=${exec_prefix}/lib includedir_old=${prefix}/include/opencv includedir_new=${prefix}/include Name: OpenCV Description: Open Source Computer Vision Library Version: 2.3.1 Libs: -L${libdir} -lopencv_core -lopencv_imgproc -lopencv_highgui -lopencv_ml -lopencv_video -lopencv_features2d -lopencv_calib3d -lopencv_objdetect -lopencv_contrib -lopencv_legacy -lopencv_flann -lpthread -lrt Cflags: -I${includedir_old} -I${includedir_new}
保存了opencv.pc之后,建议将/usr/local/arm/lib 里的13个文件都复制进/home/yr/ti-dvsdk_omapl138-evm_04_03_00_06/linux-devkit/lib
中,
不然会出现类似与上面蓝色字体的警告。
进入/home/yr/ti-dvsdk_omapl138-evm_04_03_00_06/linux-devkit/bin目录,并运行命令
./arm-arago-linux-gnueabi-gcc `pkg-config --cflags
--libs opencv` main.cpp -o main
就ok了。
以上是更新部分*/
例子编译完啦。到底能不能在arm上运行,这个还要等板子在身边之后再测试了。结果会在此文更新。
相关文章推荐
- arm端opencv在SBC3730上的测试结果
- arm端opencv在SBC3730上的测试结果
- [置顶] MTCNN算法提速(ARM测试结果评估)(持续更新中。。。)
- Linux下移植OpenCV + Qt 到ARM(Tiny6410)总结 转
- OpenCV移植到ARM(2)
- OpenCV图像处理中的性能测试(持续更新)
- 移植opencv2.3.1 到tiny6410
- 【Linux开发】OpenCV在ARM-linux上的移植过程遇到的问题4---共享库中嵌套库带路径【已解决】
- Opencv-2.0.0的ARM移植和使用(Ubuntu10.04 / OK6410开发板 / linux3.01)
- OpenCV学习笔记(25)基于MFC和OpenCV的摄像机定标与立体匹配测试程序(20140505更新)
- cortex-A8 ARM核 opencv程序移植 (2)
- ubuntu12.04下的opencv2.3.1安装(更新)
- OpenCV 2.4.9在Ubuntu 12.04下的安装 && 移植到ARM上
- 【Linux开发】OpenCV在ARM-linux上的移植过程遇到的问题2---CMAKE配置问题
- 移植linux x86 C库 到android arm平台【交叉编译实现应用增量更新】
- 基于OpenCV的三种光流算法实现源码及测试结果
- 分布式tensorflow测试 同步更新结果及问题
- OpenCV学习笔记(25)基于MFC和OpenCV的摄像机定标与立体匹配测试程序(20140505更新)
- Linux下移植OpenCV + Qt 到ARM(Tiny6410)总结
- Linux下移植OpenCV + Qt 到ARM(Tiny6410)总结