当前位置:   article > 正文

【openCV】读取视频、调用摄像头/电脑摄像头_opencv读取摄像头

opencv读取摄像头

原文链接:4、【opencv入门】读取视频、读取摄像头 - 阿牧路泽 - 博客园

一、介绍

视频读取本质上就是读取图像,因为视频是由一帧一帧图像组成的。1秒24帧基本就能流畅的读取视频了。 
1、读取视频有两种方法:

  1. 1) VideoCapture cap;
  2. cap.open(“1.avi”);
  3. 2VideoCapture cap(“1.avi”);

2、循环显示每一帧: 

  1. while(1)
  2. {
  3. Mat frame; //定义Mat变量,用来存储每一帧
  4. cap>>frame; //读取当前帧方法一
  5. //cap.read(frame); //读取当前帧方法二
  6. imshow(“视频显示”, frame); //显示一帧画面
  7. waitKey(30); //延时30ms
  8. }

二、读取视频

【示例】

  1. //读取视频
  2. #include<opencv2/core/core.hpp>
  3. #include<opencv2/imgproc/imgproc.hpp>
  4. #include<opencv2/highgui/highgui.hpp>
  5. #include<iostream>
  6. using namespace std;
  7. using namespace cv;
  8. int main(){
  9. VideoCapture cap;
  10. cap.open("../../1.mp4"); //打开视频,以上两句等价于VideoCapture cap("E://2.avi");
  11. if(!cap.isOpened())//如果视频不能正常打开则返回
  12. return -1;
  13. int width = cap.get(CV_CAP_PROP_FRAME_WIDTH);//帧宽度
  14. int height = cap.get(CV_CAP_PROP_FRAME_HEIGHT);//帧高度
  15. int frameRate = cap.get(CV_CAP_PROP_FPS);//帧率 × frames/s
  16. int totalFrames = cap.get(CV_CAP_PROP_FRAME_COUNT);//总帧数
  17. //获取视频的相关参数
  18. cout << "视频的宽度:" << width << endl;
  19. cout << "视频的高度:" << height << endl;
  20. cout << "视频的总帧数:" << totalFrames << endl;
  21. cout << "帧率:" << frameRate << endl;
  22. Mat frame;
  23. while(1)
  24. {
  25. cap>>frame;//等价于cap.read(frame);
  26. if(frame.empty())//如果某帧为空则退出循环
  27. break;
  28. imshow("video", frame);
  29. waitKey(20);//每帧延时20毫秒
  30. }
  31. cap.release();//释放资源
  32. return 0;
  33. }

三、读取摄像头

读取摄像头和读取视频大同小异,主要是这句代码有些许不同。 

  1. VideoCapture cap;
  2. cap.open(0);

读取视频时可以传入视频路径,而读取摄像头传入的是index索引号。

注: 
  1)如果默认笔记本/台式机只有一个USB摄像头,Index=0; 如果有2个,一般Index为0和1,根据具体情况区分,摄像头接入和断开会改变Index值 
  2)如果接入2个以上,但只想用指定的一个,可以在设备管理器中禁用其他,同时Index设置为0

  3)因为开启摄像头后一直在进行读取,所以需要用waitKey()返回值判断退出预览 

  1. imshow(“video”, frame);
  2. if(waitKey(30)>0)//无按键按下返回-1,按键按下时退出
  3. break;

也可以指定按键退出: 

  1. if(waitKey(30)==27) //Esc键退出,ESC的ASCLL码为27
  2. break;

【示例】

  1. //读取摄像头
  2. #include <opencv2/core/core.hpp>
  3. #include <opencv2/highgui/highgui.hpp>
  4. #include <opencv2/imgproc/imgproc.hpp>
  5. #include <iostream>
  6. using namespace std;
  7. using namespace cv;
  8. int main(){
  9. VideoCapture cap;
  10. cap.open(0); //打开摄像头
  11. if(!cap.isOpened())
  12. return -1;
  13. Mat frame;
  14. while(1)
  15. {
  16. cap>>frame;//等价于cap.read(frame);
  17. //Canny(frame, frame, 30, 100);//canny边缘检测,去掉这一行就是纯粹的读取摄像头了
  18. cvtColor(frame, frame, CV_BGR2HSV);//BGR空间转为HSV颜色空间,注意,两者不能同时对同一张图片(在此为frame)进行处理,否则报错
  19. if(frame.empty())
  20. break;
  21. imshow("video", frame);
  22. if(waitKey(20)>0)//按下任意键退出摄像头  因电脑环境而异,有的电脑可能会出现一闪而过的情况
  23. break;
  24. }
  25. cap.release();//释放所有资源
  26. destroyAllWindows();//关闭所有窗口
  27. return 0;
  28. }

四、写入视频

1、介绍

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

  1. CV_WRAP VideoWrite();
  2. CV_WRAP VideoWrite(const string& filename, int fourcc, double fps, Size frameSize, bool isColor=true);

(2)两种写入帧方法:

  1. writer.write(frame);
  2. writer << frame;

(3)注意事项: 
  1)写入视频前需安装对应的编解码器 
  2)生成视频是否支持彩色应与构造函数设置一致 
  3)生成视频尺寸需与读取视频尺寸一致

【示例】

  1. //写入视频
  2. #include <opencv2/core/core.hpp>
  3. #include <opencv2/highgui/highgui.hpp>
  4. #include <opencv2/imgproc/imgproc.hpp>
  5. #include<iostream>
  6. using namespace cv;
  7. using namespace std;
  8. int main(){
  9. VideoCapture cap;
  10. cap.open("../../1.avi");
  11. Size size0=Size(cap.get(CV_CAP_PROP_FRAME_WIDTH),cap.get(CV_CAP_PROP_FRAME_HEIGHT));
  12. VideoWriter writer("../../out.avi",-1,cap.get(CV_CAP_PROP_FPS),size0,false);
  13. if(!cap.isOpened())
  14. return -1;
  15. Mat frame;
  16. while(1)
  17. {
  18. cap>>frame;
  19. Canny(frame,frame,30,100);
  20. if(frame.empty())
  21. break;
  22. writer<<frame;//等同于writer.write(frame);
  23. imshow("video", frame);
  24. if(waitKey(10)>0)
  25. break;
  26. }
  27. cout<<"write end!";
  28. cap.release();
  29. //destroyAllWindows();
  30. return 0;
  31. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/木道寻08/article/detail/819583
推荐阅读
相关标签
  

闽ICP备14008679号