找回密码
 注册
关于网站域名变更的通知
查看: 469|回复: 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)

    # B7 v5 s: c# l; G- M百度云盘地址:http://pan.baidu.com/s/1dDAbeYd
    : L7 I4 ?" n! m9 Q  F" A& \系统:              ubuntu-14.04-desktop-i386
    . M  l1 M2 D6 M- P" I1 QARM 系统:    DE1_SoC_FB  M$ }, G5 a6 v/ b; Z% @( ]* h
    虚拟机工具:      VMware-workstation-full-10.0.12 t. T& Y2 B' C- k: q- f  \. w
    opencv:           2.4.7) ^1 j6 e0 ^8 W' K
    qt:                    qt-linux-opensource-5.2.0-x86offline.run
    + d' t  @3 l) L7 y. T" s+ s交叉编译器:    gcc-linaro-arm-linux-gnueabihf-4.7-2012.11-20121123_linux0 k- }. S$ w0 j* N0 K' m' G
    cmake:             2.8.12.2
    " Y) a* `- o' q; K0 N( r2 O) e# z1 |3 V8 Z% _* a
    , @( m  O/ C6 |0 ]
    一.准备工作:
    ( k4 {8 d, m' O3 A1.安装虚拟机的步骤无需多言,装完后记得重启;
      c, l# G( S  n  A3 z' |2.            $sudo apt-get update  
    $ y8 P- Y/ {% l' v                $sudo apt-get upgrade
    0 _  S7 |3 I- v8 v, @& {3.安装x86的工具链- Y# E( ]. S! V% b& P2 Y
                    $sudo apt-get install build-essential libgl1-mesa-dev
    $ w$ m$ ]$ Z' J6 N# k& Y! h0 s) h# h4 [0 T- k3 I% @6 k
    二. 配置交叉编译器
    " i3 e' t' Z2 R       我云盘中提供的是gcc-linaro-arm-linux-gnueabihf-4.7-2012.11-20121123_linux.tar.bz2,版本为4.7.3/ [. M7 I) m8 M- c8 P
           cd到相应目录+ y1 L8 f' c; ~1 ?& [
           $tar xjf gcc-linaro-arm-linux-gnueabihf-4.7-2012.11-20121123_linux.tar.bz2 & o9 U# F; x6 R' H
           修改PATH" O' w* q8 x* M) [6 `0 b6 `
           $gedit ~/.profile7 `* t6 Z6 L1 I0 i/ ?0 U/ y* D/ p
           在文件末尾加上
    ! n: D; V. L- p2 L2 M       export PATH=/home/yulebron/gcc-linaro-arm-linux-gnueabihf-4.7-2012.11-20121123_linux/binPATH, ^/ M) u8 X0 ^) x0 i2 b/ h( a1 b
           一定要根据你的安装目录修改路径(下同)2 a+ {2 W" r( Z8 e! I
            保存退出后$source ~/.profile: [- b, f! c' ?( ?
    . L  E$ ]( q* r& Y; Y- F

    $ h/ ^: P4 K' ]! K; P$ C; ]$ n# }三.安装QT  Q/ L; C& s7 \8 B6 c
    1.下载QT
    ' l8 j( a# f% v6 w, ^       http://download.qt-project.org/official_releases/qt/5.2/5.2.0/ 选择qt-linux-opensource-5.2.0-x86offline.run (也可以下载我云盘中提供的,下同)
    % F% H6 B6 X- t2.安装
    $ H  ]7 Y- I3 B* t6 c: S       进入相应目录
    ) H8 ~+ H' ^1 c* A       $chmod +x qt-linux-opensource-5.2.0-x86-offline.run
    & Z! U" K" G9 `2 X7 ]! ]* O  Q       $./qt-linux-opensource-5.2.0-x86-offline.run
    , r; a! i% _( m2 w5 M8 @    一路next,安装完毕3 c  C& @/ k8 V% W0 i6 @
    3.构建QT的ARM库4 [  w+ M- O6 n- k  V
           下载地址:http://qt-project.org/downloads 选择Qt libraries 4.8.6 for embedded Linux) U7 A- n* p) ~  F6 U" M
            cd到相应目录,解压
    - @- `3 s9 W/ R$ V, U, J        $tar -zxvf qt-everywhere-opensource-src-4.8.5.tar.gz
    # Y& [/ x: K0 {2 w4.为ARM创建mkspecs
    3 P& Y& [. _/ s: \& d/ F1 x        cd到qt-everywhere-opensource-src-4.8.5/mkspecs/qws 目录下4 v1 y% |, a% f4 L! G
            以下步骤根据自己的编译器名称进行修改!!!8 U% A4 p4 f+ u8 I+ t6 T* ^; e  l
    重命名编译器linux-arm-gnueabi-g++
    . u: o4 a: u* [; t1 j' T" f, m        $cp -r linux-arm-gnueabi-g++ linux-arm-gnueabihf-g++
    0 v; h  l& M: C4 B' m) z# H        修改配置, a" t0 W- Z2 n: P% r
            $cd linux-arm-gnueabihf-g++6 p2 [- W2 w9 s
            $gedit qmake.conf
    ' q; x3 V0 [) D! d7 m. I+ Y        将所有的arm-none-linux-gnueabi用linux-arm-gnueabihf替换,如图
    5 p' K. E- P1 a! x2 Y
    ; v! o1 d2 @! j- a) s1 }& e 1 y( q+ s4 R: f2 Q
             
    - F) Q0 T( e* f2 M/ L9 A        安装QT库5 a% s$ M1 V  s
            $source ~/.profile
    4 y4 {& V% O  P; J% J. v        $cd ~/Downloads/qt-everywhere-opensource-src-4.8.6
    / B; B) O1 y5 c! }0 C2 O' m        $ ./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
    ! ]' p2 K8 I5 s! U( X& n8 P; {        弹出选项中选择o,随后选择yes
    9 K# V3 r9 h' G* |6 U; o  P, e  L4 D$ m8 j
            $make3 Q% {6 E2 W. N4 J4 s" O7 w/ y8 S
            $sudo make install) I) D7 D, s2 @
            注意make这一步会跑数小时
    0 S9 F6 p2 g+ a) J5.QT中设置ARM的开发套件: a& d1 }: r$ k( u6 o2 U
            选择Tools—Options ...; O+ T4 ]) S& a( U1 N# }

    6 N9 l/ E9 a; b. z- w0 s% T          & J: ?% E- G, }( m
    编译器路径为之前安装的编译器中的g++(注意图中是4.8.5,我们用的是4.8.6)- B0 G7 C% J0 F; W% a+ O) |( N6 l
    : w8 c, P) {5 O$ ]; O9 [

    7 P, m: f, l: P% [7 b, v6 S$ V4 N! D& L$ {% A+ u
    Kits Setup :
    0 q; J' H( h3 E$ m" ^/ z' l
            Name: Altera SoC FPGA Kit % V2 n) u5 ?3 ?# |0 h  x- [
            Device Type: Select “Generic Linux Device” ) ]3 z; ?4 l( w3 I8 `- ?
            Compiler: Select “GCC (Altera SoC)” ' C% t. a. Q. G5 N' P, G( s
            Qt Version: Select “(Qt 4.8.6 (qt-4.8.6-atera-soc)”. s7 Q# p2 X8 B8 Q' X$ y' A
    1 z1 `( A# k! v% o- _& c7 Y

    # d. Q3 N- n) m, U1 V6 J

    . {1 J9 Z. U& x9 J7 K/ _+ k以后的编程中如下选择即可生成ARM上可用的可执行文件,在相应文件夹中找到然后拷到ARM中即可
    $ W' T/ W% r  C5 [3 Y* \ $ t8 M6 H5 L7 E2 _- r

    7 N% n" t7 N2 U$ x5.拷贝QT库到ARM上7 a0 ?# P1 l6 X8 M6 s
            $ cd /usr/local , n0 ]1 n  B) A5 `+ t
            $sudo tar -jcv -f qt-4.8.6-altera-soc.tar.bz2 qt-4.8.6-altera-soc/ i2 u  ^- `' o* {
            将生成的的压缩文件拷贝到ARM的相应目录下解压即可
    8 E) H$ ]* I! r* Y  s1 P; i. G' F0 i
    四.安装opencv的准备; [3 A5 C+ V; b8 n2 z  E
    1.安装Synaptic Package Manager
    8 Y$ ?- ?3 V* q$ \: Q9 a2.启动Synaptic
    . z! |* L3 L  k, G% S5 f! V        $sudo synaptic
    ; |2 J. _0 Y' t5 l8 L1 O* {        依次点击Reload, Mark All Upgrades, Apply4 b" \1 G& Z* ~  r# l5 h
    3.安装zlib,png,jpeg
    ( U. ~, c0 e4 v+ L) v        在搜索栏中输入png,mark libpng 12-0 为安装,点击apply,如图
    $ `# D% j- C) o  o* s; j) i& T & w- {3 o: X& `% A  K& j: ^

    6 U! V4 y0 a, r! s$ p" p' t3 t/ b/ ?7 A9 l0 Q
    同上,输入jpeg, 安装jpeg62
    + q1 x/ b5 u9 c& U: c6 g
              输入zlib, 安装zlib1g . j% U5 D3 I! {: C) ]: [5 o& K
              输入cmake, 安装cmake, cmake-qt-gui5 y# G( n8 D- Z4 _& M

    # l. K; ]% h- N& C五.安装opencv
    : \. a5 |8 \( G8 D# J( a下载opencv源码,并解压,新建一个文件夹用来包含创建编译opencv库时候的配置文件(/home/yulebron/work/opencvARM),另外在在/usr/local中创建一个opencvARM文件夹7 `1 c$ T. i! t6 I3 [" X) ^' m
            $cmake-gui" g- ?7 x$ k- A! l' q0 K
      W) G* V, U6 o& i/ j& e
              8 k) F) [4 u( G& B9 u
    - ?% O1 @* K% h, |' B( N
    + b6 R. [, R6 D# Q4 [+ m( [
    此时会报错,因为默认勾选了一下未安装的选项,此处,我在with中只会留下with_jpeg和with_png

    7 ?% R) h& L! F/ Y ) P9 H1 O- i: r+ H5 s$ O5 s% y
    6 r+ [" y; }6 @" w' ]
    修改CMAKE_INSTALL_PREFIX为你将安装的目录,即为/usr/local/opencvARM

    $ `+ B3 X( A+ C* y+ U一切ok, 点击generate
    # L/ q' C* Z' |' l* b  q进入/home/yulebron/work/opencvARM# N, |! v2 T6 I' H8 x
            $vim CMakeCache.txt
    0 Z; B" X$ b" ?  z% W# K" e% q! n6 `修改   CMAKE_C_FLAGS:STRING=-fPIC
    1 u9 P. H  w7 _2 g          CMAKE_EXE_LINKER_FLAGS:STRING=-pthread -lrt' i+ |4 b: _  F6 M
    保存并退出
    # R( X6 ^! M1 O1 D1 N        $make
    , ~( F4 _; c, B4 T( N/ S( k        $sudo make install
    + Q- V: |) p( S" `- I3 @将生成的/usr/local/opencvARM/lib中的文件拷贝到ARM的相应目录中! x* n1 d+ C4 |% B: M- ]4 g( l
    % `! C3 C- d9 k+ {
    六.QT中包含opencv库" @, A4 B* Q% T0 J# R, F" Q- Z
    在.pro文件中添加如下语句,由于对opencv的库不是很了解,我将所有的库都包含了进去
    1 Y; x# w8 Y. T, Q: U# Y6 M( {( ~INCLUDEPATH += /usr/local/opencvARM/include/opencv \6 V+ n% J; ~( M. {2 C5 C
                   /usr/local/opencvARM/include/opencv2 \
    - T4 C/ B6 ^/ F) D$ h               /usr/local/opencvARM/include
    , e* {. b- ]8 ]+ H5 t5 |4 A$ G' k2 D7 x6 [' c' V
    LIBS += /usr/local/opencvARM/lib/libopencv_calib3d.so \
    : q9 Q" s! h. f4 Z3 l3 c4 Q$ u" l        /usr/local/opencvARM/lib/libopencv_contrib.so \
    . n! \- ^6 o6 E+ R/ i/ i- k/ M% }8 o9 l        /usr/local/opencvARM/lib/libopencv_core.so \
    ! J4 e  Q9 L0 a  G( U        /usr/local/opencvARM/lib/libopencv_features2d.so \" Q: }2 r& Z7 @' n0 B( w
            /usr/local/opencvARM/lib/libopencv_flann.so \$ H0 e2 u) e5 S5 Z' ]3 [: d" G
            /usr/local/opencvARM/lib/libopencv_gpu.so \
    8 X& K8 m9 a& j4 G7 B4 K        /usr/local/opencvARM/lib/libopencv_highgui.so \& Z" p6 t1 ~  M) X! G4 [
            /usr/local/opencvARM/lib/libopencv_imgproc.so \
    " {2 e: u' [# G$ @1 X4 C        /usr/local/opencvARM/lib/libopencv_legacy.so \
    0 m' J$ K& Z# C        /usr/local/opencvARM/lib/libopencv_ml.so \7 s( d3 R6 @) |  H0 d2 m
            /usr/local/opencvARM/lib/libopencv_nonfree.so \
    # m" j( ]) T6 V- m8 D0 x        /usr/local/opencvARM/lib/libopencv_objdetect.so \9 j% F: u4 f5 r+ i2 ^
            /usr/local/opencvARM/lib/libopencv_photo.so \
    8 K. W* c- K; w1 ?6 H" S6 M        /usr/local/opencvARM/lib/libopencv_stitching.so \1 e: _' i- f0 z$ J3 L" ]
            /usr/local/opencvARM/lib/libopencv_superres.so \) Q3 Z2 j1 f7 L& H; ^- i9 U7 Q% y
            /usr/local/opencvARM/lib/libopencv_video.so \
    $ Q5 _. H: E; D, h6 p" G        /usr/local/opencvARM/lib/libopencv_videostab.so
    + y# y8 G% O3 u3 _7 z3 R* e
    ' V# t$ z3 v& y$ N) k' _- `
    至此,一切工作已经完成
    ! A. G7 E$ B" w. `# f7 @1 ^! S" ^8 i% t, J0 F1 X4 f8 k+ D7 z6 j
    七.编程测试9 L2 @, D0 ?& _. _2 N
    此处感谢CSDN博主   心中唯有此愿  的博文http://blog.csdn.net/jiebaoabcabc/article/details/22935185
    % R0 G+ `9 z6 C4 J3 J; i+ H$ ]     整个工程见云盘build-thatsit-Altera_SoC_FPGA_Kit-Release 目录0 W" o/ t- `) F/ X
    1.新建swith.cpp, 复制上IplImage与QImage间转换用代码(这个非常有用)! a2 d+ F- ^  J& u& G( m% r( 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;
    • }$ {. m! D- }& y) e* P+ \# A5 R

    3 S6 r' p$ Y! ]2 w8 H* O
    3 Q; v5 S4 t3 p8 }6 X. W; E
    2.新建switch.h头文件
    3 r5 L% [/ I" h& R) @7 b7 g3 B
    • #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
      4 s/ t7 P$ s# i; }+ i. e5 C- p

    # o; W# f+ `4 Y: }3 ~4 \% u. [3.在界面文件中拉入一个lable,将其展开与窗体同大小+ _) K: A8 S. `) _- L9 `: f0 w
    4.在dialog的构造函数中进行图像的导入和转换,过程是QImage导入图片-> 原始IplImage->opencv对原始IplImage进行处理->处理后IplImage->QImage->使用QImage借助qt窗体上显示图片
    3 N$ Z  x; u+ f9 ^5.dialog.cpp0 f4 g6 {3 A& 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;
    • }
      7 V' T* c3 B0 C
    从一切完成,从Release目录中拷贝相应的elf文件和即可在开发板上运行,miao..........
    + [; t4 }2 ]/ \/ G0 Y! h$ O
    % E5 w5 ?, T0 `: F. P- G& ]

    ! S7 m. ^6 h1 ^5 e1 j. @3 _

    该用户从未签到

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

    本版积分规则

    关闭

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

    EDA365公众号

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

    GMT+8, 2025-7-30 12:17 , Processed in 0.125000 second(s), 23 queries , Gzip On.

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

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

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