基于ZedBoard的WindowsXP32bit+WmareCreator+arm-linux-xilinx-gnueabi交叉编译环境
优采云 发布时间: 2021-06-11 04:02基于ZedBoard的WindowsXP32bit+WmareCreator+arm-linux-xilinx-gnueabi交叉编译环境
(原创)基于ZedBoard的网络*敏*感*词*设计(一):USB*敏*感*词*图片(V4L2接口)采集
(原创)基于ZedBoard的网络*敏*感*词*设计(二):USB*敏*感*词*图像采集+QT显示
(原创)基于ZedBoard的网络*敏*感*词*设计(三):采集和视频动态显示
(原创)基于ZedBoard的网络*敏*感*词*设计(四):MJPG编码和AVI封装
(原创)基于ZedBoard的网络*敏*感*词*设计(五):在zedboard上实现x264编码(软编码)
硬件平台:Digilent ZedBoard + USB *敏*感*词* + HDMI 显示器
开发环境:Windows XP 32 bit + Wmare 8.0 + Ubuntu 10.04 +Qt Creator+ arm-linux-xilinx-gnueabi 交叉编译环境
Zedboard linux:Digilent OOB 设计
一、Qt 下载安装
关于Qt的安装,网上有很详细的介绍。这里只是简单介绍。
需要两个安装包:Qt Creator 和 QTE。
1)QT 创作者
下载地址:qt-sdk-linux-x86-opensource-2010.05.1.bin
官方下载:
这是一个编译好的二进制SDK包,直接下载。不需要再次配置编译,直接运行下载即可。之所以把官方链接放在下面,是因为我找了很久这个安装包,网上很多链接都失效了。我提供的第一个下载地址是使用百度云盘。最近在用,感觉效果很好。推荐第一个下载地址。
下载完成后,直接运行即可完成安装。
2)Qt Embedded for Linux:
下载地址:qt-everywhere-opensource-src-4.7.3.tar.gz
官方下载:
这是4.7.3版本的源码包。下载后需要进行配置和编译。也推荐使用第一个地址下载。
解压后,将提供的Zynq Qt配置文件qmake.conf复制到qt-everywhere-opensource-src-4.7.3/mkspecs/qws/linux-arm-gnueabi-g++目录下,使用Command
./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).
并取消原来的正文。
此时Label组件已经覆盖了MainWindow,然后调整MainWindow的大小使其适合。
3、添加*敏*感*词*采集code
因为在(原创)ZedBoard-based Webcam design(一):Zedboard 采集上USB*敏*感*词*(V4L2接口)的图片,我们已经实现了图片的采集,只需要工程v4l2grab .c 和 v4l2grab.h 源文件被添加到这个新项目中并进行了相应的修改。
修改 mainwindow.cpp
1 //@超群天晴 http://www.cnblogs.com/surpassal/
2 #include "mainwindow.h"
3 #include "ui_mainwindow.h"
4 #include
5 #include
6 #include
7 #include
8 //#include
9 #include
10
11 MainWindow::MainWindow(QWidget *parent) :
12 QMainWindow(parent),
13 ui(new Ui::MainWindow)
14 {
15 ui->setupUi(this);
16
17 QPixmap pix;
18 QByteArray aa ;
19
20 BITMAPFILEHEADER bf;
21 BITMAPINFOHEADER bi;
22 //Set BITMAPINFOHEADER
23 bi.biSize = 40;
24 bi.biWidth = IMAGEWIDTH;
25 bi.biHeight = IMAGEHEIGHT;
26 bi.biPlanes = 1;
27 bi.biBitCount = 24;
28 bi.biCompression = 0;
29 bi.biSizeImage = IMAGEWIDTH*IMAGEHEIGHT*3;
30 bi.biXPelsPerMeter = 0;
31 bi.biYPelsPerMeter = 0;
32 bi.biClrUsed = 0;
33 bi.biClrImportant = 0;
34
35
36 //Set BITMAPFILEHEADER
37 bf.bfType = 0x4d42;
38 bf.bfSize = 54 + bi.biSizeImage;
39 bf.bfReserved = 0;
40 bf.bfOffBits = 54;
41
42 if(init_v4l2() == FALSE)
43 {
44 }
45
46 v4l2_grab();
47 yuyv_2_rgb888();
48 aa.append((char *)&bf,14);
49 aa.append((char *)&bi,40);
50 aa.append((char *)frame_buffer,640*480*3);
51 pix.loadFromData(aa);
52 ui->label->setPixmap(pix);
53 close_v4l2();
54 }
55
56 MainWindow::~MainWindow()
57 {
58 delete ui;
59 }
第 17~18 行:
17 QPixmap pix;
18 QByteArray aa ;
定义一个QPixmap类的对象pix,用于显示图片;由于调用QPixmap类的loadFromData()函数来获取传输的图像数据,因此loadFromData()函数的详细信息可以在Qt To的help->index中查找,也可以查询:
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在标签上的显示。
4、compile 项目
在项目路径下,使用命令
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。
三、Make 运行时库
由于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的解压路径,在控制台输入
dd if=/dev/zero of=qt_lib_ext4.img bs=1M count=80
mkfs.ext4 -F qt_lib_ext4.img
chmod go+w qt_lib_ext4.img
mount qt_lib_ext4.img -o loop /mnt
cp -rf /usr/local/Trolltech/Qt-4.7.3/* /mnt
chmod go-w qt_lib_ext4.img
umount /mnt
当然。可以找到生成的库文件镜像文件qt_lib_ext4.img,挂载到
/usr/local/Trolltech/Qt-4.7.3/
当然。
四、ZedBoard 测试
1、硬件连接
需要使用USB*敏*感*词*、U盘、鼠标,所以使用USB HUB;同时,为了支持HDMI输出,需要连接一个HDMI显示器(可以用DVI,需要用HDMI转DVI,性价比更高;或者普通VGA,需要用HDMI转VGA ,这个成本比较低)。 ZedBoard 硬件连接图:
2、Mount Qt 运行时库
在ZedBoard的linux文件系统中创建目录
/usr/local/Trolltech/Qt-4.7.3/
使用
mkdir
命令逐层创建目录。并将 qt_lib_ext4.img 挂载到
/usr/local/Trolltech/Qt-4.7.3/
下一步。
切换到
<br class="Apple-interchange-newline">/usr/local/Trolltech/Qt-4.7.3/
查看挂载结果的路径
3、Run
使用命令
./lab2_qt_camera -qws
运行可执行文件,可以看到输出信息:
同时从HDMI显示器看执行结果:
这样,我们相机采集到的图像数据就通过QT显示在HDMI显示器上。
==============================
Qt 运行库下载:qt_lib_ext4.img
下载可执行文件:lab2_qt_camera.rar
发表于 2012-12-22 22:58 超群天晴阅读(20397)评论(35)编辑)