Opencv 視訊
阿新 • • 發佈:2018-12-03
OpenCV中常見的視訊方式是while迴圈讀取,可是,當遇到巢狀迴圈呢
1、常見的while迴圈 ,沒有巢狀迴圈
cv::VideoCapture capture(“d:/test/demo.avi”);
if (!capture.isOpened())
return -1;
bool status = true; // 判斷迴圈是否中止的布林量
cv::Mat frame;
while (status)
{
capture >> frame;
if (frame.empty())
break;
cv::imshow(“video”, frame);
if (cv::waitKey(27) >= 0)
status = false;
}
2、當有巢狀迴圈時
// 路徑的話,可以用’\’ 也可以用’/’
cv::VideoCapture capture(0);
if (!capture.isOpened())
return -1;
cv::VideoCapture demoCapture(“d:/test/demo.avi”);
if (!demoCapture.isOpened())
return -2;
// 獲取對應視訊檔案的總幀數 static int count = demoCapture.get(CV_CAP_PROP_FRAME_COUNT); bool status = true; // 判斷迴圈是否中止的布林量 cv::Mat frame; cv::Mat demoFrame; while(status) { capture >> frame; if (frame.empty()) break; // 用來指定跳轉幀的位置 static使之不會隨著下次迴圈重新被賦值1 // 在這個測試程式碼裡面它可以被提出迴圈,考慮分模組程式設計的情況放到這裡吧 static int position = 1; // 用什麼作為迴圈判斷條件,根據需求吧,不是唯一解 while (position) { // 跳轉到指定幀(第position幀) demoCapture.set(CV_CAP_PROP_POS_FRAMES, position); demoCapture >> demoFrame; if (demoFrame.empty()) break; // 程式碼1開始 // 這一塊程式碼可以做好多種事情, // 比如說demoFrame和frame進行ROI操作 ... // 程式碼1結束 // 假如想讓視訊一遍結束繼續播放,那就重置 // 當然也可以根據需求更改 if(position == count) position = 0; position++; if (cv::waitKey(27) >= 0) position = 0; }