查看: 9496|回复: 1

一步一步学ZedBoard & Zynq(八):USB摄像头图片采集+QT显示

[复制链接]
  • TA的每日心情
    奋斗
    2020-9-28 10:10
  • 签到天数: 1018 天

    连续签到: 1 天

    [LV.10]以坛为家III

    发表于 2013-1-9 10:15:09 | 显示全部楼层 |阅读模式
    分享到:
    本帖最后由 xinxincaijq 于 2013-1-9 10:23 编辑

    一步一步学ZedBoard & Zynq(八):USB摄像头图片采集+QT显示

    转自博客:@超群天晴 http://www.cnblogs.com/surpassal/   

    一步一步学ZedBoard & Zynq(七):Zedboard上的USB摄像头(V4L2接口)的图片采集中,我们完成了ZedBoard上USB摄像头的单幅图片采集,采集到的图片是存储在文件系统中的“image_bmp.bmp”中的。这一小节将完成的是QT界面显示,将采集到的图像数据通过QT显示到HDMI显示器上。采集到图像数据存在QPixmap类的对象中,并通过QLabel显示出来。内容包括Qt Creator和Qt Embedded的安装、Qt工程的建立、摄像头采集实现、Qt运行库的生成以及使用方法。


    更多更新请关注我的博客:@超群天晴 http://www.cnblogs.com/surpassal/

    硬件平台:Digilent ZedBoard + USB 摄像头+HDMI显示器

    开发环境:Windows XP 32 bit + Wmare 8.0 + Ubuntu 10.04 +Qt Creator+ arm-linux-xilinx-gnueabi交叉编译环境

    Zedboard linux: Digilent OOB Design

    一、Qt的下载和的安装

    关于Qt的安装,网络上有很详细的介绍。这里只做简单介绍。

    需要的安装包一共有两个:Qt Creator 和QTE。

    1)QT Creator

    下载地址:qt-sdk-linux-x86-opensource-2010.05.1.bin

    官方下载:http://get.qt.nokia.com/qtsdk/qt ... ource-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

    进行配置,配置完成后进行编译:
    1. make
    复制代码
    编译结束后再使用命令
    1. make install
    复制代码
    安装,默认是会安装到
    1. /usr/local/Trolltech/Qt-4.7.3/
    复制代码
    路径下。之后将Xilinx交叉编译器中的基础C++库复制到安装目录的lib目录下:
    1. cp -P /path/to/cross/compiler/arm-xilinx-linux-gnueabi/libc/usr/lib/libstdc++.so* /usr/local/Trolltech/Qt-4.7.3/lib
    复制代码
    二、软件代码

    1、新建Qt工程

    启动Qt Creator,新建一个Qt Gui应用
    22205731-d89ba6f5c8904a098db529497042c023.jpg
    之后选择好工程路径和工程明,其他默认,一直点下一步直道工程建立结束。

    2、修改ui界面

    打开mainwindow.ui,进入可视化设计界面。默认情况中间的主设计区下已经有一个QMainWindow和QWidget的对象。我们需要将采集到图像显示到一个QLabel的部件上,从右侧的部件列表的“DisplayWidget”中选择“Label”部件拖动到中间,并将大小设置为640*480,起点坐标为(5,5)。
    22211339-d83d771e1c6b4e1eade6cd7b3e85146b.jpg
    并将原有的文本text取消。
    22211439-0c891a6c195f43f2b1dbdc8d5ca08db3.jpg
    这个时候这个Label部件已经把MainWindow遮蔽了,再把MainWindow的大小调整合适。
    22205757-a81caee6cb91467291004604455cd6a0.jpg
    3、添加摄像采集代码

    由于在一步一步学ZedBoard & Zynq(七):Zedboard上的USB摄像头(V4L2接口)的图片采集中我们已经实现了图片的采集,只需要工程中的v4l2grab.c和v4l2grab.h源文件添加到这个新工程中,并作相应修改即可。
    22211910-f709d6b968e94154b142e38e1c81cabe.jpg

    修改mainwindow.cpp
    1. //@超群天晴 http://www.cnblogs.com/surpassal/
    2. #include "mainwindow.h"
    3. #include "ui_mainwindow.h"
    4. #include <QTimer>
    5. #include <QPixmap>
    6. #include <QImage>
    7. #include <QPainter>
    8. #include <image.h>
    9. #include <v4l2grab.h>

    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.      //Set BITMAPFILEHEADER
    34.      bf.bfType = 0x4d42;
    35.      bf.bfSize = 54 + bi.biSizeImage;
    36.      bf.bfReserved = 0;
    37.      bf.bfOffBits = 54;

    38.      if(init_v4l2() == FALSE)
    39.      {
    40.      }

    41.      v4l2_grab();
    42.      yuyv_2_rgb888();
    43.      aa.append((char *)&bf,14);
    44.      aa.append((char *)&bi,40);
    45.      aa.append((char *)frame_buffer,640*480*3);
    46.      pix.loadFromData(aa);
    47.      ui->label->setPixmap(pix);
    48.      close_v4l2();
    49. }

    50. MainWindow::~MainWindow()
    51. {
    52.      delete ui;
    53. }
    复制代码
    其中17~18行:
    1.   QPixmap pix;
    2.   QByteArray aa ;
    复制代码
    定义了一个QPixmap类的对象pix,用来显示图片;由于调用QPixmap类的loadFromData()函数来获取传递图像数据,关于loadFromData()函数的详细信息可以在Qt的help->index中搜索到,或者从http://doc.qt.digia.com/4.7-snapshot/index.html中查询到:
    1. bool QPixmap::loadFromData ( const QByteArray & data, const char * format = 0, Qt::ImageConversionFlags flags = Qt::AutoColor )
    复制代码
    可以知道,loadFromData()要求输入参数为QByteArray类型,因而定义QByteArray的对象aa,用来存储图片数据。

    同时,loadFromData()要求指定数据的格式。如果不指定,默认能支持的格式有:
    22214425-e59012a802df4d76aa293f9665deac09.jpg
    是一个48~50行:
    1.      aa.append((char *)&bf,14);
    2.      aa.append((char *)&bi,40);
    3.      aa.append((char *)frame_buffer,640*480*3);
    复制代码
    调用QByteArray类的append函数将图像数据存入aa中。需要注意的是,由于loadFromData函数需要输入的图像符合标准图片格式,因而需要把数据的BMP头信息也存入aa中。

    52~53行:
    1.     pix.loadFromData(aa);
    2.     ui->label->setPixmap(pix);
    复制代码
    实现了图片数据(包含头信息)向pix的传递和pix在label上的显示。

    4、编译工程

    在工程路径下,使用命令
    1. qmake -project
    复制代码
    生成新的工程文件lab2_qt_camera.pro。再使用
    1. 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. ####### Compiler, tools and options

    9. CC            = ${CROSS_COMPILE}gcc
    10. CXX           = ${CROSS_COMPILE}g++
    11. DEFINES       = -DQT_NO_DEBUG -DQT_GUI_LIB -DQT_NETWORK_LIB -DQT_CORE_LIB -DQT_SHARED
    12. CFLAGS        = ${CROSS_COMPILE_CFLAGS} -I$(ZYNQ_QT_INSTALL)/include -DZYNQ -O2 -Wall -W -D_REENTRANT $(DEFINES)
    13. CXXFLAGS      = ${CROSS_COMPILE_CPPFLAGS} -I$(ZYNQ_QT_INSTALL)/include -DZYNQ -O2 -Wall -W -D_REENTRANT $(DEFINES)
    14. 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.
    15. LINK          = ${CROSS_COMPILE}g++
    16. LFLAGS        = -L$(ZYNQ_QT_INSTALL)/lib -Wl,-O1 -Wl,-rpath,/usr/local/Trolltech/Qt-4.7.3/lib
    17. LIBS          = $(SUBLIBS)  -L/usr/local/Trolltech/Qt-4.7.3//lib -lQtGui -L/usr/local/Trolltech/Qt-4.7.3//lib -lQtNetwork -lQtCore -lpthread
    18. AR            = ${CROSS_COMPILE}ar cqs
    19. RANLIB        =
    20. QMAKE         = /usr/local/Trolltech/Qt-4.7.3/bin/qmake
    21. TAR           = tar -cf
    22. COMPRESS      = gzip -9f
    23. COPY          = cp -f
    24. SED           = sed
    25. COPY_FILE     = $(COPY)
    26. COPY_DIR      = $(COPY) -r
    27. STRIP         = ${CROSS_COMPILE}strip
    28. INSTALL_FILE  = install -m 644 -p
    29. INSTALL_DIR   = $(COPY_DIR)
    30. INSTALL_PROGRAM = install -m 755 -p
    31. DEL_FILE      = rm -f
    32. SYMLINK       = ln -f -s
    33. DEL_DIR       = rmdir
    34. MOVE          = mv -f
    35. CHK_DIR_EXISTS= test -d
    36. MKDIR         = mkdir -p

    37. ####### Output directory

    38. OBJECTS_DIR   = ./

    39. ####### Files

    40. SOURCES       = main.cpp \
    41.          mainwindow.cpp \
    42.          v4l2grab.c moc_mainwindow.cpp
    43. OBJECTS       = main.o \
    44.          mainwindow.o \
    45.          v4l2grab.o \
    46.          moc_mainwindow.o
    47. #之后省略
    复制代码
    使用的gcc是 ${CROSS_COMPILE}gcc,也就是arm-xilinx-linux-gnueabi-gcc,g++是${CROSS_COMPILE}g++,也就是arm-xilinx-linux-gnueabi-g++;因而编译后的可执行文件是可以再Zed上运行的。再使用
    1. 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,使用时将其挂载到
    1. /usr/local/Trolltech/Qt-4.7.3/
    复制代码
    即可。

    四、ZedBoard测试

    1、硬件连接

    需要使用USB摄像头、U盘、鼠标,因而使用了一个USB HUB;同时为了支持HDMI输出,需要连接一个HDMI的显示器(可以使DVI,需要使用HDMI转DVI,这个性价比比较高;或者普通VGA,需要使用HDMI转VGA,这个性价比比较低)。ZedBoard的硬件连接图:
    23004516-429e5b0d8a734fe5a9e12c837ac41d10.jpg
    2、挂载Qt运行库

    在ZedBoard的linux文件系统中,创建目录
    1. /usr/local/Trolltech/Qt-4.7.3/
    复制代码
    使用
    1. mkdir
    复制代码
    命令一层一层建立目录。并将qt_lib_ext4.img挂载到
    1. /usr/local/Trolltech/Qt-4.7.3/
    复制代码
    下。
    22215155-3fdcbc1ae6fc46eb83bfab1c3afcdb88.jpg
    切换到
    1. /usr/local/Trolltech/Qt-4.7.3/
    复制代码
    路径查看挂载的结果
    22215204-8b865cbd60914a05b9b0e064f7c0b66a.jpg
    3、运行

    使用命令
    1. ./lab2_qt_camera -qws
    复制代码
    运行可执行文件,可以看到输出信息:
    22215209-f3b10c971f254993ba5dcfcdbc7d936b.jpg
    同时从HDMI的显示器上看到执行结果:
    22215226-28ffa86437a04751bc61d9c75e4ae289.jpg
    这样,我们的摄像头集到的图像数据通过QT显示到HDMI显示器上。



    ===========================

    Qt运行库下载:qt_lib_ext4.img

    可执行文件下载: lab2_qt_camera.rar (332.27 KB, 下载次数: 86)
    回复

    使用道具 举报

  • TA的每日心情
    擦汗
    2014-2-12 10:49
  • 签到天数: 150 天

    连续签到: 1 天

    [LV.7]常住居民III

    发表于 2013-1-9 10:20:25 | 显示全部楼层
    楼主辛苦辛苦呀
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /2 下一条



    手机版|小黑屋|与非网

    GMT+8, 2024-4-27 05:51 , Processed in 0.130707 second(s), 17 queries , MemCache On.

    ICP经营许可证 苏B2-20140176  苏ICP备14012660号-2   苏州灵动帧格网络科技有限公司 版权所有.

    苏公网安备 32059002001037号

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.