OpenCV库编写打开摄像头压缩视频的程序

一、设备连接

检查开启状态;
win+r键并输入services.msc
在这里插入图片描述
检查VMware USB Arbitration Service是否开启;
在这里插入图片描述
②打开摄像头
在这里插入图片描述

二、播放视频

创建一个test2.cpp文件
在这里插入图片描述
并加入以下代码:

#include <opencv2/opencv.hpp>
using namespace cv;
int main()
{
    
    
	//从摄像头读取视频
	VideoCapture capture("1.mp4");
	//循环显示每一帧
	while(1){
    
    
		Mat frame;//定义一个Mat变量,用于存储每一帧的图像
		capture >> frame;//读取当前帧
		if(frame.empty())//播放完毕,退出
			break;
		imshow("读取视频帧",frame);//显示当前帧
		waitKey(30);//掩饰30ms
	}
	system("pause");
	return 0;
}

在这里插入图片描述
编译 test2.cpp 文件;
在这里插入图片描述
问题:
这里输出时会报错:
在这里插入图片描述
这是因为linux不认识 system(“pause”); 这条语句,
改为:
添加:

#include <unistd.h>

并将

system("pause");

改为

pause();

即可在linux系统下实现保留控制台的效果。
输出结果:
在这里插入图片描述

三、录制视频

添加文件test3.cpp
在这里插入图片描述
添加以下代码:

/*********************************************************************
打开电脑摄像头,空格控制视频录制,ESC退出并保存视频RecordVideo.avi
*********************************************************************/
#include<iostream>
#include <opencv2/opencv.hpp>
#include<opencv2/core/core.hpp>
#include<opencv2/highgui/highgui.hpp>
using namespace cv;
using namespace std;

int main()
{
    
    
	//打开电脑摄像头
	VideoCapture cap(0);
	if (!cap.isOpened())
	{
    
    
		cout << "error" << endl;
		waitKey(0);
		return 0;
	}

	//获得cap的分辨率
	int w = static_cast<int>(cap.get(CV_CAP_PROP_FRAME_WIDTH));
	int h = static_cast<int>(cap.get(CV_CAP_PROP_FRAME_HEIGHT));
	Size videoSize(w, h);
	VideoWriter writer("RecordVideo.avi", CV_FOURCC('M', 'J', 'P', 'G'), 25, videoSize);
	
	Mat frame;
	int key;//记录键盘按键
	char startOrStop = 1;//0  开始录制视频; 1 结束录制视频
	char flag = 0;//正在录制标志 0-不在录制; 1-正在录制

	while (1)
	{
    
    
		cap >> frame;
		key = waitKey(100);
		if (key == 32)//按下空格开始录制、暂停录制   可以来回切换
		{
    
    
			startOrStop = 1 - startOrStop;
			if (startOrStop == 0)
			{
    
    
				flag = 1;
			}
		}
		if (key == 27)//按下ESC退出整个程序,保存视频文件到磁盘
		{
    
    
			break;
		}

		if (startOrStop == 0 && flag==1)
		{
    
    
			writer << frame;
			cout << "recording" << endl;
		}
		else if (startOrStop == 1)
		{
    
    
			flag = 0;
			cout << "end recording" << endl;
			
		}
		imshow("picture", frame);
	}
	cap.release();
	writer.release();
	destroyAllWindows();
	return 0;
}

在这里插入图片描述
编译:
在这里插入图片描述
输出结果:
在这里插入图片描述

参考博客

https://blog.csdn.net/ssj925319/article/details/109231145

猜你喜欢

转载自blog.csdn.net/changlingMYlove/article/details/120816055