一、Qt的下載和的安裝
關於Qt的安裝,網絡上有很詳細的介紹。這里只做簡單介紹。
需要的安裝包一共有兩個:Qt Creator 和QTE。
1)QT Creator
下載地址:qt-sdk-linux-x86-opensource-2010.05.1.bin
官方下載:http://get.qt.nokia.com/qtsdk/qt-sdk-linux-x86-opensource-2010.05.1.bin
這是直接下載的編譯好的二進制SDK包,不需要再配置和編譯,直接運行就可以下載。之所以把官方的鏈接放在下面,是因為我找這個安裝包找了很久,網絡上很多鏈接均已經失效。我提供的第一個下載地址是使用百度的雲盤,最近使用,感覺效果很不錯。推薦第一個地址進行下載。
下載完成后,直接運行即可完成安裝。
2)Qt Embedded for Linux:
下載地址:qt-everywhere-opensource-src-4.7.3.tar.gz
官方下載:http://download.xilinx.com/kits/qt_build_src.tar
此為4.7.3版本的源代碼包,下載后需要配置和編譯。同樣推薦使用第一個地址進行下載。
解壓之后,把Xilinx公司提供的Zynq的Qt配置文件qmake.conf復制到qt-everywhere-opensource-src-4.7.3/mkspecs/qws/linux-arm-gnueabi-g++目錄下,使用命令
./configure -embedded arm -xplatform qws/linux-arm-gnueabi-g++ -little-endian -opensource -host-little-endian -confirm-license -nomake demos -nomake examples
進行配置,配置完成后進行編譯:
make
編譯結束后再使用命令
make install
安裝,默認是會安裝到
/usr/local/Trolltech/Qt-4.7.3/
路徑下。之后將Xilinx交叉編譯器中的基礎C++庫復制到安裝目錄的lib目錄下:
cp -P /path/to/cross/compiler/arm-xilinx-linux-gnueabi/libc/usr/lib/libstdc++.so* /usr/local/Trolltech/Qt-4.7.3/lib
這樣就完成了Zynq的Qt Embedded for Linux的安裝。
二、軟件代碼
1、新建Qt工程
啟動Qt Creator,新建一個Qt Gui應用

之后選擇好工程路徑和工程明,其他默認,一直點下一步直道工程建立結束。
2、修改ui界面
打開mainwindow.ui,進入可視化設計界面。默認情況中間的主設計區下已經有一個QMainWindow和QWidget的對象。我們需要將采集到圖像顯示到一個QLabel的部件上,從右側的部件列表的“DisplayWidget”中選擇“Label”部件拖動到中間,並將大小設置為640*480,起點坐標為(5,5)。

並將原有的文本text取消。

這個時候這個Label部件已經把MainWindow遮蔽了,再把MainWindow的大小調整合適。

3、添加攝像采集代碼
由於在(原創)基於ZedBoard的Webcam設計(一):Zedboard上的USB攝像頭(V4L2接口)的圖片采集中我們已經實現了圖片的采集,只需要工程中的v4l2grab.c和v4l2grab.h源文件添加到這個新工程中,並作相應修改即可。

