学习OpenCV:打开摄像头和写入AVI文件

本系列的目的是详解demo代码,快速学习OpenCV相关操作

打开摄像机或打开文件

//打开摄像机或打开文件
//同一个对象可以从摄像机或文件加载视频

#include <opencv2/opencv.hpp>
#include <iostream>
int main( int argc, char** argv ) {
	
	cv::namedWindow( "Example2_10", cv::WINDOW_AUTOSIZE );
	
	cv::VideoCapture cap;
	if (argc==1) {
		//参数为打开的摄像机编号
		//由于argc参数未1,argv没有参数输入,所以打开默认摄像头
		cap.open(0); 
	} else {
		//如果输入文件名 则和之前播放视频文件程序一样
		cap.open(argv[1]);
	}
	//检测是否有东西可以播放
	if( !cap.isOpened() ) { 
		//输出错误信息
		std::cerr << "Couldn't open capture." << std::endl;
		return -1;
	}
	//剩下的程序同从磁盘播放视频文件程序
	cv::Mat frame;
	//无限循环,与while(1)具有相同效果,在以前的编译器优化中for效率更高
	for(;;) {
		//逐帧读取
		cap >> frame;
		//帧中没有图像退出循环
		if( frame.empty() ) break;
		//显示读取的帧 
		cv::imshow( "Example3", frame );
		//当前帧被显示,等待33ms
		//这里设置33ms是简单假设每秒30帧,可以等待任意时间长度
		//如果用户触发按键(ASCII码>=0),则退出循环,否则33ms后继续执行循环
		if( cv::waitKey(33) >= 0 ) break;

	}
	return 0;
}

写入AVI文件

//写入AVI文件
//打开视频文件读取并转换为对数极座标(log-polar)格式写入新文件
//利用cv::VideoWriter写入文件

#include <opencv2/opencv.hpp>
#include <iostream>
int main( int argc, char* argv[] ) {
	
	cv::namedWindow( "Example2_11", cv::WINDOW_AUTOSIZE );
	cv::namedWindow( "Log_Polar", cv::WINDOW_AUTOSIZE );
	// ( Note: could capture from a camera by giving a camera id as an int.)
	cv::VideoCapture capture( argv[1] );
	//读取视频相关信息
	double fps = capture.get( cv::CAP_PROP_FPS );
	cv::Size size(
		(int)capture.get( cv::CAP_PROP_FRAME_WIDTH ),
		(int)capture.get( cv::CAP_PROP_FRAME_HEIGHT )
	);
	//利用cv::VideoWriter写入AVI文件
	cv::VideoWriter writer;
	//第一个是新文件的文件名
	//第二个是视频编解码器,用它来压缩视频流,选择MJPG编解码器,通过使用宏CV_FOURCC()来指明OpenCV的这个选择,接受四个字符作为参数
	//第三个参数为帧率
	//第四个参数为图像大小
	writer.open( argv[2], CV_FOURCC('M','J','P','G'), fps, size );
	
	cv::Mat logpolar_frame, bgr_frame;
	for(;;) {
		capture >> bgr_frame;
		//gbr中帧为空退出
		if( bgr_frame.empty() ) break; // end if done
		cv::imshow( "Example2_11", bgr_frame );
		//对图像进行对数极座标转换
		cv::logPolar(
			//输入彩色帧
			bgr_frame,
			//输出对数极座标帧
			logpolar_frame, 
			//对数极座标变换的中心点
			cv::Point2f( bgr_frame.cols/2, bgr_frame.rows/2 ),
			//尺度参数量级
			40, 
			//用“0”填充异常值outliers
			cv::WARP_FILL_OUTLIERS
		);
		cv::imshow( "Log_Polar", logpolar_frame );
		//写入新文件中
		writer << logpolar_frame;
		char c = cv::waitKey(10);
		if( c == 27 ) break; // allow the user to break out
	}
	capture.release();
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章