基于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)编辑)

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线