修改mainwindow.cpp
1 #include "mainwindow.h" 2 #include "ui_mainwindow.h" 3 #include <QTimer> 4 #include <QPixmap> 5 #include <QImage> 6 #include <QPainter> 7 //#include <image.h> 8 #include <v4l2grab.h> 9 10 MainWindow::MainWindow(QWidget *parent) : 11 QMainWindow(parent), 12 ui(new Ui::MainWindow) 13 { 14 ui->setupUi(this); 15 16 QPixmap pix; 17 QByteArray aa ; 18 19 BITMAPFILEHEADER bf; 20 BITMAPINFOHEADER bi; 21 //Set BITMAPINFOHEADER 22 bi.biSize = 40; 23 bi.biWidth = IMAGEWIDTH; 24 bi.biHeight = IMAGEHEIGHT; 25 bi.biPlanes = 1; 26 bi.biBitCount = 24; 27 bi.biCompression = 0; 28 bi.biSizeImage = IMAGEWIDTH*IMAGEHEIGHT*3; 29 bi.biXPelsPerMeter = 0; 30 bi.biYPelsPerMeter = 0; 31 bi.biClrUsed = 0; 32 bi.biClrImportant = 0; 33 34 35 //Set BITMAPFILEHEADER 36 bf.bfType = 0x4d42; 37 bf.bfSize = 54 + bi.biSizeImage; 38 bf.bfReserved = 0; 39 bf.bfOffBits = 54; 40 41 if(init_v4l2() == FALSE) 42 { 43 } 44 45 v4l2_grab(); 46 yuyv_2_rgb888(); 47 aa.append((char *)&bf,14); 48 aa.append((char *)&bi,40); 49 aa.append((char *)frame_buffer,640*480*3); 50 pix.loadFromData(aa); 51 ui->label->setPixmap(pix); 52 close_v4l2(); 53 } 54 55 MainWindow::~MainWindow() 56 { 57 delete ui; 58 }
其中17~18行:
17 QPixmap pix; 18 QByteArray aa ;
定義了一個QPixmap類的對象pix,用來顯示圖片;由於調用QPixmap類的loadFromData()函數來獲取傳遞圖像數據,關於loadFromData()函數的詳細信息可以在Qt的help->index中搜索到,或者從http://doc.qt.digia.com/4.7-snapshot/index.html中查詢到:
bool QPixmap::loadFromData ( const QByteArray & data, const char * format = 0, Qt::ImageConversionFlags flags = Qt::AutoColor )
可以知道,loadFromData()要求輸入參數為QByteArray類型,因而定義QByteArray的對象aa,用來存儲圖片數據。
同時,loadFromData()要求指定數據的格式。如果不指定,默認能支持的格式有:

