ImageVerifierCode 换一换
格式:DOCX , 页数:21 ,大小:1.06MB ,
资源ID:8626193      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/8626193.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(USB摄像头视频采集与QT界面显示解读.docx)为本站会员(b****6)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

USB摄像头视频采集与QT界面显示解读.docx

1、USB摄像头视频采集与QT界面显示解读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,其他默认。设置好这些后,其他默认,直到工程设置结束。如下图所示:2. 修改ui界面打开Widget.ui,进入可视化设计界面。默认情况中间的主设计区下只有一个Wid

2、get的对象。由于USB摄像头采集到的图像需要显示到一个QLabel的部件上,从右侧的部件列表的“DisplayWidget”中选择“Label”部件拖动到中间;此外,我们需要两个按钮,一个用于启动和终止视频数据的保存,一个用于以后的视频文件的压缩。从右侧的”Buttons”中两次选择”Push Buttion”部件并拖动到Widget中。 从上图可以看出,对象Widget下已经添加了一个label部件,两个push button部件。右上角Object与Class的关系是:Object对应的物体是属于Class对应的类,反映了Qt的继承关系。接下来设置上面四种部件的属性,Widget的属性按

3、照下面图示设置,其中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设置图示)最后生成的界面:点击Debug

4、会得到Debug文档,里面有你设置的信息。编译运行后,会在建立的工程文件夹下生成很多文件,重要的是widget.ui文件,其他的文件要根据你具体的应用作出相应的修改。Qt界面最终的效果图为:二 USB摄像头视频采集与Qt界面显示源代码分析源码包含:common.h VideoDevice.h widget.h VideoDevice.cpp widget.cpp main.cppcommon.h主要定义了USB采集到的图像的宽度,高度等信息;Videodevice.h定义了VideoDevice类,使它继承于Qt的基类QObject,定义了VideoDevice的构造函数与析构函数,重要的是定

5、义了实现V4L2视频架构的函数;Videodevice.cpp具体实现了Videodevice.h定义的函数,完成了基于V4L2架构的视频采集;widget.h定义了Widget窗口类,使它继承于Qt窗口类QWidget,并定义了YUV到RGB颜色转变的函数;QT界面按钮操作的实现函数,以及视频窗口的刷新时间painEvent函数;widget.cpp实现了widget.h定义的函数。下面介绍各文件的主要代码段:(1)common.h#ifndef COMMON_H#define COMMON_H/ #define IMG_WIDTH 640/定义视频的宽度为640#define IMG_HE

6、IGTH 480/定义视频的高度为480#endif / COMMON_H(2) Videodevice.h#define CLEAR(x) memset(&(x), 0, sizeof(x)/定义CLEAR为内存清零class VideoDevice : public QObject Q_OBJECT /有了这条语句才能使用QT中的signal和slot机制public: VideoDevice(QString dev_name);/构造函数定义,用于初始化 VideoDevice();/析构函数用于释放内存 int get_frame(unsigned char * yuv_buffer_

7、pointer, size_t* len);/获取视频帧 int unget_frame();/释放视频帧,让出缓存空间准备新的视频帧数据private: int open_device();/打开设备 int init_device();/初始化设备 int start_capturing();/启动视频采集 int init_mmap();/内存映射初始化 int stop_capturing();/停止视频采集 int uninit_device();/注销设备 int close_device();/关闭设备 struct buffer void * start;/视频缓冲区的起始地址

8、 size_t length;/缓冲区的长度 ; QString dev_name; int fd;/video0 file buffer* buffers; unsigned int n_buffers; int index;signals: /void display_error(QString);#endif / VIDEODEVICE_H(3)Videodevice.cpp#define FILE_VIDEO /dev/video0VideoDevice:VideoDevice(QString dev_name)/VideoDevice的构造函数进行初始化 this-dev_name

