当前位置: 首页 > news >正文

cgi做网站用织梦做网站都需要用什么

cgi做网站,用织梦做网站都需要用什么,烟台建网站公司,网站备案证件简介 linux环境使用V4l2实现摄像头捕捉&#xff0c;界面流畅播放并可以保存图片到本地。 代码 void VideoCapture::run() {qDebug() << "VideoCapture start";// 打开设备int fd open("/dev/video0", O_RDWR);if(fd < 0){qDebug("video设…

简介

linux环境使用V4l2实现摄像头捕捉,界面流畅播放并可以保存图片到本地。

代码

void VideoCapture::run()
{qDebug() << "VideoCapture start";// 打开设备int fd = open("/dev/video0", O_RDWR);if(fd < 0){qDebug("video设备打开失败\n");return;}else{qDebug("video设备打开成功\n");}//查看设备是否为视频采集设备struct v4l2_capability vcap;ioctl(fd, VIDIOC_QUERYCAP, &vcap);if (!(V4L2_CAP_VIDEO_CAPTURE & vcap.capabilities)){qDebug("No capture video device!\n");return;}// 枚举帧格式struct v4l2_fmtdesc fmtdesc;fmtdesc.index = 0;fmtdesc.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;qDebug("Video支持所有格式如下:");while(ioctl(fd, VIDIOC_ENUM_FMT, &fmtdesc) == 0){qDebug("v4l2_format %d:%s",fmtdesc.index, fmtdesc.description);fmtdesc.index++;}// 枚举分辨率struct v4l2_frmsizeenum frmsize;frmsize.index = 0;frmsize.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;qDebug("Video支持分辨率如下:");while(ioctl(fd, VIDIOC_ENUM_FRAMESIZES, &frmsize) == 0){qDebug("%d frame_size<%d*%d %d>", frmsize.index, frmsize.discrete.width, frmsize.discrete.height, frmsize.pixel_format);frmsize.index++;}// 枚举某分辨率下的帧速率int pixel_width = 1280;int pixel_height = 720;struct v4l2_frmivalenum frmival;frmival.index = 0;frmival.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;frmival.pixel_format = V4L2_PIX_FMT_MJPEG;frmival.width = pixel_width;frmival.height = pixel_height;while(ioctl(fd,VIDIOC_ENUM_FRAMEINTERVALS, &frmival) == 0){qDebug("<%d*%d> support frame_size %dfps", frmival.width, frmival.height, frmival.discrete.denominator / frmival.discrete.numerator);frmival.index++;}// 设置采集格式struct v4l2_format vfmt;vfmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;vfmt.fmt.pix.width = pixel_width;vfmt.fmt.pix.height = pixel_height;vfmt.fmt.pix.pixelformat = V4L2_PIX_FMT_MJPEG;if(ioctl(fd, VIDIOC_S_FMT, &vfmt) < 0){qDebug("video设置格式失败\n");return;}// 检查设置参数是否生效if(ioctl(fd, VIDIOC_G_FMT, &vfmt) < 0){qDebug("video获取格式失败\n");return;}// 获取帧信息struct v4l2_streamparm streamparm;streamparm.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;ioctl(fd, VIDIOC_G_PARM, &streamparm);qDebug("current frameRate <%d * %d>\n", streamparm.parm.capture.timeperframe.numerator, streamparm.parm.capture.timeperframe.denominator);// 设置帧信息if(V4L2_CAP_TIMEPERFRAME & streamparm.parm.capture.capability){streamparm.parm.capture.timeperframe.numerator = 1;streamparm.parm.capture.timeperframe.denominator = 30;
//        if(ioctl(fd, VIDIOC_S_PARM, &streamparm) < 0)
//        {
//            qDebug("video设置帧率失败 <%d * %d>", streamparm.parm.capture.timeperframe.numerator, streamparm.parm.capture.timeperframe.denominator);
//        }}// 申请缓冲区空间struct v4l2_requestbuffers reqbuf;reqbuf.type  = V4L2_BUF_TYPE_VIDEO_CAPTURE;reqbuf.count = m_frameCount;reqbuf.memory = V4L2_MEMORY_MMAP;if(ioctl(fd, VIDIOC_REQBUFS, &reqbuf) < 0){qDebug("video申请缓冲区失败\n");return;}// 将帧缓冲映射到进程地址空间struct v4l2_buffer buf;buf.type   = V4L2_BUF_TYPE_VIDEO_CAPTURE;buf.memory = V4L2_MEMORY_MMAP;// 将每一帧对应的缓冲区的起始地址保存在m_userVideoBuf数组中,读取采集数据时,只需直接读取映射区即可for(buf.index=0; buf.index<m_frameCount; buf.index++){ioctl(fd, VIDIOC_QUERYBUF, &buf);m_userVideoBuf[buf.index] = mmap(NULL, buf.length, PROT_READ | PROT_WRITE, MAP_SHARED, fd, buf.m.offset);m_userVideoBufSize[buf.index] = buf.length;if(m_userVideoBuf[buf.index] == MAP_FAILED){qDebug("video mmap failed\n");return;}// 入队操作if(ioctl(fd, VIDIOC_QBUF, &buf) < 0){qDebug("入队失败\n");return;}}// 开始采集enum v4l2_buf_type type = V4L2_BUF_TYPE_VIDEO_CAPTURE;if (ioctl(fd, VIDIOC_STREAMON, &type) < 0){qDebug("video开始采集失败");m_isRun = false;}//持续读取图像数据 使用select监听数据fd_set fds;struct timeval tv;tv.tv_sec  = 2;tv.tv_usec = 0;//图片文件缓存char *fileBuf = new char[3*1024*1024];while(m_isRun){FD_ZERO(&fds);FD_SET(fd, &fds);int ret = select(fd+1, &fds, NULL, NULL, &tv);if(ret < 0){qDebug("select io error\n");break;}// 读取帧struct v4l2_buffer readbuffer;readbuffer.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;readbuffer.memory = V4L2_MEMORY_MMAP;if(ioctl(fd, VIDIOC_DQBUF, &readbuffer) < 0){qDebug("读取帧失败\n");}//        qDebug() << QDateTime::currentDateTime().toString("hh:mm:ss:zzz");//重点:帧数据处理const uchar *data = (const uchar *)m_userVideoBuf[readbuffer.index];int length = readbuffer.length;//构造并显示QImage image = QImage::fromData(data, length);emit sigUpdateImage(image.copy());// 再次入队if(ioctl(fd, VIDIOC_QBUF, &readbuffer) < 0){qDebug("再次入队失败\n");}}// 停止采集if (ioctl(fd, VIDIOC_STREAMOFF, &type) < 0){qDebug("停止采集失败\n");}// 释放映射for(uint i=0; i<m_frameCount; i++){munmap(m_userVideoBuf[i], m_userVideoBufSize[i]);}//关闭文件emit sigUpdateImage(QImage());close(fd);delete[] fileBuf;qDebug() << "VideoCapture stop";
}
http://www.sczhlp.com/news/59675/

