arm-linux下qt + opencv开发环境的搭建(Altera DE1 Soc)

说明:博主为嵌入式小白,搭建并测试这个环境耗费多日,现将过程写出,以帮助更多的人!博主用的板子是Altera DE1 Soc,对于其他的ARM应该同样适用。

百度云盘地址:http://pan.baidu.com/s/1dDAbeYd
系统:           ubuntu-14.04-desktop-i386
ARM 系统:   DE1_SoC_FB
虚拟机工具:     VMware-workstation-full-10.0.1
opencv:         2.4.7
qt:                qt-linux-opensource-5.2.0-x86offline.run
交叉编译器:   gcc-linaro-arm-linux-gnueabihf-4.7-2012.11-20121123_linux
cmake:           2.8.12.2


一.准备工作:
  1.安装虚拟机的步骤无需多言,装完后记得重启;
  2.             $sudo apt-get update  
                $sudo apt-getupgrade 
  3.安装x86的工具链
                $sudo apt-get installbuild-essential libgl1-mesa-dev 

二. 配置交叉编译器
        我云盘中提供的是gcc-linaro-arm-linux-gnueabihf-4.7-2012.11-20121123_linux.tar.bz2,版本为4.7.3
        cd到相应目录
        $tar xjfgcc-linaro-arm-linux-gnueabihf-4.7-2012.11-20121123_linux.tar.bz2 
        修改PATH
        $gedit~/.profile
        在文件末尾加上
        exportPATH=/home/yulebron/gcc-linaro-arm-linux-gnueabihf-4.7-2012.11-20121123_linux/bin:$PATH
        一定要根据你的安装目录修改路径(下同)
        保存退出后$source ~/.profile

三.安装QT
  1.下载QT
        http://download.qt-project.org/official_releases/qt/5.2/5.2.0/选择qt-linux-opensource-5.2.0-x86offline.run (也可以下载我云盘中提供的,下同)
  2.安装
        进入相应目录
        $chmod +xqt-linux-opensource-5.2.0-x86-offline.run 
        $./qt-linux-opensource-5.2.0-x86-offline.run
    一路next,安装完毕
  3.构建QT的ARM库
        下载地址:http://qt-project.org/downloads 选择Qtlibraries 4.8.6 for embedded Linux
        cd到相应目录,解压
          $tar -zxvfqt-everywhere-opensource-src-4.8.5.tar.gz 
  4.为ARM创建mkspecs
        cd到qt-everywhere-opensource-src-4.8.5/mkspecs/qws 目录下
        以下步骤根据自己的编译器名称进行修改!!!
       重命名编译器linux-arm-gnueabi-g++
        $cp -r linux-arm-gnueabi-g++linux-arm-gnueabihf-g++
        修改配置
        $cd linux-arm-gnueabihf-g++
        $gedit qmake.conf
        将所有的arm-none-linux-gnueabi用linux-arm-gnueabihf替换,如图
          arm-linux下qt + opencv开发环境的搭建(Altera DE1 Soc)_第1张图片
        安装QT库
          $source ~/.profile
        $cd~/Downloads/qt-everywhere-opensource-src-4.8.6
        $ ./configure -prefix/usr/local/qt-4.8.6-altera-soc -release -shared -nomake examples-nomake tools -nomake docs -make demos -xplatformqws/linux-arm-gnueabihf-g++ -embedded arm -little-endian -no-pch-v 
        弹出选项中选择o,随后选择yes

        $make
        $sudo make install
        注意make这一步会跑数小时
  5.QT中设置ARM的开发套件
        选择Tools—Options ...
          arm-linux下qt + opencv开发环境的搭建(Altera DE1 Soc)_第2张图片
