当前位置:
文档之家› USB摄像头视频采集与QT界面显示要点
USB摄像头视频采集与QT界面显示要点
2.修改ui界面
打开Widget.ui,进入可视化设计界面。默认情况中间的主设计区下只有一个Widget的对象。由于USB摄像头采集到的图像需要显示到一个QLabel的部件上,从右侧的部件列表的“DisplayWidget”中选择“Label”部件拖动到中间;此外,我们需要两个按钮,一个用于启动和终止视频数据的保存,一个用于以后的视频文件的压缩。从右侧的”Buttons”中两次选择”Push Buttion”部件并拖动到Widget中。
int get_frame(unsigned char ** yuv_buffer_pointer, nget_frame();//释放视频帧,让出缓存空间准备新的视频帧数据
private:
int open_device();//打开设备
int init_device();//初始化设备
从上图可以看出,对象Widget下已经添加了一个label部件,两个push button部件。右上角Object与Class的关系是:Object对应的物体是属于Class对应的类,反映了Qt的继承关系。
接下来设置上面四种部件的属性,Widget的属性按照下面图示设置,其中geometry设置为[(0,0),650*550]说明界面左上角的坐标位于原点,大小为650*550;在window name这一项设置的是你的界面的名字,我设置为USB_YUV_Camera。
注:图片未提及的采用默认就行,其他三个部件见图示。这些部件的objectName要特别注意,因为会在后面编写的程序中用到。
(Widget设置图示)(label设置图示1)(label设置图示2)
(Push button 1设置图示)(Push button 1设置图示)
(Push button 2设置图示)Push button 2设置图示)
size_t length;//缓冲区的长度
};
QString dev_name;
int fd;//video0 file
buffer* buffers;
unsigned int n_buffers;
int index;
signals:
//void display_error(QString);
};
widget.h定义了Widget窗口类,使它继承于Qt窗口类QWidget,并定义了YUV到RGB颜色转变的函数;QT界面按钮操作的实现函数,以及视频窗口的刷新时间painEvent函数;
widget.cpp实现了widget.h定义的函数。
下面介绍各文件的主要代码段:
(1)common.h
#ifndef COMMON_H
int start_capturing();//启动视频采集
int init_mmap();//内存映射初始化
int stop_capturing();//停止视频采集
int uninit_device();//注销设备
int close_device();//关闭设备
struct buffer
{
void * start;//视频缓冲区的起始地址
USB摄像头视频采集与Qt界面显示
一.Qt界面制作
1.新建Qt工程
启动Qt Creator,新建一个Qt Gui应用。
单击File选择New File or Project出现以下界面:
选择Qt Gui Application,之后选择好工程与路径名,其他默认,一直到设置Class information(类信息)时,Class name设为Widget, Base name选择QWidget,其他默认。设置好这些后,其他默认,直到工程设置结束。如下图所示:
最后生成的界面:
点击Debug会得到Debug文档,里面有你设置的信息。
编译运行后,会在建立的工程文件夹下生成很多文件,重要的是widget.ui文件,其他的文件要根据你具体的应用作出相应的修改。
Qt界面最终的效果图为:
二.USB摄像头视频采集与Qt界面显示源代码分析
源码包含:common.hVideoDevice.h widget.h VideoDevice.cpp widget.cpp main.cpp
common.h主要定义了USB采集到的图像的宽度,高度等信息;
Videodevice.h定义了VideoDevice类,使它继承于Qt的基类QObject,定义了VideoDevice的构造函数与析构函数,重要的是定义了实现V4L2视频架构的函数;
Videodevice.cpp具体实现了Videodevice.h定义的函数,完成了基于V4L2架构的视频采集;
class VideoDevice : public QObject
{
Q_OBJECT//有了这条语句才能使用QT中的signal和slot机制
public:
VideoDevice(QString dev_name);//构造函数定义,用于初始化
~VideoDevice();//析构函数用于释放内存
#endif // VIDEODEVICE_H
(3)Videodevice.cpp
#define FILE_VIDEO"/dev/video0"
VideoDevice::VideoDevice(QString dev_name)//VideoDevice的构造函数进行初始化
{
this->dev_name = dev_name;
this->fd = -1;
this->buffers = NULL;
this->n_buffers = 0;
this->index = -1;
if(open_device() == FALSE)
{
close_device();
#define COMMON_H
//……
#define IMG_WIDTH 640//定义视频的宽度为640
#define IMG_HEIGTH 480//定义视频的高度为480
#endif // COMMON_H
(2)Videodevice.h
#define CLEAR(x) memset(&(x), 0, sizeof(x))//定义CLEAR为内存清零