OpenCV图片拍照及视频录制方法

一、概述

在视觉中通常需要对图片及视频等素材进行采集,为此准备下面的两个代码作为常用小代码工具。

二、OpenCV图片拍照方法

#include 
#include 
#include 
#include 
#include 
#include  

using namespace std;
using namespace cv;

int main(int argc, const char** argv)            //程序主函数
{

	VideoCapture cap(0);                        //设置打开摄像头的ID

	cap.set(CV_CAP_PROP_FRAME_WIDTH, 1280);  //设置捕获视频的宽度
	cap.set(CV_CAP_PROP_FRAME_HEIGHT, 720);  //设置捕获视频的高度

	if (!cap.isOpened())                         //判断是否成功打开相机
	{ 
		return -1;
	}

	Mat frame;
	cap >> frame;                                //从相机捕获一帧图像

	char key; 
	char pic_name[40];
	int ROI_Count=1;

	while (1)
	{
		cap >> frame;                            //从相机捕获一帧图像     
		imshow("Video", frame);
		key=cvWaitKey(33);  
		if(key==32)           //the Ascii of "Space key" is 32   
		{
		   	sprintf(pic_name,"../pic_saved/pic_%d.bmp",ROI_Count);		        		     
		   	cv::imwrite(pic_name,frame);	
			ROI_Count++;
		} 

	}

	return 0;
}

三、opencv视频保存方法

#include 
#include 
#include 
#include 
#include 
#include  

using namespace std;
using namespace cv;

int main(int argc, const char** argv)            //程序主函数
{
	VideoCapture cap(0);    					//设置打开摄像头的ID

	cap.set(CV_CAP_PROP_FRAME_WIDTH, 1280);  //设置捕获视频的宽度
	cap.set(CV_CAP_PROP_FRAME_HEIGHT, 720);  //设置捕获视频的高度

	if (!cap.isOpened())                         //判断是否成功打开相机
	{ 
		return -1;
	}
	int vedio_width = cap.get(CV_CAP_PROP_FRAME_WIDTH);    //获取图像的宽度
	int vedio_height = cap.get(CV_CAP_PROP_FRAME_HEIGHT);  //获取图像的高度

	VideoWriter vedio("../vedio_out.avi", CV_FOURCC('M','P','4','2'),25,Size(vedio_width,vedio_height));

	Mat frame;


	while (1)
	{
		cap >> frame;                            //从相机捕获一帧图像     
		if(frame.empty()==true)
			break;

		imshow("Video_out", frame);
		vedio << frame;                        //写入一帧视频
		 
		if(waitKey(25)==27)                   //the Ascii of "ESC key" is 27  
		{
			break;
		} 

	}
	return 0;
}

  • 其中,对VideoWriter 函数进行如下说明:
    • 该函数的常用构造函数如下:
      VideoWriter(const string& filename, int fourcc, double fps,Size frameSize, bool isColor=true);
    
    • 第一个参数为存储是视频名称(包含路径)
    • 第二个参数fourcc 为视频编码方式, 表示用于压缩帧的4字符编解码器代码;常见的编码方式如下:
      • CV_FOURCC(‘P’,‘I’,‘M’,‘1’) = MPEG-1 codec
        CV_FOURCC(‘M’,‘J’,‘P’,‘G’) = motion-jpeg codec
        CV_FOURCC(‘M’, ‘P’, ‘4’, ‘2’) = MPEG-4.2 codec
        CV_FOURCC(‘D’, ‘I’, ‘V’, ‘3’) = MPEG-4.3 codec
        CV_FOURCC(‘D’, ‘I’, ‘V’, ‘X’) = MPEG-4 codec
        CV_FOURCC(‘U’, ‘2’, ‘6’, ‘3’) = H263 codec
        CV_FOURCC(‘I’, ‘2’, ‘6’, ‘3’) = H263I codec
        CV_FOURCC(‘F’, ‘L’, ‘V’, ‘1’) = FLV1 codec
      • 如果将其设置为-1,则在函数运行是会弹出对话框提示进行选择
      • 生成文件占用空间最小的编码方式是MPEG-4.2 codec,对应参数为:CV_FOURCC(‘M’, ‘P’, ‘4’, ‘2’)
      • 最大的是MPEG-1 codec,对应参数为CV_FOURCC(‘P’,‘I’,‘M’,‘1’) ,所占磁盘空间是前者的5.7倍
    • fps :创建的视频流的帧速率
    • frameSize : 视频帧的大小尺寸
    • isColor : 如果它不为零,编码器将期望并编码彩色帧,否则它将与灰度帧一起使用(该标志目前仅在Windows上受支持)。

四、参考资料

  • opencv VideoWriter保存摄像头视频、本地视频等

你可能感兴趣的:(opencv)