找回密码
 注册
关于网站域名变更的通知
查看: 470|回复: 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)
    9 I* Z: ]6 r3 z0 U. k/ L; j
    百度云盘地址:http://pan.baidu.com/s/1dDAbeYd
    3 e7 R3 `, C5 w% H0 d' ?6 G系统:              ubuntu-14.04-desktop-i386. c! \9 S) [2 k- ?  ~9 u
    ARM 系统:    DE1_SoC_FB
    ; ]3 T. {6 s( ~/ s3 P: {虚拟机工具:      VMware-workstation-full-10.0.1) f. t7 ]  p! b
    opencv:           2.4.7+ t: I; H! \& e# p
    qt:                    qt-linux-opensource-5.2.0-x86offline.run
    6 z- y9 f8 e  d! f: Z0 K交叉编译器:    gcc-linaro-arm-linux-gnueabihf-4.7-2012.11-20121123_linux
    / ^  J+ o. p$ E% r* ~7 ncmake:             2.8.12.2  B4 p0 B5 R. d9 U% [8 K
    , C; [" \0 l4 E$ z2 b7 D- {$ S% N# E
    3 \  K( F3 r. u. R. P9 D7 a
    一.准备工作:' E3 `' u2 f; J. y* f- H) @# q
    1.安装虚拟机的步骤无需多言,装完后记得重启;$ X- M, e/ N- w* P- b$ H3 O6 |
    2.            $sudo apt-get update  
    4 N/ u5 b. p  Z" w# g: G$ @. c3 s                $sudo apt-get upgrade * }( \8 `4 x! s( E: E2 r4 P4 `: ~  a
    3.安装x86的工具链
    9 x. x1 R' r" [; C$ Z/ l                $sudo apt-get install build-essential libgl1-mesa-dev 7 e; c0 e: K) a( Y5 V# c# s
    1 O) m* Y! a2 h
    二. 配置交叉编译器
    3 m, [* m# ^! M1 K* t. X       我云盘中提供的是gcc-linaro-arm-linux-gnueabihf-4.7-2012.11-20121123_linux.tar.bz2,版本为4.7.3
    $ A& r) Z0 l  W& Q9 X. ?: j$ Q       cd到相应目录
    - p' n- R1 X% Y       $tar xjf gcc-linaro-arm-linux-gnueabihf-4.7-2012.11-20121123_linux.tar.bz2
    2 V3 |1 h. K! n; |/ y       修改PATH0 b% i, y! K3 _7 {
           $gedit ~/.profile
    ; D" [  ?% [9 U       在文件末尾加上$ @6 x5 q% Z% m2 I/ g' o! [9 S
           export PATH=/home/yulebron/gcc-linaro-arm-linux-gnueabihf-4.7-2012.11-20121123_linux/binPATH! N2 v3 g+ p$ z: Z* i% O% _
           一定要根据你的安装目录修改路径(下同)/ D' _- m. M* W2 k; z! z! c
            保存退出后$source ~/.profile9 y: E* i0 C- @/ _9 `2 w( W& Z- L
    3 Q) t# Q! w, z

    ! n5 w2 I( z# I/ Z& K三.安装QT1 G5 d9 ^. }& h9 ~/ A/ Z
    1.下载QT: C% r6 t. \# `4 r7 u( p
           http://download.qt-project.org/official_releases/qt/5.2/5.2.0/ 选择qt-linux-opensource-5.2.0-x86offline.run (也可以下载我云盘中提供的,下同)
    6 @+ }6 M; }7 ?  C2.安装# e. \/ C2 Z; r; J+ `! U
           进入相应目录* ~) h8 j+ j8 p0 s0 `" l
           $chmod +x qt-linux-opensource-5.2.0-x86-offline.run ( u+ S8 Y, T9 Q# p
           $./qt-linux-opensource-5.2.0-x86-offline.run- R/ L* W- E0 X# S( u/ s
        一路next,安装完毕
    7 y4 `, C) U* ]# n" z- f# v) G3.构建QT的ARM库
    2 ~$ f" G) U# M2 m+ J& c) g, P* H       下载地址:http://qt-project.org/downloads 选择Qt libraries 4.8.6 for embedded Linux6 t: b* f* M% m
            cd到相应目录,解压* q7 s, @& C) n/ ]2 q
            $tar -zxvf qt-everywhere-opensource-src-4.8.5.tar.gz
    4 E6 Z% {/ ]& R2 s$ d8 X/ @* p4.为ARM创建mkspecs
    , d7 a( E% p3 G5 ^4 c6 l        cd到qt-everywhere-opensource-src-4.8.5/mkspecs/qws 目录下, \5 ]' i: r7 s; i
            以下步骤根据自己的编译器名称进行修改!!!4 y0 k8 m5 J+ y1 y
    重命名编译器linux-arm-gnueabi-g++) r1 g* D/ j$ \" ^
            $cp -r linux-arm-gnueabi-g++ linux-arm-gnueabihf-g++
    8 y9 Z% ~: N4 Y  L% s; F        修改配置/ S! F! r. C( k
            $cd linux-arm-gnueabihf-g++
    ; I, _- L+ N; T        $gedit qmake.conf
    * T" O5 E0 p6 D5 ^3 o: R; Z) _        将所有的arm-none-linux-gnueabi用linux-arm-gnueabihf替换,如图
    & C, `$ U+ n4 ~# p2 S( ~/ f- r, w2 m
    $ r# w( Z" z: {' k; Z7 ~
    ) w8 |' q& q8 _2 T" a0 }: K         
    ( C/ Q% t1 u4 V  J, k, q! G5 U        安装QT库, @; O; ]1 ?) p6 m
            $source ~/.profile/ Q& a, k" \' k) b7 ?  \
            $cd ~/Downloads/qt-everywhere-opensource-src-4.8.6
    ! _' `3 z$ P- _$ c        $ ./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
    . a* S. y& V* @1 s1 x        弹出选项中选择o,随后选择yes' c/ U6 _1 c/ w" q; `  ?
    4 f& G- J' x" \& v6 I
            $make
    ; b$ {6 c! B% S+ @7 C        $sudo make install8 P0 ~1 `* m" v( m" }' d
            注意make这一步会跑数小时
    % N/ f: B( G$ h* O5.QT中设置ARM的开发套件8 N% b  m& W% Q3 ^3 v5 q! Y
            选择Tools—Options ...2 b; ~6 o3 \( x! h2 C+ k! B0 P
    ! Q( R4 ]. H8 R  o" J& C
              & ]) W) o4 P7 ~+ O
    编译器路径为之前安装的编译器中的g++(注意图中是4.8.5,我们用的是4.8.6)
    / F% c# p1 k; s; e& Q8 E , _1 m+ h& j1 u4 Z
    2 X; Z2 r. D/ D1 U# `

    4 [5 h: M4 y9 p2 p0 z8 K; z% b7 mKits Setup :
    7 M) ?4 X9 F! M: p3 r
            Name: Altera SoC FPGA Kit " s. d5 n3 q6 o
            Device Type: Select “Generic Linux Device”
    : `  h8 k$ {) p) T  U        Compiler: Select “GCC (Altera SoC)” . F  S, T" Y# L& Y
            Qt Version: Select “(Qt 4.8.6 (qt-4.8.6-atera-soc)”
    " g* R, x) V7 p 3 l. G: `$ N6 \2 A

    ! V) Y/ g  [: ~; H& h
    " D+ `% s% g  }# }6 A  O
    以后的编程中如下选择即可生成ARM上可用的可执行文件,在相应文件夹中找到然后拷到ARM中即可
    / k2 v0 ]8 w: M% @# y6 ]" B, k
    0 X, i0 Q2 |% Q: _' U2 C9 F3 z/ d& E+ w' [& V' V6 H/ g, q4 {/ v
    5.拷贝QT库到ARM上
    + Y! |" k9 T  b) X0 P. h        $ cd /usr/local - ^/ J% R/ k7 x
            $sudo tar -jcv -f qt-4.8.6-altera-soc.tar.bz2 qt-4.8.6-altera-soc
    * A9 E0 L7 ^# [: e/ V3 Y        将生成的的压缩文件拷贝到ARM的相应目录下解压即可3 B- ~( Z) s* w* J8 K( ]

    8 @+ Y" w4 u0 H- Z4 A& R( Z四.安装opencv的准备6 W+ j5 \8 W/ M/ K! h4 H9 h5 z
    1.安装Synaptic Package Manager
    8 {, z$ j$ n+ s* r6 \2.启动Synaptic
    & W3 C2 [/ U* m  e5 s        $sudo synaptic
    & d  d9 O3 {! S$ P! x        依次点击Reload, Mark All Upgrades, Apply
    . @/ h- x4 q: j, H3.安装zlib,png,jpeg
    7 E& v" E, n0 B4 I        在搜索栏中输入png,mark libpng 12-0 为安装,点击apply,如图% o7 |( Z6 I7 t$ Q. @$ \

    ; H. V4 H5 G; N* v! Y1 k1 T# x/ o% t
    5 o) q8 G$ l* B
    同上,输入jpeg, 安装jpeg62
    ) T1 E9 L! |  t
              输入zlib, 安装zlib1g ) I$ U9 O$ [! z
              输入cmake, 安装cmake, cmake-qt-gui/ p, L8 ?/ b, U1 M, p# U

    ; |$ P  C. e7 h+ a- G五.安装opencv
    , Q. B( ~; l/ x! \, V* Q! v下载opencv源码,并解压,新建一个文件夹用来包含创建编译opencv库时候的配置文件(/home/yulebron/work/opencvARM),另外在在/usr/local中创建一个opencvARM文件夹
    * n8 W3 p" O+ X( Y  B        $cmake-gui) K' }2 w3 o+ e- {4 J" |

    9 l- X. Y, f' q* o: R& a- _! H7 Z         
    6 ^2 {+ X4 y6 ]$ n8 r3 f3 w$ d - k7 H1 ~/ J, w  i9 t
    ' D" s; j- Q1 w& E; F6 a/ C
    此时会报错,因为默认勾选了一下未安装的选项,此处,我在with中只会留下with_jpeg和with_png

    ' [9 \4 g7 a1 E9 r , F# W6 M4 l% [

    ' `' B. I3 E  t修改CMAKE_INSTALL_PREFIX为你将安装的目录,即为/usr/local/opencvARM

    4 [8 J( `$ R' t1 h9 b- s' [' w$ R. r一切ok, 点击generate& X/ t8 \. |, i2 n/ V- h
    进入/home/yulebron/work/opencvARM! {+ l  O: _6 h5 }4 i
            $vim CMakeCache.txt# W/ n( ~- \& d5 v
    修改   CMAKE_C_FLAGS:STRING=-fPIC
    0 u: n% v5 t2 p" j1 Y          CMAKE_EXE_LINKER_FLAGS:STRING=-pthread -lrt
    9 N) x- G' K8 c保存并退出
      ?0 e) J3 c/ W% V        $make
    # Z+ L. z2 I* s        $sudo make install
    - g: L3 q  q% `1 D2 `! [将生成的/usr/local/opencvARM/lib中的文件拷贝到ARM的相应目录中, P; D* e: |+ m9 E& B" r
    " T( v( H6 I! y. n2 C+ x  z6 w3 t. W
    六.QT中包含opencv库2 m! W3 V" I0 o- Q/ C) `
    在.pro文件中添加如下语句,由于对opencv的库不是很了解,我将所有的库都包含了进去
    ( f# Z! Q- n9 e7 @3 SINCLUDEPATH += /usr/local/opencvARM/include/opencv \
    , _* U7 l% ^& G               /usr/local/opencvARM/include/opencv2 \
    ! V+ u. k0 t4 n) F: X               /usr/local/opencvARM/include. |/ z% b6 i+ M* k7 R& N+ j

    , {  V; E# n. g: P% v) h* L2 N7 lLIBS += /usr/local/opencvARM/lib/libopencv_calib3d.so \
    # j  H$ D+ n: T& G" ~0 S) k        /usr/local/opencvARM/lib/libopencv_contrib.so \
    - L0 z8 O% @; R5 a, |& X# ?- M        /usr/local/opencvARM/lib/libopencv_core.so \% L0 f8 P( l$ `: ~0 Q
            /usr/local/opencvARM/lib/libopencv_features2d.so \
    ) `$ w- Z" e# I  U, s        /usr/local/opencvARM/lib/libopencv_flann.so \
    * ?4 p) e* z3 ]) `5 i4 Z% Q        /usr/local/opencvARM/lib/libopencv_gpu.so \, \6 I8 ?, q- t
            /usr/local/opencvARM/lib/libopencv_highgui.so \
    # K9 s1 ?; a. x! h) ^; g5 G+ n8 V        /usr/local/opencvARM/lib/libopencv_imgproc.so \8 U$ l, f8 r% Q' C# K6 t+ a( ~
            /usr/local/opencvARM/lib/libopencv_legacy.so \
    ( `+ b- f3 n- V/ F; q        /usr/local/opencvARM/lib/libopencv_ml.so \
    / G8 T  [# Q% o* Q' i8 G: m7 p        /usr/local/opencvARM/lib/libopencv_nonfree.so \6 @! `) k( g6 f5 g5 D$ ]5 ?
            /usr/local/opencvARM/lib/libopencv_objdetect.so \4 w4 G. N1 F: J
            /usr/local/opencvARM/lib/libopencv_photo.so \" C3 f# i3 f2 S3 b5 {' V1 D) x, W; A
            /usr/local/opencvARM/lib/libopencv_stitching.so \
    ' U: U  U7 V# q& e2 x        /usr/local/opencvARM/lib/libopencv_superres.so \
    - [' z, m- A& G& e, S' K        /usr/local/opencvARM/lib/libopencv_video.so \9 {! F' `7 P6 M3 F2 }
            /usr/local/opencvARM/lib/libopencv_videostab.so
    / C1 `% s# Z0 p, d; Y* f) y# c
    $ ^6 y+ H" N1 y6 ^9 \" {  [
    至此,一切工作已经完成; o* s6 z" S& w& M/ q; j% Y
    : ]" d: l4 G0 e. L* M4 Z
    七.编程测试
    0 L+ d* C# H+ W9 B) Q# w此处感谢CSDN博主   心中唯有此愿  的博文http://blog.csdn.net/jiebaoabcabc/article/details/22935185 # B. ]" F, ^: [, V7 C3 X7 O
         整个工程见云盘build-thatsit-Altera_SoC_FPGA_Kit-Release 目录. P8 W' q- K3 T( d6 O' h
    1.新建swith.cpp, 复制上IplImage与QImage间转换用代码(这个非常有用)
    : f3 N# o0 I# n/ b' C6 Z
    • #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;
    • }. |2 f& b" s2 w2 s0 ^# x. N

    , O3 I/ `1 a; M: Q1 g
    7 H9 _" ^8 A( T* X/ C% e2 ^7 Q
    2.新建switch.h头文件
    6 @0 H1 K4 w* w2 j' |. i
    • #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) K7 x6 L/ `5 R. n
    + t) b  v! u5 E$ _2 I8 I/ k
    3.在界面文件中拉入一个lable,将其展开与窗体同大小
    5 Q' h0 ~# N: w; t4.在dialog的构造函数中进行图像的导入和转换,过程是QImage导入图片-> 原始IplImage->opencv对原始IplImage进行处理->处理后IplImage->QImage->使用QImage借助qt窗体上显示图片
    3 f' H# N9 q' ^5.dialog.cpp: h, E% J# \1 B/ L; J
    • #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;
    • }* z8 j# E1 a& e( b
    从一切完成,从Release目录中拷贝相应的elf文件和即可在开发板上运行,miao..........
    , P$ \3 Y/ j8 Z5 P6 \8 Z4 k+ J1 }4 G  G: r

    7 t- r* x- G- k5 N  v$ M

    该用户从未签到

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

    本版积分规则

    关闭

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

    EDA365公众号

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

    GMT+8, 2025-8-1 05:52 , Processed in 0.125000 second(s), 23 queries , Gzip On.

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

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

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