1. 程式人生 > >Opencv 視訊

Opencv 視訊

Opencv讀取視訊資料下載

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;
    }