USB摄像头视频采集与QT界面显示解读Word文件下载.docx

上传人:b****5 文档编号:18557570 上传时间:2022-12-27 格式:DOCX 页数:21 大小:1.06MB
下载 相关 举报
USB摄像头视频采集与QT界面显示解读Word文件下载.docx_第1页
第1页 / 共21页
USB摄像头视频采集与QT界面显示解读Word文件下载.docx_第2页
第2页 / 共21页
USB摄像头视频采集与QT界面显示解读Word文件下载.docx_第3页
第3页 / 共21页
USB摄像头视频采集与QT界面显示解读Word文件下载.docx_第4页
第4页 / 共21页
USB摄像头视频采集与QT界面显示解读Word文件下载.docx_第5页
第5页 / 共21页
点击查看更多>>
下载资源
资源描述

USB摄像头视频采集与QT界面显示解读Word文件下载.docx

《USB摄像头视频采集与QT界面显示解读Word文件下载.docx》由会员分享,可在线阅读,更多相关《USB摄像头视频采集与QT界面显示解读Word文件下载.docx(21页珍藏版)》请在冰豆网上搜索。

USB摄像头视频采集与QT界面显示解读Word文件下载.docx

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文件已接受下次视频数据,以此类推。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 农林牧渔

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1