學習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();
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章