USB摄像头视频采集与QT界面显示解读文档格式.docx
- 文档编号:21762399
- 上传时间:2023-02-01
- 格式:DOCX
- 页数:21
- 大小:1.06MB
USB摄像头视频采集与QT界面显示解读文档格式.docx
《USB摄像头视频采集与QT界面显示解读文档格式.docx》由会员分享,可在线阅读,更多相关《USB摄像头视频采集与QT界面显示解读文档格式.docx(21页珍藏版)》请在冰豆网上搜索。
widget.cpp实现了widget.h定义的函数。
下面介绍各文件的主要代码段:
(1)common.h
#ifndefCOMMON_H
#defineCOMMON_H
//……
#defineIMG_WIDTH640//定义视频的宽度为640
#defineIMG_HEIGTH480//定义视频的高度为480
#endif//COMMON_H
(2)Videodevice.h
#defineCLEAR(x)memset(&
(x),0,sizeof(x))//定义CLEAR为内存清零
classVideoDevice:
publicQObject
{
Q_OBJECT//有了这条语句才能使用QT中的signal和slot机制
public:
VideoDevice(QStringdev_name);
//构造函数定义,用于初始化
~VideoDevice();
//析构函数用于释放内存
intget_frame(unsignedchar**yuv_buffer_pointer,size_t*len);
//获取视频帧
intunget_frame();
//释放视频帧,让出缓存空间准备新的视频帧数据
private:
intopen_device();
//打开设备
intinit_device();
//初始化设备
intstart_capturing();
//启动视频采集
intinit_mmap();
//内存映射初始化
intstop_capturing();
//停止视频采集
intuninit_device();
//注销设备
intclose_device();
//关闭设备
structbuffer
{
void*start;
//视频缓冲区的起始地址
size_tlength;
//缓冲区的长度
};
QStringdev_name;
intfd;
//video0file
buffer*buffers;
unsignedintn_buffers;
intindex;
signals:
//voiddisplay_error(QString);
};
#endif//VIDEODEVICE_H
(3)Videodevice.cpp
#defineFILE_VIDEO"
/dev/video0"
VideoDevice:
:
VideoDevice(QStringdev_name)//VideoDevice的构造函数进行初始化
this->
dev_name=dev_name;
fd=-1;
buffers=NULL;
n_buffers=0;
index=-1;
if(open_device()==FALSE)
close_device();
}
if(init_device()==FALSE)
if(start_capturing()==FALSE)
stop_capturing();
}
~VideoDevice()//VideoDevice的析构函数
if(stop_capturing()==FALSE)
{}
if(uninit_device()==FALSE)
{}
if(close_device()==FALSE)
intVideoDevice:
init_device()//设备初始化
v4l2_capabilitycap;
//设备能力结构体
v4l2_formatfmt;
//设置视频像素
v4l2_streamparmsetfps;
//设置采样率
v4l2_fmtdescfmtdesc;
//查询摄像头支持像素格式
if(ioctl(fd,VIDIOC_QUERYCAP,&
cap)==-1)
printf("
Erroropeningdevice%s:
unabletoquerydevice.\n"
FILE_VIDEO);
returnFALSE;
else
driver:
\t\t%s\n"
cap.driver);
//驱动名
card:
cap.card);
//摄像头信息
bus_info:
\t%s\n"
cap.bus_info);
//PCI总线信息
version:
\t%d\n"
cap.version);
//内核版本
capabilities:
\t%x\n"
cap.capabilities);
//以上打印信息详见设备能力结构体(structv4l2_capability)
if((cap.capabilities&
V4L2_CAP_VIDEO_CAPTURE))
Device%s:
supportscapture.\n"
V4L2_CAP_STREAMING))
supportsstreaming.\n"
//列举摄像头所支持像素格式
fmtdesc.index=0;
fmtdesc.type=V4L2_BUF_TYPE_VIDEO_CAPTURE;
Supportformat:
\n"
);
while(ioctl(fd,VIDIOC_ENUM_FMT,&
fmtdesc)!
=-1)
printf("
\t%d.%s\n"
fmtdesc.index+1,fmtdesc.description);
fmtdesc.index++;
//setfmt
fmt.type=V4L2_BUF_TYPE_VIDEO_CAPTURE;
//恒为此项
fmt.fmt.pix.pixelformat=V4L2_PIX_FMT_YUYV;
//视频数据存储类型
fmt.fmt.pix.height=480;
fmt.fmt.pix.width=640;
fmt.fmt.pix.field=V4L2_FIELD_INTERLACED;
//隔行扫描
if(ioctl(fd,VIDIOC_S_FMT,&
fmt)==-1)
Unabletosetformat\n"
if(ioctl(fd,VIDIOC_G_FMT,&
Unabletogetformat\n"
//setfps具体参考结构体v4l2_captureparm
setfps.type=V4L2_BUF_TYPE_VIDEO_CAPTURE;
/*timeperframe字段用于指定想要使用的帧频率,它是一个结构体:
numerator和denominator所描述的系数给出的是成功的帧之间的时间间隔。
numerator分子,denominator分母。
主要表达每次帧之间时间间隔。
numerator/denominator秒一帧。
*/
setfps.parm.capture.timeperframe.numerator=1;
setfps.parm.capture.timeperframe.denominator=30;
//本摄像头帧频范围[5,30]帧/秒
if(ioctl(fd,VIDIOC_S_PARM,&
setfps)==-1)
Unabletosetframerate\n"
setfpsOK!
if(ioctl(fd,VIDIOC_G_PARM,&
Unabletogetframerate\n"
getfpsOK!
timeperframe.numerator:
setfps.parm.capture.timeperframe.numerator);
timeperframe.denominator:
setfps.parm.capture.timeperframe.denominator);
//mmap
if(init_mmap()==FALSE)
cannotmmap!
returnTRUE;
(4)widget.h
namespaceUi{
classWidget;
classWidget:
publicQWidget
Q_OBJECT//上面内容为固定格式
explicitWidget(QWidget*parent=0);
//explicit可以避免发生隐式类型转换
~Widget();
Ui:
Widget*ui;
QImage*frame;
intrs;
unsignedintlen;
intconvert_yuv_to_rgb_buffer();
voidprint_quartet(unsignedinti);
VideoDevice*vd;
FILE*yuvfile;
unsignedcharrgb_buffer[640*480*3];
unsignedchar*yuv_buffer_pointer;
charY_frame[640*480];
//存储亮度Y分量
charCr_frame[240*320];
//存储蓝色浓度偏移量即U分量
charCb_frame[240*320];
//存储红色浓度偏移量即V分量
intwrite420();
//视频图像保存为YUV420,也可存储为YUV422
privateslots:
//定义槽
voidon_pushButton_start_clicked();
//按钮按下对应的处理,不定义成槽,按钮将失效
voidpaintEvent(QPaintEvent*);
//窗口刷新函数
#endif//WIDGET_H
(5)widget.cpp
charyuvfilename[11]={'
s'
'
a'
v'
e'
0'
.'
y'
u'
\0'
//视频保存文件的名称
Widget:
Widget(QWidget*parent):
QWidget(parent),
ui(newUi:
Widget)
ui->
setupUi(this);
vd=newVideoDevice(tr("
));
frame=newQImage(rgb_buffer,640,480,QImage:
Format_RGB888);
voidWidget:
paintEvent(QPaintEvent*)
rs=vd->
get_frame(&
yuv_buffer_pointer,&
len);
if(last_state==2&
&
state==0)
yuvfile=fopen(yuvfilename,"
wb+"
yuvfilename[5]++;
if(state==1)
rs=write420();
if(last_state==1&
state==2)
fclose(yuvfile);
intWidget:
write420()
intx,y;
longintindex1=0;
if(yuv_buffer_pointer[0]=='
)
return-1;
for(x=0;
x<
640;
x++)
for(y=0;
y<
480;
y++)
Y_frame[index1]=yuv_buffer_pointer[2*index1];
index1++;
index1=0;
x++,x++)
y++,y++)
Cb_frame[index1]=yuv_buffer_pointer[(x*640+y)*2+1];
Cr_frame[index1]=yuv_buffer_pointer[(x*640+y)*2+3];
//YUV422的程序
/*for(x=0;
for(y=0;
320;
{
Y_frame[index]=yuv_buffer_pointer[(x*320+y)*4];
Cb_frame[index]=yuv_buffer_pointer[(x*320+y)*4+1];
Y_frame[index+1]=yuv_buffer_pointer[(x*320+y)*4+2];
Cr_frame[index]=yuv_buffer_pointer[(x*320+y)*4+3];
index++;
}
}*/
fwrite(Y_frame,307200,1,yuvfile);
fwrite(Cb_frame,76800,1,yuvfile);
fwrite(Cr_frame,76800,1,yuvfile);
framecnt++;
writedframe%ld\n"
framecnt);
convert_yuv_to_rgb_buffer()
unsignedlongin,out=0;
inty0,u,y1,v;
intr,g,b;
for(in=0;
in<
IMG_WIDTH*IMG_HEIGTH*2;
in+=4)
y0=yuv_buffer_pointer[in+0];
u=yuv_buffer_pointer[in+1];
y1=yuv_buffer_pointer[in+2];
v=yuv_buffer_pointer[in+3];
r=y0+(1.370705*(v-128));
g=y0-(0.698001*(v-128))-(0.337633*(u-128));
b=y0+(1.732446*(u-128));
/*r=y0+1.042*(v-128);
g=y0-0.34414*(u-128)-0.71414*(v-128);
b=y0+1.772*(u-128);
*///YUV422程序
if(r>
255)r=255;
if(g>
255)g=255;
if(b>
255)b=255;
if(r<
0)r=0;
if(g<
0)g=0;
if(b<
0)b=0;
rgb_buffer[out++]=r;
rgb_buffer[out++]=g;
rgb_buffer[out++]=b;
r=y1+(1.370705*(v-128));
g=y1-(0.698001*(v-128))-(0.337633*(u-128));
b=y1+(1.732446*(u-128));
return0;
on_pushButton_start_clicked()
switch(state)
case0:
pushButton_start->
setText("
stopsave"
state=1;
break;
case1:
saveagain"
state=2;
case2:
startsave"
framecnt=0;
state=0;
default:
break;
(6)main.cpp
#include<
QtGui/QApplication>
#include"
widget.h"
intmain(intargc,char*argv[])
QApplicationa(argc,argv);
Widgetw;
w.show();
returna.exec();
三.运行效果
点击保存按钮后存放视频的文件,当关闭时自动生成下一个save01.yuv文件已接受下次视频数据,以此类推。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- USB 摄像头 视频 采集 QT 界面 显示 解读