编译器路径为之前安装的编译器中的g++(注意图中是4.8.5,我们用的是4.8.6)
arm-linux下qt + opencv开发环境的搭建(Altera DE1 Soc)_第3张图片
arm-linux下qt + opencv开发环境的搭建(Altera DE1 Soc)_第4张图片
Kits Setup :
        Name: Altera SoC FPGAKit 
        Device Type: Select “Generic LinuxDevice” 
        Compiler: Select “GCC (AlteraSoC)” 
        Qt Version: Select “(Qt 4.8.6(qt-4.8.6-atera-soc)”

以后的编程中如下选择即可生成ARM上可用的可执行文件,在相应文件夹中找到然后拷到ARM中即可
arm-linux下qt <wbr>+ <wbr>opencv开发环境的搭建(Altera <wbr>DE1 <wbr>Soc)
  5.拷贝QT库到ARM上
          $ cd/usr/local 
          $sudo tar -jcv -fqt-4.8.6-altera-soc.tar.bz2 qt-4.8.6-altera-soc
        将生成的的压缩文件拷贝到ARM的相应目录下解压即可

四.安装opencv的准备
 1.安装Synaptic PackageManager 
  2.启动 Synaptic
       $sudosynaptic
      依次点击Reload, Mark All Upgrades, Apply
 3.安装zlib,png,jpeg
      在搜索栏中输入png,mark libpng 12-0 为安装,点击apply,如图
arm-linux下qt + opencv开发环境的搭建(Altera DE1 Soc)_第5张图片
同上,输入jpeg, 安装jpeg62 
          输入zlib,安装zlib1g 
          输入cmake, 安装cmake,cmake-qt-gui

五.安装opencv
下载opencv源码,并解压,新建一个文件夹用来包含创建编译opencv库时候的配置文件(/home/yulebron/work/opencvARM),另外在在/usr/local中创建一个opencvARM文件夹
        $cmake-gui
         


此时会报错,因为默认勾选了一下未安装的选项,此处,我在with中只会留下with_jpeg和with_png
arm-linux下qt + opencv开发环境的搭建(Altera DE1 Soc)_第6张图片
修改CMAKE_INSTALL_PREFIX为你将安装的目录,即为/usr/local/opencvARM
一切ok, 点击generate
进入/home/yulebron/work/opencvARM
        $vim CMakeCache.txt
修改   CMAKE_C_FLAGS:STRING=-fPIC
          CMAKE_EXE_LINKER_FLAGS:STRING=-pthread -lrt
保存并退出
        $make
        $sudo make install
将生成的/usr/local/opencvARM/lib中的文件拷贝到ARM的相应目录中

六.QT中包含opencv库
在.pro文件中添加如下语句,由于对opencv的库不是很了解,我将所有的库都包含了进去
INCLUDEPATH += /usr/local/opencvARM/include/opencv \
                /usr/local/opencvARM/include/opencv2 \
                /usr/local/opencvARM/include

LIBS += /usr/local/opencvARM/lib/libopencv_calib3d.so \
        /usr/local/opencvARM/lib/libopencv_contrib.so\
        /usr/local/opencvARM/lib/libopencv_core.so\
        /usr/local/opencvARM/lib/libopencv_features2d.so\
        /usr/local/opencvARM/lib/libopencv_flann.so\
        /usr/local/opencvARM/lib/libopencv_gpu.so\
        /usr/local/opencvARM/lib/libopencv_highgui.so\
        /usr/local/opencvARM/lib/libopencv_imgproc.so\
        /usr/local/opencvARM/lib/libopencv_legacy.so\
        /usr/local/opencvARM/lib/libopencv_ml.so \
        /usr/local/opencvARM/lib/libopencv_nonfree.so\
        /usr/local/opencvARM/lib/libopencv_objdetect.so\
        /usr/local/opencvARM/lib/libopencv_photo.so\
        /usr/local/opencvARM/lib/libopencv_stitching.so\
        /usr/local/opencvARM/lib/libopencv_superres.so\
        /usr/local/opencvARM/lib/libopencv_video.so\
        /usr/local/opencvARM/lib/libopencv_videostab.so
至此,一切工作已经完成

七.编程测试
    此处感谢CSDN博主    心中唯有此愿 的博文 http://blog.csdn.net/jiebaoabcabc/article/details/22935185 
      整个工程见云盘build-thatsit-Altera_SoC_FPGA_Kit-Release目录
  1.新建swith.cpp,  复制上IplImage与QImage间转换用代码(这个非常有用)
  1. #include "switch.h"  
  2.   
  3. ImageCVtoQT::ImageCVtoQT(IplImage *_srcImage)  
  4.     :srcImage(_srcImage)  
  5. {  
  6.     assert(srcImage != NULL);  
  7.     width = srcImage -> width;  
  8.     height = srcImage -> height;  
  9.     channel = srcImage -> nChannels;  
  10. }  
  11.   
  12. ImageCVtoQT::~ImageCVtoQT()  
  13. {  
  14.     cvReleaseImage(&srcImage);  
  15. }  
  16.   
  17. const QImage ImageCVtoQT::getQtImage()  
  18. {  
  19.     QImage desImage = QImage(width, height, QImage::Format_RGB32);  
  20.     for(int i=0; i
  21.     {  
  22.         for(int j=0;j
  23.         {  
  24.             int r,g,b;  
  25.             if(RGB_TYPE == channel)  
  26.             {  
  27.                 b = (int)CV_IMAGE_ELEM(srcImage, uchar , i, j*3+0);  
  28.                 g = (int)CV_IMAGE_ELEM(srcImage, uchar , i, j*3+1);  
  29.                 r = (int)CV_IMAGE_ELEM(srcImage, uchar , i, j*3+2);  
  30.             }  
  31.             else if(GRAY_TYPE == channel)  
  32.             {  
  33.                 b = (int)CV_IMAGE_ELEM(srcImage, uchar, i, j);  
  34.                 g = b;  
  35.                 r = b;  
  36.             }  
  37.             desImage.setPixel(j, i, qRgb(r, g, b));  
  38.         }  
  39.     }  
  40.     return desImage;  
  41. }  
  42. /////////////////////////////////////////////////////////////////////  
  43.   
  44. ImageQTtoCV::ImageQTtoCV(QImage _srcImage)  
  45. :srcImage(_srcImage)  
  46. {  
  47.     assert(!srcImage.isNull());  
  48.     width=srcImage.width();  
  49.     height=srcImage.height();  
  50.   
  51. }  
  52. ImageQTtoCV::~ImageQTtoCV()  
  53. {  
  54. }  
  55.   
  56. IplImage *ImageQTtoCV::getCvImage()  
  57. {  
  58.     IplImage *desImage=cvCreateImage(cvSize(width,height),8,3);  
  59.     for(int i=0;i
  60.     {  
  61.         for(int j=0;j
  62.         {  
  63.             QRgb rgb=srcImage.pixel(j,i);  
  64.             CV_IMAGE_ELEM(desImage,uchar,i,j*3+0)=qBlue(rgb);  
  65.             CV_IMAGE_ELEM(desImage,uchar,i,j*3+1)=qGreen(rgb);  
  66.             CV_IMAGE_ELEM(desImage,uchar,i,j*3+2)=qRed(rgb);  
  67.         }  
  68.     }  
  69.     return desImage;  
 
  2. 新建switch.h头文件
  1. #ifndef SWITCH_H  
  2. #define SWITCH_H  
  3.   
  4. //#include "highgui.h"  
  5. #include "cv.h"  
  6. #include "cxcore.h"  
  7.   
  8. #include   
  9.   
  10.   
  11. #define RGB_TYPE  3  
  12. #define GRAY_TYPE 1  
  13.   
  14. class ImageCVtoQT  
  15. {  
  16. public:  
  17.     ImageCVtoQT(IplImage *_srcImage);  
  18.     ~ImageCVtoQT();  
  19.     const QImage getQtImage(void);  
  20. private:  
  21.     IplImage *srcImage;           
  22.   
  23.     //QImage desImage;            
  24.     int width;  
  25.     int height;  
  26.     int channel;  
  27. };  
  28.   
  29. class ImageQTtoCV  
  30. {  
  31. public:  
  32.     ImageQTtoCV(QImage _srcImage);  
  33.     ~ImageQTtoCV();  
  34.     IplImage *getCvImage(void);  
  35. private:  
  36.     QImage srcImage;  
  37.     int width;  
  38.     int height;  
  39.     //int channel;  
  40. };  
  41.   
  42.   
  43. #endif // SWITCH_H  
  3. 在界面文件中拉入一个lable,将其展开与窗体同大小
 4. 在dialog的构造函数中进行图像的导入和转换,过程是QImage导入图片->原始IplImage->opencv对原始IplImage进行处理->处理后IplImage->QImage->使用QImage借助qt窗体上显示图片
 5. dialog.cpp
  1. #include "dialog.h"  
  2. #include "ui_dialog.h"  
  3. #include "switch.h"  
  4. #include "QtGui"  
  5.   
  6. Dialog::Dialog(QWidget *parent) :  
  7.     QDialog(parent),  
  8.     ui(new Ui::Dialog)  
  9. {  
  10.     ui->setupUi(this);  
  11.   
  12.     //声明IplImage指针  
  13.     IplImage *pImg = NULL;  
  14.     QImage *qImg = new QImage;  
  15.   
  16.     //载入图片  
  17.     if(!(qImg->load("/home/project/sao22.bmp")))  // 我的开发板支持bmp格式,小心路径  
  18.     {  
  19.         return;  
  20.     }  
  21.   
  22.     //switch  
  23.     ImageQTtoCV qtc(*qImg);  
  24.     pImg = qtc.getCvImage();  
  25.     if(!pImg)  
  26.         return;  
  27.     IplImage *pGrayImg = NULL;  
  28.     pGrayImg = cvCreateImage(cvGetSize(pImg), IPL_DEPTH_8U, 1);  
  29.     cvCvtColor(pImg, pGrayImg, CV_BGR2GRAY);  
  30.   
  31.     ImageCVtoQT ctq(pGrayImg);  
  32.     *qImg = ctq.getQtImage();  
  33.     if(!qImg)  
  34.         return;  
  35.   
  36.     ui->label->setPixmap(QPixmap::fromImage(*qImg));  
  37. }  
  38.   
  39. Dialog::~Dialog()  
  40. {  
  41.     delete ui;  
从一切完成,从Release目录中拷贝相应的elf文件和即可在开发板上运行,miao..........
arm-linux下qt + opencv开发环境的搭建(Altera DE1 Soc)_第7张图片


本文参考:
http://blog.csdn.net/jiebaoabcabc/article/details/22935185
terasic文档DE1-SoC_Control_Panel.pdf

你可能感兴趣的:(arm-linux下qt + opencv开发环境的搭建(Altera DE1 Soc))