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