OpenCV视频文件读取;摄像头实时数据 您所在的位置:网站首页 摄像头实时是什么意思 OpenCV视频文件读取;摄像头实时数据

OpenCV视频文件读取;摄像头实时数据

2024-06-10 08:52| 来源: 网络整理| 查看: 265

视频或摄像头实时画面读取本质上是读取图像,因为视频是由一帧一帧图像组成的。

人们的眼睛在1秒24帧,就可以看成是连续的画面;这样基本能流畅的读取视频。 

平常会用摄像头获取实时的画面数据;有时需要用摄像头记录保存一段画面数据;

那么又如何OpenCV来打开一段视频文件呢?

下面分为三个部分来分析,并附有原代码;

 

摄像头实时画面显示

思路流程:

定义一个Mat数据容器,等下用来存放摄像头的实时画面数据,使用 VideoCapture 函数来获取摄像头的实时画面数据;把VideoCapture 函数读取到摄像头数据,写到Mat数据容器(frame),读取的是当前帧;判断frame是否为空,如果不为空,用一个窗口(这里名字为window)显示摄像头的画面;最后记得释放资源。

需要注意的是:VideoCapture capture(0)中,0默认是笔记本的摄像头;如果是外接摄像头,这里改为1。

在实时显示画面数据中,需要使用waitKey( )函数;不然摄像头的画面不会停留,直接不显示的;在下面程序是停留20ms;

如果是waitKey(0);相当于一直阻塞在一帧数据中;画面会停留在一个画面的。

源代码:

#include using namespace cv; using namespace std; int main() { Mat frame; VideoCapture capture(0);//读取视摄像头实时画面数据,0默认是笔记本的摄像头;如果是外接摄像头,这里改为1 while (true) { capture >> frame; //读取当前帧 if(!frame.empty()){ //判断输入的视频帧是否为空的 imshow("window",frame); //在window窗口显示frame摄像头数据画面 } if(waitKey(20) == 'q') //延时20ms,获取用户是否按键的情况,如果按下q,会推出程序 break; } capture.release(); //释放摄像头资源 destroyAllWindows(); //释放全部窗口 return 0; }

升华:建议大家读取视频加异常判断 ,因为这样有利于追查报错原因 1)打开视频失败(各种原因) 

if(!cap.isOpened()) //检查打开是否成功  return; 

2)取帧失败异常(程序结尾判断) 

 cap>>frame;  if(!frame.empty()) //判断当前 帧是否为空  {  imshow(“video”, frame);  waitKey(30);  }  else break;

 

摄像头记录保存一段画面数据

OpenCV提供VideoWriter类写视频文件,类的构造函数可以指定文件名、播放帧率、帧尺寸、是否创建彩色视频。

先看看VideoWriter函数:

VideoWriter(filename, fourcc, fps, frameSize[, isColor])

参数解析:

第一个参数是要保存的文件的路径fourcc 指定编码器fps 要保存的视频的帧率frameSize 要保存的文件的画面尺寸isColor 指示是黑白画面还是彩色的画面

例如这样使用:VideoWriter writer("out.avi", CV_FOURCC('M', 'P', '4', '2'), 25.0,  (1920,1080), True)

fourcc 指定编码器有如下几种(正常是直接指定用哪一种编码器;如果填写为-1时,会弹出一个窗口给我们选择;)

CV_FOURCC('P', 'I', 'M', '1') = MPEG-1 codeCV_FOURCC('M', 'J', 'P', 'G') = motion-jpeg codecCV_FOURCC('M', 'P', '4', '2') = MPEG-4.2 codecCV_FOURCC('D', 'I', 'V', '3') = MPEG-4.3 codecCV_FOURCC('D', 'I', 'V', 'X') = MPEG-4 codecCV_FOURCC('U', '2', '6', '3') = H263 codecCV_FOURCC('I', '2', '6', '3') = H263I codecCV_FOURCC('F', 'L', 'V', '1') = FLV1 codec

代码实例:

#include using namespace cv; using namespace std; int main() { Mat frame; VideoCapture capture(0);//读取视摄像头实时画面数据,0默认是笔记本的摄像头;如果是外接摄像头,这里改为1 Size size0=Size(capture.get(CV_CAP_PROP_FRAME_WIDTH),capture.get(CV_CAP_PROP_FRAME_HEIGHT)); VideoWriter writer("out.avi",-1,capture.get(CV_CAP_PROP_FPS),size0,false); //也可以以下形式 //VideoWriter writer; //writer.open("out.avi", CV_FOURCC('X', 'V', 'I', 'D'),cap.get(CV_CAP_PROP_FPS),Size(cap.get(CV_CAP_PROP_FRAME_WIDTH),cap.get(CV_CAP_PROP_FRAME_HEIGHT))); while (true) { capture >> frame; if(!frame.empty()){ //判断输入的视频帧是否为空的 writer


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有