是一個48~50行:
48 aa.append((char *)&bf,14); 49 aa.append((char *)&bi,40); 50 aa.append((char *)frame_buffer,640*480*3);
調用QByteArray類的append函數將圖像數據存入aa中。需要注意的是,由於loadFromData函數需要輸入的圖像符合標准圖片格式,因而需要把數據的BMP頭信息也存入aa中。
52~53行:
51 pix.loadFromData(aa); 52 ui->label->setPixmap(pix);
實現了圖片數據(包含頭信息)向pix的傳遞和pix在label上的顯示。
4、編譯工程
在工程路徑下,使用命令
qmake -project
生成新的工程文件lab2_qt_camera.pro。再使用
qmake
生成makefile文件,打開makefile文件可以看到
1 ############################################################################# 2 # Makefile for building: lab2_qt_camera 3 # Generated by qmake (2.01a) (Qt 4.7.3) on: Sun Dec 23 02:24:47 2012 4 # Project: lab2_qt_camera.pro 5 # Template: app 6 # Command: /usr/local/Trolltech/Qt-4.7.3/bin/qmake -o Makefile lab2_qt_camera.pro 7 ############################################################################# 8 9 ####### Compiler, tools and options 10 11 CC = ${CROSS_COMPILE}gcc 12 CXX = ${CROSS_COMPILE}g++ 13 DEFINES = -DQT_NO_DEBUG -DQT_GUI_LIB -DQT_NETWORK_LIB -DQT_CORE_LIB -DQT_SHARED 14 CFLAGS = ${CROSS_COMPILE_CFLAGS} -I$(ZYNQ_QT_INSTALL)/include -DZYNQ -O2 -Wall -W -D_REENTRANT $(DEFINES) 15 CXXFLAGS = ${CROSS_COMPILE_CPPFLAGS} -I$(ZYNQ_QT_INSTALL)/include -DZYNQ -O2 -Wall -W -D_REENTRANT $(DEFINES) 16 INCPATH = -I/usr/local/Trolltech/Qt-4.7.3/mkspecs/default -I. -I/usr/local/Trolltech/Qt-4.7.3/include/QtCore -I/usr/local/Trolltech/Qt-4.7.3/include/QtNetwork -I/usr/local/Trolltech/Qt-4.7.3/include/QtGui -I/usr/local/Trolltech/Qt-4.7.3/include -I. -I. -I. 17 LINK = ${CROSS_COMPILE}g++ 18 LFLAGS = -L$(ZYNQ_QT_INSTALL)/lib -Wl,-O1 -Wl,-rpath,/usr/local/Trolltech/Qt-4.7.3/lib 19 LIBS = $(SUBLIBS) -L/usr/local/Trolltech/Qt-4.7.3//lib -lQtGui -L/usr/local/Trolltech/Qt-4.7.3//lib -lQtNetwork -lQtCore -lpthread 20 AR = ${CROSS_COMPILE}ar cqs 21 RANLIB = 22 QMAKE = /usr/local/Trolltech/Qt-4.7.3/bin/qmake 23 TAR = tar -cf 24 COMPRESS = gzip -9f 25 COPY = cp -f 26 SED = sed 27 COPY_FILE = $(COPY) 28 COPY_DIR = $(COPY) -r 29 STRIP = ${CROSS_COMPILE}strip 30 INSTALL_FILE = install -m 644 -p 31 INSTALL_DIR = $(COPY_DIR) 32 INSTALL_PROGRAM = install -m 755 -p 33 DEL_FILE = rm -f 34 SYMLINK = ln -f -s 35 DEL_DIR = rmdir 36 MOVE = mv -f 37 CHK_DIR_EXISTS= test -d 38 MKDIR = mkdir -p 39 40 ####### Output directory 41 42 OBJECTS_DIR = ./ 43 44 ####### Files 45 46 SOURCES = main.cpp \ 47 mainwindow.cpp \ 48 v4l2grab.c moc_mainwindow.cpp 49 OBJECTS = main.o \ 50 mainwindow.o \ 51 v4l2grab.o \ 52 moc_mainwindow.o#之后省略
使用的gcc是 ${CROSS_COMPILE}gcc,也就是arm-xilinx-linux-gnueabi-gcc,g++是${CROSS_COMPILE}g++,也就是arm-xilinx-linux-gnueabi-g++;因而編譯后的可執行文件是可以再Zed上運行的。再使用
make
生成可執行文件lab2_qt_camera。
三、制作運行庫
由於ubuntu的Qt運行庫在/usr/local/Trolltech/Qt-4.7.3/下,由makefile可以看到引用運行庫是
INCPATH = -I/usr/local/Trolltech/Qt-4.7.3/mkspecs/default -I. -I/usr/local/Trolltech/Qt-4.7.3/include/QtCore -I/usr/local/Trolltech/Qt-4.7.3/include/QtNetwork -I/usr/local/Trolltech/Qt-4.7.3/include/QtGui -I/usr/local/Trolltech/Qt-4.7.3/include -I. -I. -I.
因此如果將編譯后的可執行文件在ZedBoard上運行,也許早在相應的路徑下找到運行庫文件。Xilinx給出了Qt運行庫鏡像的制作方法:切換到qt-everywhere-opensource-src-4.7.3.tar.gz的解壓路徑,在控制台中輸入
1 dd if=/dev/zero of=qt_lib_ext4.img bs=1M count=80 2 mkfs.ext4 -F qt_lib_ext4.img 3 chmod go+w qt_lib_ext4.img 4 mount qt_lib_ext4.img -o loop /mnt 5 cp -rf /usr/local/Trolltech/Qt-4.7.3/* /mnt 6 chmod go-w qt_lib_ext4.img 7 umount /mnt
即可。能找到生成的庫文件鏡像文件qt_lib_ext4.img,使用時將其掛載到
/usr/local/Trolltech/Qt-4.7.3/
即可。
四、ARM測試測試
1、硬件連接
需要使用USB攝像頭、U盤、鼠標,因而使用了一個USB HUB;同時為了支持HDMI輸出,需要連接一個HDMI的顯示器(可以使DVI,需要使用HDMI轉DVI,這個性價比比較高;或者普通VGA,需要使用HDMI轉VGA,這個性價比比較低)。ZedBoard的硬件連接圖:

2、掛載Qt運行庫
在ZedBoard的linux文件系統中,創建目錄
/usr/local/Trolltech/Qt-4.7.3/
使用
mkdir
命令一層一層建立目錄。並將qt_lib_ext4.img掛載到
/usr/local/Trolltech/Qt-4.7.3/
下。

切換到
/usr/local/Trolltech/Qt-4.7.3/
路徑查看掛載的結果

3、運行
使用命令
./lab2_qt_camera -qws
運行可執行文件,可以看到輸出信息:

同時從HDMI的顯示器上看到執行結果:
這樣,我們的攝像頭集到的圖像數據通過QT顯示到HDMI顯示器上。
===========================
Qt運行庫下載:https://pan.baidu.com/share/link?shareid=168043&uk=1879203302&third=0
可執行文件下載:http://files.cnblogs.com/surpassal/lab2_qt_camera.rar
