OpenCV2.4.11調用攝像頭顯示拍攝視頻出錯

問題:使用OpenCV2.4.11調用攝像頭顯示拍攝視頻時報runtime error,控制檯窗口出現OpenCV Error: Assertion failed (size.width>0 && size.height>0) in cv::imshow, file ……..\opencv\modules\highgui\src\window.cpp, line 261
解決方法:在顯示圖片時先判斷是否有數據,如下:

if (!image.empty()) 
{
    imshow("window", image);
}

if (image.data) 
{
    imshow("window", image);
}

原因可能是:我們用opencv打開視頻的時候,會自動先監測攝像頭有沒有讀到幀,如果沒有,就會報錯,然後再執行你的程序,而一般打開攝像頭會有一定時間的延遲。有人認爲原因是在VideoCapture剛開始獲取攝像頭視頻流的過程不返回信號,所以判斷Mat是否爲空,並不斷循環去獲取Mat。加一個if判斷就是跳過系統自己的判斷,直接執行我們的程序。

附完整示例程序:

#include <opencv2/core/core.hpp>  
#include <opencv2/imgproc/imgproc.hpp> 
#include <opencv2/highgui/highgui.hpp>

// 調用攝像頭
void videoCapture()
{
    //cv::VideoCapture cap(0);  // 打開默認攝像頭,參數0代表默認攝像頭的ID
    cv::VideoCapture cap;
    cap.open(0);
    // 設置攝像頭
    cap.set(CV_CAP_PROP_FRAME_WIDTH,640);
    cap.set(CV_CAP_PROP_FRAME_HEIGHT,480);
    // 確認是否成功打開攝像頭
    if (!cap.isOpened())
    {
        printf("打開攝像頭失敗,退出!\n");
        exit(-1);
    }
    cv::namedWindow("Capture", CV_WINDOW_AUTOSIZE|CV_WINDOW_FREERATIO);
    while (1)
    {
        cv::Mat frame;
        cap >> frame;   // 獲取幀

        // 對攝像頭獲取的幀進行各種處理
        if (!frame.empty()) // 最好加上該判斷,並在該判斷中對幀進行處理
        {
            cv::imshow("Capture", frame);
        }
        if(cv::waitKey(30) >= 0) break; // 每30ms取一幀
    }
}

int main(int argc, char *argv[])
{
    videoCapture();

    return 0;
}

參考資料:
1. OpenCV2.3使用攝像頭和視頻http://blog.sina.com.cn/s/blog_a3e7ccd6010105yn.html
2. OpenCV Error: Assertion failed (size.width>0 && size.height>0) in cv::imshow, fi 這個問題怎麼辦?http://zhidao.baidu.com/link?url=pIM9Hr0-Yalk-uj8cm5ml0y91X92jJmPAXMKQ-1h7FXSPsrwTiD6_9Ngfq72hmxbVDjNE0aYTOmXCCVEryZvhNBJGW6FbsqjO6dbjVLEZt3
3. OpenCV打開攝像頭出現運行錯誤OpenCV Error:Assertion failed (size.width>0&&size.height>0)in cv::imshow,…… http://blog.csdn.net/czl389/article/details/51031100
4. [OpenCV]獲取攝像頭視頻http://www.cnblogs.com/tiny656/p/3538115.html?utm_source=tuicool&utm_medium=referral

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章