QT+opencv环境搭建

这是我以前做的一个项目经历,虽然是个不太大的项目,但感觉做完这个项目收获不少知识,

过程中也解决可一些这样那样的问题,也走过一些弯路。

回过头来就想把一些经历的一些小挫折,完成项目的一些经验分享给大家,希望能帮到大家,无论工作也好,学习也好能提高些效率。


项目简介:开发板上芯片是arm A8架构的,开发板连接摄像头,连接一个8寸显示屏。连接上摄像头,点开应用程序,会看到一个四格窗口界面,窗口显示视频画面等

窗口用QT来画,图像识别需要调用openCV的库函数。还要用到TCP/UDP协议传输图片。


开发环境:

Intel x86主机

Ubuntu 10.04操作系统

arm开发板


源码包:

开发板自带资料 arm-linux-gcc-4.5.1-v6-vfp-20101103.tgz

官网下载 qt-everywhere-opensource-src-4.6.2.tar.gz

官网下载 cmake-2.8.8-Linux-i386.tar.gz

官网下载 opencv-2.4.6.1.tar.gz


经验过程:

1、安装交叉编译工具

2、编译安装QT

3、编译安装openCV

4、验证程序

下面将依次介绍

1、安装交叉编译工具链

arm-linux-gcc-4.5.1-v6-vfp-20101103.tgz放在 ~/Tiny210/Linux 目录下

 cd ~/Tiny210/Linux

$  tar xvzf arm-linux-gcc-4.5.1-v6-vfp-20101103.tgz

执行命令将在当前路径出现新目录 opt/FriendlyARM/toolschain/4.5.1

执行sudo mkdir /usr/local/arm

sudo mv /home/archermind/opt/FriendlyARM/toolschain/4.5.1 /usr/local/arm/ -r

 

 

修改PATH路径:

$  vi ~/.profile

在文件最后加上一行

PATH=$PATH:/usr/local/arm/4.5.1/bin

vi /root/.profile

在文件最后加上一行

PATH=$PATH:/usr/local/arm/4.5.1/bin

 

(/home/archermind为当前环境的主目录,根据自己的主目录具体修改)

 

保存退出,然后重启电脑。

在终端执行 $ arm-linux-gcc –v

会显示交叉编译的版本信息,说明安装成功。


2、编译安装QT

在qt-everywhere-opensource-src-4.6.2.tar.gz所在目录执行命令:

$  tar xvzf qt-everywhere-opensource-src-4.6.2.tar.gz C /home/archermind

$  cd /home/archermind

将会出现目录qt-everywhere-opensource-src-4.6.2

$  cd qt-everywhere-opensource-src-4.6.2

 

执行配置命令

$  sudo ./configure -prefix /usr/local/Trolltech/qt4.6.2 -no-qvfb -embedded arm -depths 4,8,16,32 -qt-mouse-linuxtp -make libs -nomake tools -xplatform qws/linux-arm-g++ -nomake examples -nomake docs -nomake demo -no-nis -no-cups -no-iconv -no-dbus -no-glib -qt-freetype -little-endian -stl -v

$  sudo make

make过程中一般会报出各种各样的错误,且每次编译可能问题都不一样,现将我所遇到的问题及解决方案理出如下:

遇到problem: undefine ....   

办法在对应的Makefile 中 LIBS后加上 -lrt

 

遇到:png.h中有结构体未定义

办法:下载较新libpng包,解压到主目录中,进入该目录。

$./configure\

-hos=arm-linux\ prefix=/home/archermind/Tiny210/Linux/opt/FriendlyARM/toolschain/4.5.1/arm-none-linux-gnueabi enable-shared enable-static

$ make 

$ make install

找到包中的pngconf.h  png.h,复制到指定include目录中

  ->~/Tiny210/Linux/opt/FriendlyARM/toolschain/4.5.1/arm-none-linux-gnueabi/include

 

3

遇到:jpeghandler.cpp文件编不过时

办法:到上级目录找到jpeg.pro 里面,把jpeghandler.cpp去掉。

 

4

遇到:某个目录下文件怎么弄也编不过时,如果该目录内容对你不重要时。

办法:找到目录上一级配置文件中删除编译这个目录,还可以利用configure选项 例如 -nomake tools,这样tools目录不会再编译了。

 

5

