当前位置:   article > 正文

交叉编译OpenCV2.2.0及移植到Tiny210

交叉编译opencv2

一、开发环境

上位机:Ubuntu10.04 LTS

交叉编译器:arm-linux-gcc4.5.1(友善之臂提供)

arm-linux-gcc-4.5.1-v6-vfp-20120301.tgz 下载地址:http://115.com/file/beeblvvn
cmake-2.8.7-Linux-i386.sh

建立交叉编译环境
在Linux平台下,要为开发板编译内核,图形界面Qtopia/Qt4,bootloader,还有其他一些应用程序,均需要交叉编译工具链,我们使用的是arm-linux-gcc-4.5.1,它默认采用armv6指令集,支持硬浮点运算,下面是安装它的详细步骤。
Step1:将光盘Linux目录中的arm-linux-gcc-4.5.1-v6-vfp-20101103.tgz复制到Fedora9某个目录下如tmp/,然后进入到该目录,执行解压命令:
#cd /tmp
#tar xvzf arm-linux-gcc-4.5.1-v6-vfp-20101103.tgz –C /
注意:C后面有个空格,并且C是大写的,它是英文单词“Change”的第一个字母,在此是改变目录的意思。
执行该命令,将把arm-linux-gcc安装到/opt/FriendlyARM/toolschain/4.5.1目录。
Step2:把编译器路径加入系统环境变量,运行命令
#gedit /root/.bashrc
编辑/root/.bashrc文件,注意“bashrc”前面有一个“.”,修改最后一行为 export PATH=$PATH: /opt/FriendlyARM/toolschain/4.5.1/bin,注意路径一定要写对,否则将不会有效。

如图,保存退出。

交叉编译OpenCV2.2.0及移植到Tiny210
重新登录系统(不必重启机器,开始->logout即可),使以上设置生效,在命令行输入 arm-linux-gcc –v,会出现如下图所示信息,这说明交叉编译环境已经成功安装。

交叉编译OpenCV2.2.0及移植到Tiny210

交叉编译OpenCV2.2.0及移植到Tiny210

交叉编译OpenCV2.2.0及移植到Tiny210



交叉编译OpenCV2.2.0及移植到Tiny210

void av_free_packet(AVPacket *pkt)
{
     if (pkt) {
         if (pkt->destruct) pkt->destruct(pkt);
         pkt->data = NULL; pkt->size = 0;
     }
}

 

交叉编译OpenCV2.2.0及移植到Tiny210

第一次点击configure按钮时,保持generator为Unix Makefiles,选择第三个选项Specify toolchain file for cross-compiling

交叉编译OpenCV2.2.0及移植到Tiny210

点击Next,Specify the Toolchain file中填入交叉编译器的默认安装路径

交叉编译OpenCV2.2.0及移植到Tiny210

点击Finish,出现如下的界面,根据需要修改红色区域相应的value

交叉编译OpenCV2.2.0及移植到Tiny210

我将安装目录修改为/usr/local/opencv4arm,默认的为/usr/local
交叉编译OpenCV2.2.0及移植到Tiny210


交叉编译OpenCV2.2.0及移植到Tiny210

交叉编译OpenCV2.2.0及移植到Tiny210

交叉编译OpenCV2.2.0及移植到Tiny210

交叉编译OpenCV2.2.0及移植到Tiny210

交叉编译OpenCV2.2.0及移植到Tiny210

交叉编译OpenCV2.2.0及移植到Tiny210

交叉编译OpenCV2.2.0及移植到Tiny210


交叉编译OpenCV2.2.0及移植到Tiny210
/usr/local/OpenCV-2.2.0/modules/features2d/src/sift.cpp
交叉编译OpenCV2.2.0及移植到Tiny210

交叉编译OpenCV2.2.0及移植到Tiny210

下图是编译后生成的静态库,大家注意看文件路径啊。

