TA的每日心情 | 开心 2019-11-20 15:00 |
---|
签到天数: 2 天 [LV.1]初来乍到
|
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/bin PATH, ^/ 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* O3 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 _ |
|