15、USB摄像头图片采集+QT显示
一、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
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QTimer>
#include <QPixmap>
#include <QImage>
#include <QPainter>
//#include <image.h>
#include <v4l2grab.h> MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this); QPixmap pix;
QByteArray aa ; BITMAPFILEHEADER bf;
BITMAPINFOHEADER bi;
//Set BITMAPINFOHEADER
bi.biSize = ;
bi.biWidth = IMAGEWIDTH;
bi.biHeight = IMAGEHEIGHT;
bi.biPlanes = ;
bi.biBitCount = ;
bi.biCompression = ;
bi.biSizeImage = IMAGEWIDTH*IMAGEHEIGHT*;
bi.biXPelsPerMeter = ;
bi.biYPelsPerMeter = ;
bi.biClrUsed = ;
bi.biClrImportant = ; //Set BITMAPFILEHEADER
bf.bfType = 0x4d42;
bf.bfSize = + bi.biSizeImage;
bf.bfReserved = ;
bf.bfOffBits = ; if(init_v4l2() == FALSE)
{
} v4l2_grab();
yuyv_2_rgb888();
aa.append((char *)&bf,);
aa.append((char *)&bi,);
aa.append((char *)frame_buffer,**);
pix.loadFromData(aa);
ui->label->setPixmap(pix);
close_v4l2();
} MainWindow::~MainWindow()
{
delete ui;
}
其中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文件可以看到
#############################################################################
# Makefile for building: lab2_qt_camera
# Generated by qmake (.01a) (Qt 4.7.) on: Sun Dec ::
# Project: lab2_qt_camera.pro
# Template: app
# Command: /usr/local/Trolltech/Qt-4.7./bin/qmake -o Makefile lab2_qt_camera.pro
############################################################################# ####### Compiler, tools and options CC = ${CROSS_COMPILE}gcc
CXX = ${CROSS_COMPILE}g++
DEFINES = -DQT_NO_DEBUG -DQT_GUI_LIB -DQT_NETWORK_LIB -DQT_CORE_LIB -DQT_SHARED
CFLAGS = ${CROSS_COMPILE_CFLAGS} -I$(ZYNQ_QT_INSTALL)/include -DZYNQ -O2 -Wall -W -D_REENTRANT $(DEFINES)
CXXFLAGS = ${CROSS_COMPILE_CPPFLAGS} -I$(ZYNQ_QT_INSTALL)/include -DZYNQ -O2 -Wall -W -D_REENTRANT $(DEFINES)
INCPATH = -I/usr/local/Trolltech/Qt-4.7./mkspecs/default -I. -I/usr/local/Trolltech/Qt-4.7./include/QtCore -I/usr/local/Trolltech/Qt-4.7./include/QtNetwork -I/usr/local/Trolltech/Qt-4.7./include/QtGui -I/usr/local/Trolltech/Qt-4.7./include -I. -I. -I.
LINK = ${CROSS_COMPILE}g++
LFLAGS = -L$(ZYNQ_QT_INSTALL)/lib -Wl,-O1 -Wl,-rpath,/usr/local/Trolltech/Qt-4.7./lib
LIBS = $(SUBLIBS) -L/usr/local/Trolltech/Qt-4.7.//lib -lQtGui -L/usr/local/Trolltech/Qt-4.7.3//lib -lQtNetwork -lQtCore -lpthread
AR = ${CROSS_COMPILE}ar cqs
RANLIB =
QMAKE = /usr/local/Trolltech/Qt-4.7./bin/qmake
TAR = tar -cf
COMPRESS = gzip -9f
COPY = cp -f
SED = sed
COPY_FILE = $(COPY)
COPY_DIR = $(COPY) -r
STRIP = ${CROSS_COMPILE}strip
INSTALL_FILE = install -m -p
INSTALL_DIR = $(COPY_DIR)
INSTALL_PROGRAM = install -m -p
DEL_FILE = rm -f
SYMLINK = ln -f -s
DEL_DIR = rmdir
MOVE = mv -f
CHK_DIR_EXISTS= test -d
MKDIR = mkdir -p ####### Output directory OBJECTS_DIR = ./ ####### Files SOURCES = main.cpp \
mainwindow.cpp \
v4l2grab.c moc_mainwindow.cpp
OBJECTS = main.o \
mainwindow.o \
v4l2grab.o \
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的解压路径,在控制台中输入
dd if=/dev/zero of=qt_lib_ext4.img bs=1M count=
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./* /mnt
chmod go-w qt_lib_ext4.img
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
15、USB摄像头图片采集+QT显示的更多相关文章
- 基于ZedBoard的Webcam设计(一):USB摄像头(V4L2接口)的图片采集【转】
转自:http://www.cnblogs.com/surpassal/archive/2012/12/19/zed_webcam_lab1.html 一直想把USB摄像头接到Zedboard上,搭建 ...
- ffmpeg从USB摄像头采集一张原始图片(转)
本文讲解使用ffmpeg从USB摄像头中采集一帧数据并写入文件保存,测试平台使用全志A20平台,其他平台修改交叉工具链即可移植.开发环境使用eclipse+CDT.交叉工具链使用arm-Linux-g ...
- 【视频开发】用GStreamer实现摄像头的采集和保存
GStreamer是流媒体软件的开发框架.可以这样说,在该框架的支持下,你可以非常简单地为很多格式的流媒体写出自已需要的程序. 现在,GStreamer已经内置对MP3.Ogg/Vorbis.MPEG ...
- 14、USB摄像头(V4L2接口)的图片采集
参考网站http://www.cnblogs.com/surpassal/archive/2012/12/19/zed_webcam_lab1.html 一.一些知识 1.V4L和V4L2. V4L是 ...
- QT学习之usb摄像头采集(Opencv+QT)[cvCapture,IplImage,QImage]
参考自:http://blog.chinaunix.net/uid-23381466-id-3826748.html 将Opencv中的cvCaptureFromCAM不断获得摄像头采集到的图像数据, ...
- 利用opencv从USB摄像头获取图片
由于opencv自带的VideoCapture函数直接从usb摄像头获取视频数据,所以用这个来作为实时的图像来源用于实体检测识别是很方便的. 1. 安装opencv 安装的步骤可以按照之前这个文章操作 ...
- Qt中在图片上叠加显示文字
Qt中在图片上叠加显示文字 QCustLabel::QCustLabel(QWidget *parent):QLabel(parent){ setPixmap(QPixmap(QString::f ...
- Linux下用FFMPEG采集usb摄像头到RTMP
Linux下用 FFMPEG 采集 usb摄像头视频 和 摄像头内置麦克风音频 到RTMP服务 ffmpeg -f video4linux2 -qscale 10 -r 12 -s 640x480 ...
- 【Xilinx-Petalinux学习】-06-OpenCV通过USB摄像头采集图像。
占位, 实现USB摄像头的图像采集与保存
随机推荐
- xsy3320 string
xsy3320 string 题意: 给一颗树,每条边上有一个字符,求有多少条路径是回文的.(\(N\leq50000\),\(c\in\{1,2\}\)) 题解: 前置芝士:回文前缀& ...
- 洛谷 P1553 数字反转(升级版)
P1553 数字反转(升级版) 题目描述 给定一个数,请将该数各个位上数字反转得到一个新数. 这次与NOIp2011普及组第一题不同的是:这个数可以是小数,分数,百分数,整数.整数反转是将所有数位对调 ...
- 公告:本博客搬迁到:http://www.courtier.cc
公告: 您好,本人意见本博客搬迁到:http://www.courtier.cc
- Android SDK使用国内镜像站,解决下载速度慢无法更新?
1. 国内android开源镜像网站 下面是国内几个比較知名的开源网站.我用的是电子科技大学的镜像源,下载速度很快. mirrors.neusoft.edu.cn //东软信息学院 ubuntu.bu ...
- Java开发者最经常使用19个Linux命令
1.查找文件 find / -name filename.txt 依据名称查找/文件夹下的filename.txt文件. 2.查看一个程序是否执行 ps –ef|grep tomcat 查看全部有关t ...
- D. Dreamoon and Sets(Codeforces Round #272)
D. Dreamoon and Sets time limit per test 1 second memory limit per test 256 megabytes input standard ...
- js33--责任链模式
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/stri ...
- [BZOJ2238]Mst 最小生成树+树链剖分/并查集
链接 题解 先构建出最小生成树,如果删的是非树边,直接输出答案 否则问题转化为,把该边删掉后剩下两个联通块,两个端点分别在两个块内的最小边权,LCT可以维护 不妨换一种思考方向:考虑一条非树边可以代替 ...
- Android 给图片加边框
图片处理时,有时需要为图片加一些边框,下面介绍一种为图片添加简单边框的方法. 基本思路是:将边框图片裁剪成八张小图片(图片大小最好一致,不然后面处理会很麻烦),分别对应左上角,左边,左下角,下边,右下 ...
- 基于WebSphere与Domino的电子商务网站构架分析
650) this.width=650;" border="0" alt="174812596.jpg" src="http://img1. ...