相关文章:

  • 教做网站视频自己做链接网站
  • 刚刚建设的网站如何放图片海报设计网站官网
  • 泰国做网站网站要判几年wordpress站内私信
  • html5 手机网站青岛外包加工网
  • 浙江网站建设网站优化wordpress主题仿北京时间设置
  • 淄博seo网站排名优化北京中高风险地区最新名单最新
  • wordpress地址和站点地址错网站广告位
  • 定时截屏服务
  • SIGIR会议推动包容性AI技术发展
  • 网站做什么推广好泾阳做网站
  • 湖南建设网站公司网站开发 定制 合同范本
  • 如何用域名访问网站开源saas多用户建站系统
  • 搜索引擎网站推广怎么做如何在网上开店
  • 阿里巴巴网站图片怎么做的seo第三方点击软件
  • 重庆高端网站制作网店推广方法和技巧
  • 建设网站的市场分析加密网站
  • [PO Final 2024] 鬼抓人 / Tag 题解
  • 25.9.1随笔联考总结
  • lc1014-最佳观光组合
  • 网站开发php和ui抽奖的网站怎么做
  • 宁夏网站建设中北京有限公司有哪些
  • 济宁网站建设联系方式一份简短的项目计划书
  • mysql索引优化实战
  • 第四天013表达式
  • 一级a做爰片就在线手机看韩国网站网页找什么公司维护
  • 怎么创建免费自己的网站平台环球新军事
  • 怎么建一个购物网站阿里手机网站开发框架
  • 网站正在建设中模板下载wordpress自动发布插件
  • 湛江建站公司模板注册域名要多少钱
  • 形象类网站网页制作与网站建设课程设计