9、= dev_name; this-fd = -1; this-buffers = NULL; this-n_buffers = 0; this-index = -1; if(open_device() = FALSE) close_device(); if(init_device() = FALSE) close_device(); if(start_capturing() = FALSE) stop_capturing(); close_device(); VideoDevice:VideoDevice()/VideoDevice的析构函数 if(stop_capturing() = FAL

10、SE) if(uninit_device() = FALSE) if(close_device() = FALSE) int VideoDevice:init_device()/设备初始化 v4l2_capability cap;/设备能力结构体 v4l2_format fmt;/设置视频像素 v4l2_streamparm setfps;/设置采样率 v4l2_fmtdesc fmtdesc;/查询摄像头支持像素格式 if(ioctl(fd, VIDIOC_QUERYCAP, &cap) = -1) printf(Error opening device %s: unable to quer

11、y device.n,FILE_VIDEO); return FALSE; else printf(driver:tt%sn,cap.driver);/驱动名 printf(card:tt%sn,cap.card);/摄像头信息 printf(bus_info:t%sn,cap.bus_info);/PCI总线信息 printf(version:t%dn,cap.version);/内核版本 printf(capabili ties:t%xn,cap.capabilities); /以上打印信息详见设备能力结构体(struct v4l2_capability) if (cap.capabili

12、ties & V4L2_CAP_VIDEO_CAPTURE) printf(Device %s: supports capture.n,FILE_VIDEO); if (cap.capabilities & V4L2_CAP_STREAMING) printf(Device %s: supports streaming.n,FILE_VIDEO); /列举摄像头所支持像素格式 fmtdesc.index=0; fmtdesc.type=V4L2_BUF_TYPE_VIDEO_CAPTURE; printf(Support format:n); while(ioctl(fd,VIDIOC_ENU

13、M_FMT,&fmtdesc)!=-1) printf(t%d.%sn,fmtdesc.index+1,fmtdesc.description); fmtdesc.index+; /set fmt 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(

14、ioctl(fd, VIDIOC_S_FMT, &fmt) = -1) printf(Unable to set formatn); return FALSE; if(ioctl(fd, VIDIOC_G_FMT, &fmt) = -1) printf(Unable to get formatn); return FALSE; /set fps 具体参考结构体v4l2_captureparm setfps.type = V4L2_BUF_TYPE_VIDEO_CAPTURE; /*timeperframe字段用于指定想要使用的帧频率,它是一个结构体: numerator 和denominato

15、r所描述的系数给出的是成功的帧之间的时间间隔。 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) printf(Unable to set frame raten); return FALSE; e

16、lse printf(set fps OK!n); if(ioctl(fd, VIDIOC_G_PARM, &setfps) = -1) printf(Unable to get frame raten); return FALSE; else printf(get fps OK!n); printf(timeperframe.numerator:t%dn,setfps.parm.capture.timeperframe.numerator); printf(timeperframe.denominator:t%dn,setfps.parm.capture.timeperframe.denom

17、inator); /mmap if(init_mmap() = FALSE ) printf(cannot mmap!n); return FALSE; return TRUE;(4)widget.h namespace Ui class Widget;class Widget : public QWidget Q_OBJECT /上面内容为固定格式public: explicit Widget(QWidget *parent = 0);/explicit可以避免发生隐式类型转换 Widget();private: Ui:Widget *ui; QImage *frame; int rs; u

18、nsigned int len; int convert_yuv_to_rgb_buffer(); void print_quartet(unsigned int i); VideoDevice *vd; FILE * yuvfile; unsigned char rgb_buffer640*480*3; unsigned char * yuv_buffer_pointer; char Y_frame640*480;/存储亮度Y分量 char Cr_frame240*320; /存储蓝色浓度偏移量即U分量 char Cb_frame240*320; /存储红色浓度偏移量即V分量 int wri

19、te420();/视频图像保存为YUV420,也可存储为YUV422private slots:/定义槽 void on_pushButton_start_clicked();/按钮按下对应的处理,不定义成槽,按钮将失效 void paintEvent(QPaintEvent *);/窗口刷新函数;#endif / WIDGET_H(5) widget.cppchar yuvfilename11 = s,a,v,e,0,0,.,y,u,v,0;/视频保存文件的名称Widget:Widget(QWidget *parent) : QWidget(parent), ui(new Ui:Widget

20、) ui-setupUi(this); vd = new VideoDevice(tr(/dev/video0);frame = new QImage(rgb_buffer,640,480,QImage:Format_RGB888);void Widget:paintEvent(QPaintEvent *) rs = vd-get_frame(&yuv_buffer_pointer,&len);if(last_state=2 & state = 0) yuvfile = fopen(yuvfilename,wb+); yuvfilename5+; if(state = 1) rs = writ

21、e420(); if(last_state=1 & state=2) fclose(yuvfile);int Widget:write420() int x,y; long int index1 =0; if (yuv_buffer_pointer0 = 0) return -1; for(x=0;x640;x+) for(y=0;y480;y+) Y_frameindex1=yuv_buffer_pointer2*index1; index1+; index1=0; for(x=0;x480;x+,x+) for(y=0;y640;y+,y+) Cb_frameindex1=yuv_buff

22、er_pointer(x*640+y)*2+1; Cr_frameindex1=yuv_buffer_pointer(x*640+y)*2+3; index1+; /YUV422的程序 /* for(x=0;x480;x+) for(y=0;y320;y+) Y_frameindex= yuv_buffer_pointer(x*320+y)*4; Cb_frameindex= yuv_buffer_pointer(x*320+y)*4 + 1; Y_frameindex+1= yuv_buffer_pointer(x*320+y)*4 + 2; Cr_frameindex= yuv_buffe

23、r_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+; printf(writed frame %ldn,framecnt);int Widget:convert_yuv_to_rgb_buffer() unsigned long in, out = 0; int y0, u, y1, v; int r, g, b; for(in = 0

24、; in 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 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 pushButton_start-setText(stop save); state = 1; break; case 1: ui-pushButton_start-setText(save again); state = 2; break; case 2: ui-pushButton_start-setText(start save); framecnt=0; state = 0; break; default :break; (6) main.cpp#include #include widget.hint main(int argc, char *argv) QApplication a(argc, argv); Widget w; w.show(); return a.exec();三 运行效果点击保存按钮后存放视频的文件,当关闭时自动生成下一个save01.yuv文件已接受下次视频数据,以此类推。

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

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