交叉编译OpenCV2.2.0及移植到Tiny210
其中有5个静态库原本是在下图所示的文件夹里面的,我为了方便,之间拷贝到/usr/local/opencv4arm/lib下了
交叉编译OpenCV2.2.0及移植到Tiny210


以下为一段测试程序test.cpp
// test.cpp 
#include "opencv2/core/core.hpp"
#include "opencv2/opencv.hpp"
#include <iostream>
using namespace std;  
      
int main() 
{
    CvCapture* capture = NULL; 
    IplImage* frame = NULL; 
      
     if( !(capture = cvCaptureFromCAM(-1))) 
     {
         fprintf(stderr, "Can not open camera.\n"); 
         return -1; 
     } 
      
     cvNamedWindow("video", 1); 
      
     while(frame = cvQueryFrame( capture ) ) 
     { 
          cvShowImage("video", frame); 
          cvWaitKey(5);
     } 
      
     cvDestroyWindow("video"); 
     cvReleaseCapture(&capture);
     return 0; 

用如下参数编译

//==========error============
arm-linux-g++ test.cpp -static -o test -I /usr/local/opencv4arm/include -L/usr/local/opencv4arm/lib -lopencv_calib3d -lopencv_flann -lopencv_objdetect -lopencv_contrib -lopencv_video -lopencv_ml -lopencv_legacy -lopencv_highgui -llibjpeg -llibpng -ltiff -llibjasper -lzlib -lopencv_imgproc -lopencv_features2d -lopencv_core -lpthread -lrt

得到如下图所示的错误信息,Why? I don't know!
交叉编译OpenCV2.2.0及移植到Tiny210 

链接命令中静态库的先后顺序也是有讲究的,通常来说,如果lib1.a调用了lib2.a中的函数,那么-l1就要放在-l2的前面,但这并非标准的,取决于链接器扫描命令行参数的顺序。而且如果存在多个库文件之间的循环依赖,那这个办法也会失效,这时,只有把相关的几个库文件循环写两遍

//===========ok=============
//arm-linux-g++ test.cpp -static  -o test -I /usr/local/opencv4arm/include   -L/usr/local/opencv4arm/lib  -lopencv_highgui -lopencv_imgproc -lopencv_calib3d -lopencv_video -lopencv_core -lopencv_flann -lopencv_objdetect -lopencv_contrib -lopencv_ml -lopencv_legacy -llibjpeg -llibpng -ltiff -llibjasper -lzlib -lopencv_features2d   -lpthread -lrt 

//========ok===========
//arm-linux-g++  -static test.cpp -o test -I /usr/local/opencv4arm/include   -L/usr/local/opencv4arm/lib  -lopencv_highgui -lopencv_imgproc -lopencv_calib3d -lopencv_video -lopencv_core -llibjasper -ltiff -lopencv_lapack -lzlib -llibpng -llibjpeg -lpthread -lrt

交叉编译OpenCV2.2.0及移植到Tiny210

 

http://blogimg.chinaunix.net/blog/upfile2/090115225055.gz

1. tar -xf tslib-1.4.tar.gz

2. cd tslib

3 ./autogen.sh

4. echo "ac_cv_func_malloc_0_nonnull=yes" >arm-linux.cache

5. ./configure --host=arm-linux -disable-hp3600 --disable-arctic2 --disable-mk712 --disable-collie --disable-corgi --disable-ucb1x00 --disable-linear-h2200 --with-gnu-ld --prefix=/opt/tslib ac_cv_func_malloc_0_nonnull=yes

编译QtE4.7.0
下载源码:arm-qte-4.7.0-20101105.tar.gz(FriendlyARM提供),下载地址http://115.com/file/e77r2acv

交叉编译器请使用上面提到的arm-linux-gcc-4.5.1 

解压:

mkdir /opt/FriendlyARM/Tiny210/linux

tar -xvf arm-qte-4.7.0-20101105.tar.gz -C /opt/FriendlyARM/Tiny210/linux

进入所在文件夹编译 :

cd /opt/FriendlyARM/Tiny210/linux

./build-all

这个过程将十分漫长,等吧,没几个小时下不来的。提醒各位要为其准备足够的磁盘空间啊,我是在虚拟机下运行的,发现虚拟机的大小膨胀了好几个GB。
当顺利执行完毕,再运行mktarget脚本,将会从编译好的目标文件目录中,提取出必要的QtE-4.7.0库文件和可执行二进制示例,并打包为target-qte-4.7.0.tgz,把它在开发板的根目录下解压,就可以使用了,如下命令
#tar xvzf target-qte-4.7.0.tgz –C /
这样就会在/usr/local/目录下创建生成Trolltech目录,它里面包含了运行所需要的所有库文件和可执行程序。


配置Qt Creator,使其可以编译出在ARM下运行的程序。

点击菜单栏的Tools->Options->Qt4->Qt Versions(如下图)

点击右侧的蓝色“+”,即可添加自己的Qt版本,Version Name里面填入Qt版本名称,然后点击QMake Location对应的Browse寻找到该Qt版本对应的qmake

原本我添加的是一个arm版本的Qt结果不知道怎么跑到Auto-detected上面去

交叉编译OpenCV2.2.0及移植到Tiny210
点击Debugging Helper对应的Rebuild按钮,如果编译通过就会在Debugging Helper旁边显示绿色的勾。很可惜,我的显示是红色的X,因为找不到arm-linux-g++。

解决办法:在/etc/profile后面加入一句话export PATH=$PATH:/opt/FriendlyARM/toolschain/4.5.1/bin

如下图所示,这样就把交叉编译器的路径设置为全局的了。再次点击Rebuild应该就可以通过了。
gedit /etc/profil
交叉编译OpenCV2.2.0及移植到Tiny210

运行一个示例看看效果

从usr/local/Trolltech/QtEmbedded-4.6.2/demos下复制books例程到root/tmp文件夹下。

启动Qt-creator,File—〉Open File or Project…,打开root/tmp/books/books.pro。

这里我们直接编译arm下的,移到开发板下运行。
 
在Qt-creator界面左侧点击Projects图标,打开工程设置界面。
在Edit Project Settings for Project books—〉Build Settings—〉Edit Build Configuration:单击Add,在下拉列表中选择Using Qt Version “Qt in PATH”弹出对话框单击Ok按钮,在Edit Build Configuration:下会出现蓝色的Make Qt in PATH Release active.字符,单击激活Qt in PATH Release。

设置完毕,点击Edit图标,回到编辑界面。
编译:在Build菜单下,先Clean Project “books”,然后Build Project “books”,在右下角Compile Output窗口能看到编译信息。
 
复制编译好的文件books到开发板上面,执行./books –qws。如果后面不加 - qws参数,会出现错误信息"QWSDisplay::Data::init::Invalid argument Client can't attach to main ram memory. Aborted".

然后我自己编写ARM下的QT程序,居然出现了multiple definition问题!
编译QT/E应用程序时发生的多重定义问题(multiple definition)和解决方法

首先,检查了源码,所有的头文件都进行了“ifndef/define/endif”保护,没有任何不对的地方;然后,又检查了环境变量,也正常。后来,想到我的这个项目框架代码是用QT/E的自动化工具生成的,即uic生成源码文件,progen生成pro文件,tmake生成Makefile,想到会不会是Makefile出了问题,于是检查了Makefile,确实,原因就在这个自动化生成的Makefile上。看看Makefile里面的内容,会发现OBJECTS中出现了两个camera.o,这就是导致出现这个问题的地方,其实在source和compile的地方也关于camera也出现了重复的,但是这两个会自动跳过,只需删掉OBJECTS处的重复内容保存后重新编译即可。至于自动生成的Makefile为什么会有这样的问题,我还不清楚....

交叉编译OpenCV2.2.0及移植到Tiny210


 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/笔触狂放9/article/detail/522500
推荐阅读
相关标签
  

闽ICP备14008679号