opencv学习-视频加载与摄像头调用

Posted 殇堼

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了opencv学习-视频加载与摄像头调用相关的知识,希望对你有一定的参考价值。

一、API-VideoCapture

1.调用电脑摄像头:VideoCapture cap(1);
2.调用USB外接摄像头:VideoCapture cap(0);
3.选择可用的摄像头:VideoCapture cap(-1);
4.获取IP视频流:例如:VideoCapture video(“D:/images/balltest.mp4”);VideoCapture cap( “http:/ / youku.elecfans.com/video.flv”);

二、关键设置

播放速度的设置

等速:1000/video.get(CAP_PROP_FPS),1000毫秒(1秒)除以帧率(FPS)等于每帧图像播放时停留的时间,意味着播放速度等于原视频的速度,一般视频播放速度大于25帧/s,因此当频率为25/s时,1000/video.get(CAP_PROP_FPS)等于40毫秒

		char c = waitKey(1000/video.get(CAP_PROP_FPS));
		if (c == 27) { // ESC退出
			break;
			}

加速:X<1000/video.get(CAP_PROP_FPS),假如X小于40,则会加速播放;
减速:X>1000/video.get(CAP_PROP_FPS)。

		char c = waitKey(X);
		if (c == 27) { // ESC退出
			break;
			}

if (c == 27) { break};的解释

waitKey(delay)返回值:
等待期间有按键:返回按键的ASCII码(比如:Esc的ASCII码为27);
因此按了esc之后就会break,退出程序。

三、全部代码

1.视频加载

#include<iostream>
#include<opencv2/opencv.hpp>

using namespace std;
using namespace cv;

int main()
{   //获取摄像头:电脑自带摄像头 为1 ,外部 0;VideoCapture video("视频路径以及名称")
	VideoCapture video("D:/images/balltest.mp4");

	//判断视频能否正常打开
	if (video.isOpened()) {
		cout << "width=" << video.get(CAP_PROP_FRAME_WIDTH);
		cout << "fps=" << video.get(CAP_PROP_FPS) << endl;//读取视频流中的频率;
	}
	else
	{
		printf("请确认视频文件路径是否正确");
		return -1;
	}

	//循环发布图像
	while (1)//循环显示每一帧
	{
		Mat frame;//存储每一帧图像
		video >> frame;//读取当前帧

		if (frame.empty())
		{
			break;
		}
		imshow("video", frame);
		//播放速度设置
		char c = waitKey(1000/video.get(CAP_PROP_FPS));
		if (c == 27) { // ESC退出
			break;
			}	
	}
	video.release();//释放资源	
	waitKey();
	return 0;
}

2.摄像头调用

#include<iostream>
#include<opencv2/opencv.hpp>

using namespace std;
using namespace cv;

int main()
{   //获取摄像头:电脑自带摄像头 为1 ,外部 0;VideoCapture video("视频路径以及名称")
	VideoCapture video(0);

	//判断视频能否正常打开
	if (video.isOpened()) {
		cout << "width=" << video.get(CAP_PROP_FRAME_WIDTH);
		cout << "height=" << video.get(CAP_PROP_FRAME_HEIGHT) << endl;
	}
	else
	{
		printf("请确认视频文件路径是否正确");
		return -1;
	}

	//循环发布图像
	while (1)//循环显示每一帧
	{
		Mat frame;//存储每一帧图像
		video >> frame;//读取当前帧

		if (frame.empty())
		{
			break;
		}
		flip(frame, frame, 1);//左右翻转
		imshow("video", frame);
		char c = waitKey(5);
		if (c == 27) { // ESC退出
			break;
			}	
	}
	video.release();//释放资源	
	waitKey();
	return 0;
}

循环发布图像可以改为:

//循环发布图像
	Mat frame;//存储每一帧图像
	while (video.read(frame)) {
		if (frame.empty())
		{
			break;
		}
		flip(frame, frame, 1);//左右翻转
		imshow("video", frame);
		char c = waitKey(5);
		if (c == 27) { // ESC退出
			break;
		}
	}
	video.release();//释放资源	
	waitKey();
	return 0;
}

以上是关于opencv学习-视频加载与摄像头调用的主要内容,如果未能解决你的问题,请参考以下文章

以代码为基础的opencv-python学习 图片的加载以及视频展示

机器视觉行业实践技巧 -- OpenCV技巧与方法:代码脚手架 -- 图像处理

机器视觉行业实践技巧 -- OpenCV技巧与方法:代码脚手架 -- 图像处理

linux ubuntu opencv 调用本地USB摄像头测试(失败了,再说!)

番外2. OpenCV 中摄像头捕获与视频处理与常见问题解决方案

番外2. OpenCV 中摄像头捕获与视频处理与常见问题解决方案