遇到:Error: register or shift expression expected -- `orr r3,r2,lsl#16'

办法:这是个BUGQT里面应该先判断编译器版本的,结果人家找出来放到官网了,还好他们给出了解决方案:

http://bugreports.qt.nokia.com/browse/QTBUG-6521

To fix this issue patch /src/3rdparty/freetype/include/freetype/config/ftconfig.h Line 330.

 

    "orr %0, %2, lsl #16/n/t" /* %0 |= %2 << 16 */

    + "orr %0, %0, %2, lsl #16/n/t" /* %0 |= %2 << 16 */

 

他的意思是加多一个%0%2前面,加上后编译过。

6

遇到:提示未找到命令:arm-linux-gcc

办法:由于是sudo命令,需要root用户也添加环境变量 export PATH=$PATH:/usr/local/arm/3.4.1/bin 

 

7

遇到:出现以下错误:../3rdparty/javascriptcore/JavaScriptCore/wtf/Platform.h:298:6: #error "Not supported ARM architecture"

make[1]: *** [obj/release/pcre_compile.o] 错误 1

make[1]:正在离开目录 `/usr/local/qt/qt-everywhere-opensource-src-4.6.3-arm/src/script'

make: *** [sub-script-make_defaulrgefile

 

方法:add a line in your ./configure parameters, such as "-D__ARM_ARCH_5TEJ__" , or whichever architecture definition that suits the platform.

就是在./configure参数后面增加一个"-D__ARM_ARCH_5TEJ__"

 

 

make install

遇到 权限问题

办法 sudo make  

     sudo make install

 

Make完毕之后,执行:

$ sudo make install

 

结束后会在/usr/local/ Trolltech/qt4.6.2目录中生成QT文件。

 

$ sudo cp /usr/local/Trolltech/qt4.6.2/include/*  ~/Tiny210/Linux/opt/FriendlyARM/toolschain/

4.5.1/ arm-none-linux-gnueabi/include/

$ sudo cp /usr/local/Trolltech/qt4.6.2/ib/* ~/Tiny210/Linux/opt/FriendlyARM/toolschain/

4.5.1/ arm-none-linux-gnueabi/lib/

(拷贝QT头文件和库文件,是为了编译opencv做准备)


3、编译安装openCV

终端进入cmake-2.8.8-Linux-i386.tar.gz所在目录,执行:

$ tar xvzf cmake-2.8.8-Linux-i386.tar.gz C /home/archermind

执行后会出现 /home/archermind/cmake-2.8.11.2-Linux-i386目录

 

终端进入opencv-2.4.6.1.tar.gz所在目录,执行:

$tar xvzf opencv-2.4.6.1.tar.gz C /home/archermind

执行后会出现/home/archermind/opencv-2.4.6.1目录

 

$ cd /home/archermind/opencv-2.4.6.1

$ mkdir r build

$ /home/archermind/ cmake-2.8.11.2-Linux-i386/bin/cmake-gui

 

执行后会出现cmake配置图形界面。

 

在窗口化界面中 

选择源码目录/home/archermind/opencv-2.4.6.1

选择build目录/home/archermind/opencv-2.4.6.1/build

点击Configure,保持generatorUnix Makefiles,选择Specify options for cross-compiling,点击Next

Operating System填写arm-linux

C compilers 填写 ~/Tiny210/Linux/opt/FriendlyARM/toolschain/4.5.1/bin/arm-linuc-gcc

C++comilers填写~/Tiny210/Linux/opt/FriendlyARM/toolschain/4.5.1/bin/arm-linuc-g++

ROOT Target 填写/usr/local/Trolltech/qt4.6.2

(如果不编QT一般添~/Tiny210/Linux/opt/FriendlyARM/toolschain/4.5.1)

点击Finish

默认安装路径为 /usr/local,点击Generate生成Makefile

在图形框主目录找到WITH_QT 打钩,WITH_TIFF 去掉钩 ,点Configure

然后再找到新增的QT_QMAKE_EXECUTABLE选项,确保后面的路径为/usr/local/Trolltech/qt4.6.2/bin/qmake

configure,再点Generate生成MAkefile

 

修改~/ opencv-2.4.6.1/modules/highgui/CMakeLists.txt

 找到set(highgui_srcs ,然后下一行加上一行:

           src/cap_v4l.cpp           //加上这个视频文件

修改~ /opencv-2.4.6.1/cmake/templates/ cvconfig.h.cmake

24行加上:#define HAVE_CAMV4L2

234行加上:#define HAVE_QT

 

$ cd /home/archermind/opencv-2.4.6.1/build

$ sudo make

 

Make过程中可能会遇到如下问题:

遇到:

 

Linking CXX executable ../../bin/opencv_createsamples

../../lib/libopencv_core.so: undefined reference to `clock_gettime'

../../lib/libopencv_highgui.so: undefined reference to `_TIFFerrorHandler'

../../lib/libopencv_highgui.so: undefined reference to `_TIFFrealloc'

../../lib/libopencv_core.so: undefined reference to `pthread_key_create

解决方法:

修改build/CMakeCache.txtCMAKE_EXE_LINKER_FLAGS原来为空,加上-lpthread -lrt,重新编译,错误消除

 

遇到:

Linking CXX executable ../../bin/opencv_createsamples

../../lib/libopencv_highgui.so: undefined reference to `_TIFFerrorHandler'

../../lib/libopencv_highgui.so: undefined reference to `_TIFFrealloc'

../../lib/libopencv_highgui.so: undefined reference to `_TIFFmalloc'

../../lib/libopencv_highgui.so: undefined reference to `_TIFFmemcpy'

../../lib/libopencv_highgui.so: undefined reference to `TIFFOpen'

../../lib/libopencv_highgui.so: undefined reference to `_TIFFfree'

../../lib/libopencv_highgui.so: undefined reference to `_TIFFwarningHandler'

../../lib/libopencv_highgui.so: undefined reference to `_TIFFmemcmp'

../../lib/libopencv_highgui.so: undefined reference to `_TIFFmemset'

解决方法:修改build/CMakeCache.txtWITH_TIFF:BOOL=ON,改成OFF,重新编译,错误消除

 

遇到:OpenCV-2.2.0/modules/ml/src/gbt.cpp:474: error: 'expl' was not declared in this scope

 

  解决:    修改gbt.cpp14行,16行:注释掉

 

                    //#if ANDROID

 

                    #define expl(x) exp(x)

                    //#endif

遇到: lib/libopencv_features2d.so: undefined reference to `cv::SIFT::SIFT(double, bool, bool, int, int, int, int

  解决: 在OpenCV2.2.0/modules/features2d/src/sift.cpp下 

            #ifdef __arm__

            #define ARM_NO_SIFT

            #endif   

        注释掉#define ARM_NO_SIFT.错误消除,

 

遇到:/home/ubuntu-1/opencv-2.4.6.1/modules/highgui/src/window_QT.cpp: In member function 'void GuiReceiver::showImage(QString, void*)':

/home/ubuntu-1/opencv-2.4.6.1/modules/highgui/src/window_QT.cpp:953:25: error: 'class QString' has no member named 'toStdString'

解决: vi modules/highgui/src/window_QT.cpp  

    953       cv::imshow(name.toStdString(), im);替换为:

954       cv::imshow(qPrintable(name), im);

 

编译成功!

$ sudo make install

安装成功!

sudo cp /usr/local/lib/* /usr/local/arm/4.5.1/arm-none-linux-gnueabi/lib/ -r

哈哈,到这里即将大工告成了,下面我们就来编译一个程序试试,

程序中将会用到交叉编译器,qt库,openCV库等,如果编译运行成功

说明我们配置的环境没问题:

验证程序:

编写文件opencv_test.cpp 内容如下:

#include <cv.h> 

#include <cxcore.h> 

#include <highgui.h> 

 

 

int main(int argc,char **argv) 

CvCapture* capture = NULL; 

IplImage* frame = NULL; 

 

if(!(capture = cvCaptureFromCAM(-1))) //我这里写的参数是代表dev/video0

fprintf(stderr, "Can not open camera./n"); 

return -1; 

 

cvNamedWindow("video", 1); 

 

while(frame = cvQueryFrame( capture ) ) 

cvShowImage("video", frame); 

 

cvDestroyWindow("video"); 

cvReleaseCapture(&capture);

 

return 0; 

}

 

在该文件所在目录,执行命令:

$  arm-linux-g++ -o opencv_test opencv_test.cpp -I /usr/local/include -L /usr/local/lib 

-lopencv_core -lopencv_highgui -lpthread –lrt

生成的程序opencv_test,用命令 readelf -h opencv_test 看看是不是arm执行的程序。

 

在开发板执行opencv-qt程序时,需要把QT所有lib库和opencv所有lib库,复制到开发板/lib/下。


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值