找回密码
 注册
关于网站域名变更的通知
查看: 477|回复: 1
打印 上一主题 下一主题

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

[复制链接]
  • TA的每日心情
    开心
    2019-11-20 15:00
  • 签到天数: 2 天

    [LV.1]初来乍到

    跳转到指定楼层
    1#
    发表于 2019-4-18 09:30 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

    EDA365欢迎您登录!

    您需要 登录 才可以下载或查看,没有帐号?注册

    x
    转——ARM-linux下qt + opencv开发环境的搭建(Altera DE1 Soc)

    ' K( I8 A/ z9 w1 [7 Y) Q百度云盘地址:http://pan.baidu.com/s/1dDAbeYd
    . B/ A$ w& f4 w, R7 ~1 r系统:              ubuntu-14.04-desktop-i386
    6 K9 f( v8 c- z% x' O9 QARM 系统:    DE1_SoC_FB, J4 T' T; I0 Q5 i# o4 K* r
    虚拟机工具:      VMware-workstation-full-10.0.12 `2 f5 J4 z% ~0 n3 P: r9 R
    opencv:           2.4.7
    ' {1 b# ?. i$ X+ [; M7 m$ Tqt:                    qt-linux-opensource-5.2.0-x86offline.run
    7 p5 ?! N& y  w. s2 f5 l2 U交叉编译器:    gcc-linaro-arm-linux-gnueabihf-4.7-2012.11-20121123_linux( Q& U2 _0 i' @$ q7 Y
    cmake:             2.8.12.2( P( @' a. r3 U, S9 e

    , [$ ^3 G( |% E2 e; }0 Z* D; d+ |. u0 q0 ?1 M2 I* z7 W
    一.准备工作:
    ( x6 ?; a( X8 ^* ]9 P1.安装虚拟机的步骤无需多言,装完后记得重启;
    1 P6 K+ q+ L. W1 |* M% U$ n2.            $sudo apt-get update  
    $ b+ R3 Y4 `  E1 B- D9 b                $sudo apt-get upgrade 1 E* u: O' \5 w" C+ v5 E
    3.安装x86的工具链
      X* g" ~9 l2 t2 j# l! m                $sudo apt-get install build-essential libgl1-mesa-dev 1 C: B* K1 q2 W6 s# E3 g7 `+ W

    $ u# Z, J+ y: Y, m1 D0 Z二. 配置交叉编译器( D& Z4 g5 n" M  m7 J7 B2 r
           我云盘中提供的是gcc-linaro-arm-linux-gnueabihf-4.7-2012.11-20121123_linux.tar.bz2,版本为4.7.3
    ; n; {* [2 O- n' i% D       cd到相应目录
    % {" P) ]$ d- B) _6 k       $tar xjf gcc-linaro-arm-linux-gnueabihf-4.7-2012.11-20121123_linux.tar.bz2
    : Z$ ]. n+ X9 q5 K       修改PATH
    # `+ I6 Q" ^4 [- F( Z/ d4 N+ r! z       $gedit ~/.profile& H, c2 Y! K9 V9 c; y+ X
           在文件末尾加上5 d; ~( y: f4 m2 E
           export PATH=/home/yulebron/gcc-linaro-arm-linux-gnueabihf-4.7-2012.11-20121123_linux/binPATH
    9 @  U% d- l7 f, l       一定要根据你的安装目录修改路径(下同)
    3 _- R* H+ t! k( W4 {0 m3 ]. g2 f        保存退出后$source ~/.profile9 n" R/ l: [7 H& K
    $ {( x' q, D7 c3 e& d5 x

    ) G# {; m2 N! C! }8 H7 D三.安装QT
    8 X0 O; d+ t( Y. l2 M4 K# R  W3 j; p1.下载QT
    1 S! _5 t" A) R' ^       http://download.qt-project.org/official_releases/qt/5.2/5.2.0/ 选择qt-linux-opensource-5.2.0-x86offline.run (也可以下载我云盘中提供的,下同)) G5 e, G. w3 {
    2.安装5 s& v  h9 Y- J& x4 ~
           进入相应目录
    6 s% ^1 \, ^# o7 w9 K       $chmod +x qt-linux-opensource-5.2.0-x86-offline.run
    $ ]0 d6 G6 t! ], R4 {4 t       $./qt-linux-opensource-5.2.0-x86-offline.run5 i2 ]: J0 a* @4 d9 e' W! }: K
        一路next,安装完毕
    5 |# k  {6 h) S1 {& M; t3.构建QT的ARM库; F/ z) t5 h% ]' |( I1 Y2 x7 P
           下载地址:http://qt-project.org/downloads 选择Qt libraries 4.8.6 for embedded Linux+ x0 `5 n  r$ N# Z
            cd到相应目录,解压
    8 N; b# n* B$ }& N+ W1 J        $tar -zxvf qt-everywhere-opensource-src-4.8.5.tar.gz , n6 N2 |& i2 o
    4.为ARM创建mkspecs
    5 D1 @! L& a: n$ }- a6 _/ q        cd到qt-everywhere-opensource-src-4.8.5/mkspecs/qws 目录下7 @7 I' _) N6 P5 A( l5 y5 F
            以下步骤根据自己的编译器名称进行修改!!!, V5 s' B9 b. n! g. N2 R
    重命名编译器linux-arm-gnueabi-g++
    " `8 G8 Y! O4 i& ]$ I. r        $cp -r linux-arm-gnueabi-g++ linux-arm-gnueabihf-g++
    ; u, ^: m) g' _2 g# k: h        修改配置" }* b- P8 t7 `2 |) O: |3 C
            $cd linux-arm-gnueabihf-g++
    * y" K2 R2 f  Y        $gedit qmake.conf/ [) N) p: Z% ]* H
            将所有的arm-none-linux-gnueabi用linux-arm-gnueabihf替换,如图
    % t1 e0 M- X5 E! `3 ?3 I
    1 Z9 A6 g( M* G; R" N 9 L/ N. q: }: ^; A  w" d8 J- H
             
    - [$ V/ O  C+ B, l        安装QT库
      |: e; f  \* k# d1 ~0 M. B* K2 M        $source ~/.profile4 R9 A7 Z. V. G# |6 t
            $cd ~/Downloads/qt-everywhere-opensource-src-4.8.6% s5 }) `( g' X% @/ S3 o
            $ ./configure -prefix /usr/local/qt-4.8.6-altera-soc -release -shared -nomake examples -nomake tools -nomake docs -make demos -xplatform qws/linux-arm-gnueabihf-g++ -embedded arm -little-endian -no-pch -v
    7 p) J9 G" U- Q, _        弹出选项中选择o,随后选择yes
    . B% w  g, _/ g. V" _* V
    % M( q# K9 _" E% s2 f        $make
    0 b$ B9 S- G1 R9 m        $sudo make install
    1 c( F  s# N6 X: R* a$ p        注意make这一步会跑数小时- @5 {  N' k& M. Y
    5.QT中设置ARM的开发套件
    2 `3 Q* H/ X( D  H( I        选择Tools—Options ...6 P/ U2 {: r# i/ v6 @
    7 Z' e* c- f: [
              6 g$ i' h8 q3 ^) M1 j; k+ A
    编译器路径为之前安装的编译器中的g++(注意图中是4.8.5,我们用的是4.8.6)4 g9 f7 E; v: q7 x" J- }* ^* z
    2 V, q6 ~6 Q8 ]2 e5 z" p9 \

    + K2 b; ~' m( ?7 A1 y5 t" c, O) c% @1 E
    Kits Setup :
    & z- z5 F! m) w
            Name: Altera SoC FPGA Kit + g) ~. m% a- b' |) F
            Device Type: Select “Generic Linux Device”
    # @# t' i! F" V6 p: [        Compiler: Select “GCC (Altera SoC)”
    : t. U# l: @* F5 {1 \8 I( X; O* T        Qt Version: Select “(Qt 4.8.6 (qt-4.8.6-atera-soc)”" V7 b. W* N0 Z# z& g; F% _& O

    * {# y* w% R" P# A$ K0 u$ \; U6 l( C( [# ?% }

    0 ?% |* H2 _; r1 ~- G以后的编程中如下选择即可生成ARM上可用的可执行文件,在相应文件夹中找到然后拷到ARM中即可  o" B3 o$ \8 A0 s* y* |  }

    2 @* N$ z8 b# T  a* I" L0 x* L2 Q
    0 z+ k4 O, M5 u& w. ^5.拷贝QT库到ARM上+ q: q# M1 N( ~9 {+ Y( P' c
            $ cd /usr/local
    , g4 D2 m0 f: y  S  M+ Y        $sudo tar -jcv -f qt-4.8.6-altera-soc.tar.bz2 qt-4.8.6-altera-soc
    1 L2 l% U! i. O/ [. e4 Q1 h5 L" g        将生成的的压缩文件拷贝到ARM的相应目录下解压即可/ F; y- c  K& L+ L
    / m6 h0 r. d; M# e+ D  t$ q
    四.安装opencv的准备) W7 E: e+ V  ^( C7 L
    1.安装Synaptic Package Manager
    ; r6 r$ }" T6 O6 [+ j3 _2.启动Synaptic
    & ^' F5 k& u! w. t3 W: Q        $sudo synaptic
    8 ^0 ~$ Q) ]( K6 P3 a        依次点击Reload, Mark All Upgrades, Apply
    " j. E, P& i# [0 o/ w7 ~( S' f3.安装zlib,png,jpeg0 F& z7 c8 u8 h4 I; F
            在搜索栏中输入png,mark libpng 12-0 为安装,点击apply,如图
    ( f. h( y& z# M( F% U  M) \5 H4 s
    ' m0 {0 ~- y8 c0 e& N' m: A2 m! Y# T) E) f0 \0 N
    . L8 ~% J# |' S4 c4 P' P
    同上,输入jpeg, 安装jpeg62

    & A; r' a- i7 n, @          输入zlib, 安装zlib1g
    - h; T; L3 p% L% L1 f8 r2 C) a; U          输入cmake, 安装cmake, cmake-qt-gui5 k3 R' S0 t; t2 o7 D2 ]9 o, `5 I: c* s

    - n! p% L" A/ y+ ?' h* Z五.安装opencv- l1 p! m* [) ~  K7 P6 H* z
    下载opencv源码,并解压,新建一个文件夹用来包含创建编译opencv库时候的配置文件(/home/yulebron/work/opencvARM),另外在在/usr/local中创建一个opencvARM文件夹
    # I& Q* H' k) d3 |' {  ^7 k        $cmake-gui0 `, a8 t, z3 P2 w7 m% j: J: ]

    7 y' E$ p' p) K" w/ {# r/ o' L         
    " E# d3 }. V/ t2 t% D) K4 j3 F2 t  W. }/ ` 1 Z2 D; G! D* f1 O2 ]7 Z

    / ?# g# Y: F: x0 l3 H6 T: I2 n此时会报错,因为默认勾选了一下未安装的选项,此处,我在with中只会留下with_jpeg和with_png

    ( z3 H1 f5 {- I- P$ h
    " |7 a" N9 @4 c5 {, V" x4 o8 K' S+ l5 f
    修改CMAKE_INSTALL_PREFIX为你将安装的目录,即为/usr/local/opencvARM
      N8 S' z* P1 B  D0 @, N% D
    一切ok, 点击generate" x# v: V+ V/ u! U( A, X
    进入/home/yulebron/work/opencvARM
    ; Z& t9 r# U# q# v" `/ t        $vim CMakeCache.txt
    3 ^( m. u+ m! H3 n4 i修改   CMAKE_C_FLAGS:STRING=-fPIC6 i2 @% x/ ~- T% d! T5 w
              CMAKE_EXE_LINKER_FLAGS:STRING=-pthread -lrt5 d6 _- {$ `1 @% G3 ~) E( M! j
    保存并退出7 t$ c( Z$ v6 Z8 g* N8 S
            $make
    4 `2 P6 R9 z# H& z( g$ D! J( _        $sudo make install
    7 g  k: f- x$ J0 D" s将生成的/usr/local/opencvARM/lib中的文件拷贝到ARM的相应目录中6 ~4 ]1 w* e+ _. i$ N
    + k, s# n% d8 O0 ~( i
    六.QT中包含opencv库
    7 {& I( z# h2 B& `! k3 P* m7 _: I在.pro文件中添加如下语句,由于对opencv的库不是很了解,我将所有的库都包含了进去; \2 v* A+ a- W$ p: y1 X$ L
    INCLUDEPATH += /usr/local/opencvARM/include/opencv \
    ' s4 ]0 K2 F6 o0 E/ X, J               /usr/local/opencvARM/include/opencv2 \( t+ \. z3 M, |5 U- ~  [) q, s
                   /usr/local/opencvARM/include4 }6 ~; d+ h) p$ U
    9 `3 g: g* G, o
    LIBS += /usr/local/opencvARM/lib/libopencv_calib3d.so \
    ! f- y* V1 F% j# O) |        /usr/local/opencvARM/lib/libopencv_contrib.so \/ G+ ]* ]( K9 Q6 ^0 C1 J( W/ I! t
            /usr/local/opencvARM/lib/libopencv_core.so \% [" `- ?0 H, S& X  T) G' v
            /usr/local/opencvARM/lib/libopencv_features2d.so \
    ' `5 \( {7 M# K; @' h* N        /usr/local/opencvARM/lib/libopencv_flann.so \
    2 G% A+ o( _% l4 C  Q        /usr/local/opencvARM/lib/libopencv_gpu.so \
    : K4 v- S, b/ ?8 P        /usr/local/opencvARM/lib/libopencv_highgui.so \! y& c3 q" K+ U+ I2 X0 H) v
            /usr/local/opencvARM/lib/libopencv_imgproc.so \
    4 i( l  |) M9 U        /usr/local/opencvARM/lib/libopencv_legacy.so \
    4 c, c: _, s* H+ d; K        /usr/local/opencvARM/lib/libopencv_ml.so \' q2 p+ J( H9 c/ r, A& c( U
            /usr/local/opencvARM/lib/libopencv_nonfree.so \
    ' v( h( i) T2 i: e        /usr/local/opencvARM/lib/libopencv_objdetect.so \
    ; z4 K7 W1 K; \: }" S% U% [1 X. W        /usr/local/opencvARM/lib/libopencv_photo.so \
    % t9 u: ^; `7 V8 s$ I        /usr/local/opencvARM/lib/libopencv_stitching.so \. O+ K! K* f' y, A
            /usr/local/opencvARM/lib/libopencv_superres.so \/ F, O6 A6 ]( t+ M
            /usr/local/opencvARM/lib/libopencv_video.so \$ Q0 y: z6 @1 V; K/ T; l- e
            /usr/local/opencvARM/lib/libopencv_videostab.so, h1 ?  w0 B4 F. y" {6 }: N; t

    - M0 Y) s3 G# l: @7 w5 y  }至此,一切工作已经完成3 [- R  ?4 f, E5 U
    7 v6 A# d; v. ]+ f2 m2 P! r
    七.编程测试5 M2 g' u# S- j$ k
    此处感谢CSDN博主   心中唯有此愿  的博文http://blog.csdn.net/jiebaoabcabc/article/details/22935185
    & m. j- k' l+ ]8 u. b     整个工程见云盘build-thatsit-Altera_SoC_FPGA_Kit-Release 目录/ @6 A* a+ G! }# R% n# Y
    1.新建swith.cpp, 复制上IplImage与QImage间转换用代码(这个非常有用), I% I- A9 l: U; q. x+ @* k
    • #include "switch.h"
    • ImageCVtoQT::ImageCVtoQT(IplImage *_srcImage)
    •     :srcImage(_srcImage)
    • {
    •     assert(srcImage != NULL);
    •     width = srcImage -> width;
    •     height = srcImage -> height;
    •     channel = srcImage -> nChannels;
    • }
    • ImageCVtoQT::~ImageCVtoQT()
    • {
    •     cvReleaseImage(&srcImage);
    • }
    • const QImage ImageCVtoQT::getQtImage()
    • {
    •     QImage desImage = QImage(width, height, QImage::Format_RGB32);
    •     for(int i=0; i
    •     {
    •         for(int j=0;j
    •         {
    •             int r,g,b;
    •             if(RGB_TYPE == channel)
    •             {
    •                 b = (int)CV_IMAGE_ELEM(srcImage, uchar , i, j*3+0);
    •                 g = (int)CV_IMAGE_ELEM(srcImage, uchar , i, j*3+1);
    •                 r = (int)CV_IMAGE_ELEM(srcImage, uchar , i, j*3+2);
    •             }
    •             else if(GRAY_TYPE == channel)
    •             {
    •                 b = (int)CV_IMAGE_ELEM(srcImage, uchar, i, j);
    •                 g = b;
    •                 r = b;
    •             }
    •             desImage.setPixel(j, i, qRgb(r, g, b));
    •         }
    •     }
    •     return desImage;
    • }
    • /////////////////////////////////////////////////////////////////////
    • ImageQTtoCV::ImageQTtoCV(QImage _srcImage)
    • :srcImage(_srcImage)
    • {
    •     assert(!srcImage.isNull());
    •     width=srcImage.width();
    •     height=srcImage.height();
    • }
    • ImageQTtoCV::~ImageQTtoCV()
    • {
    • }
    • IplImage *ImageQTtoCV::getCvImage()
    • {
    •     IplImage *desImage=cvCreateImage(cvSize(width,height),8,3);
    •     for(int i=0;i
    •     {
    •         for(int j=0;j
    •         {
    •             QRgb rgb=srcImage.pixel(j,i);
    •             CV_IMAGE_ELEM(desImage,uchar,i,j*3+0)=qBlue(rgb);
    •             CV_IMAGE_ELEM(desImage,uchar,i,j*3+1)=qGreen(rgb);
    •             CV_IMAGE_ELEM(desImage,uchar,i,j*3+2)=qRed(rgb);
    •         }
    •     }
    •     return desImage;
    • }
      " k9 f9 ?$ F; j0 T: U6 S

    : _1 f! }- s. Z5 i. ]+ O7 Z

    $ q! X+ L. w5 w) b7 s2.新建switch.h头文件9 C/ _) B5 `- b) O6 L. t
    • #ifndef SWITCH_H
    • #define SWITCH_H
    • //#include "highgui.h"
    • #include "cv.h"
    • #include "cxcore.h"
    • #include
    • #define RGB_TYPE  3
    • #define GRAY_TYPE 1
    • class ImageCVtoQT
    • {
    • public:
    •     ImageCVtoQT(IplImage *_srcImage);
    •     ~ImageCVtoQT();
    •     const QImage getQtImage(void);
    • private:
    •     IplImage *srcImage;
    •     //QImage desImage;
    •     int width;
    •     int height;
    •     int channel;
    • };
    • class ImageQTtoCV
    • {
    • public:
    •     ImageQTtoCV(QImage _srcImage);
    •     ~ImageQTtoCV();
    •     IplImage *getCvImage(void);
    • private:
    •     QImage srcImage;
    •     int width;
    •     int height;
    •     //int channel;
    • };
    • #endif // SWITCH_H$ K+ r/ G1 O3 c
    : J( @/ Z& K. |& K* X: `# M! o
    3.在界面文件中拉入一个lable,将其展开与窗体同大小
    9 L# P, [6 Z1 z9 |' H4.在dialog的构造函数中进行图像的导入和转换,过程是QImage导入图片-> 原始IplImage->opencv对原始IplImage进行处理->处理后IplImage->QImage->使用QImage借助qt窗体上显示图片
    9 _$ J# j: Q% p+ ?) Z5.dialog.cpp' l. ~# j) F6 m3 ~: F# y9 c( U
    • #include "dialog.h"
    • #include "ui_dialog.h"
    • #include "switch.h"
    • #include "QtGui"
    • Dialog:ialog(QWidget *parent) :
    •     QDialog(parent),
    •     ui(new Ui:ialog)
    • {
    •     ui->setupUi(this);
    •     //声明IplImage指针
    •     IplImage *pImg = NULL;
    •     QImage *qImg = new QImage;
    •     //载入图片
    •     if(!(qImg->load("/home/project/sao22.bmp")))  // 我的开发板支持bmp格式,小心路径
    •     {
    •         return;
    •     }
    •     //switch
    •     ImageQTtoCV qtc(*qImg);
    •     pImg = qtc.getCvImage();
    •     if(!pImg)
    •         return;
    •     IplImage *pGrayImg = NULL;
    •     pGrayImg = cvCreateImage(cvGetSize(pImg), IPL_DEPTH_8U, 1);
    •     cvCvtColor(pImg, pGrayImg, CV_BGR2GRAY);
    •     ImageCVtoQT ctq(pGrayImg);
    •     *qImg = ctq.getQtImage();
    •     if(!qImg)
    •         return;
    •     ui->label->setPixmap(QPixmap::fromImage(*qImg));
    • }
    • Dialog::~Dialog()
    • {
    •     delete ui;
    • }( m! o7 k: P, v; k9 M/ P9 D
    从一切完成,从Release目录中拷贝相应的elf文件和即可在开发板上运行,miao..........) E- {: R9 A2 E2 i
    ! B" U; y& a6 R& d3 T
    # _$ J0 X4 e& C% p1 e" B0 x, `

    该用户从未签到

    2#
    发表于 2019-4-18 17:25 | 只看该作者
    发帖是心得 回帖是美德
    您需要登录后才可以回帖 登录 | 注册

    本版积分规则

    关闭

    推荐内容上一条 /1 下一条

    EDA365公众号

    关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

    GMT+8, 2025-10-9 03:18 , Processed in 0.156250 second(s), 23 queries , Gzip On.

    深圳市墨知创新科技有限公司

    地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

    快速回复 返回顶部 返回列表