本系列的目的是詳解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();
}