OpenCV findContours无效

时间:2014-03-18 07:22:36

标签: c++ opencv vector webcam contour

我已经坚持这个问题几天了,你是我最后的希望,stackoverflow!

Windows 7,Visual Studio Ultimate 2012,OpenCV 2.4.8。

来源:

int main(){

    cv::VideoCapture capture(0);
    if(!capture.isOpened()){
        printf("Capture failure\n");
        return -1;
    }

    cv::Mat frame;
    capture >> frame;
    if(frame.empty()) return -1;

    cv::namedWindow("Video");
    cv::namedWindow("Contour");

    while(true){
        capture >> frame;
        if(frame.empty()) break;

        cv::Mat cont = frame;

        cv::vector<cv::Vec4i> hierarchy;
        cv::vector<cv::vector<cv::Point> > contours;

        cv::threshold(cont, cont, 128, 255, cv::THRESH_BINARY);
        cv::inRange(cont, cv::Scalar(128, 128, 128), cv::Scalar(255, 255, 255), cont);

        cv::findContours(cont, contours, hierarchy, CV_RETR_TREE, CV_CHAIN_APPROX_SIMPLE);

        for(size_t i=0; i<contours.size(); i++){
            cv::drawContours(frame, contours, i, cv::Scalar(0,255,255), 10);
        }

        cv::imshow("Contour", cont);
        cv::imshow("Video", frame);

        if(cv::waitKey(10)==27 ) break;
    }

    cv::destroyAllWindows();
    return 0;
}

相当简单的代码,对吧?如果不明显,我想要做的就是应用cv::inRange从我的网络摄像头获取所有轮廓。那就是它。

此代码为我提供了cv::Exception at memory location 0x0045F7CC

修改:还从命令行给我OpenCV Error: Unsupported format or combination of formats ([Start]FindContours supported only 8uC1 and 32sC1 images) in cvStartFindContours, file ........\opencv\modules\imgproc\src\contours.cpp

我已经看过使用cv::findContours()的示例,并且所有这些示例都显示您需要我从cv::Matcv::threshold()获得的二进制文件cv::inRange(),但它仍然可以使用{{1}} #39;为我工作。救命啊!

1 个答案:

答案 0 :(得分:3)

我解决了!这是代码:

while(true){
    capture >> frame;
    if(frame.empty()) break;

    cv::Mat cont, threshold;
    cont = frame.clone();
    cv::cvtColor(cont, cont, cv::COLOR_BGR2GRAY);

    cv::vector<cv::Vec4i> hierarchy;
    cv::vector<cv::vector<cv::Point> > contours;

    cv::threshold(cont, cont, 128, 255, cv::THRESH_BINARY);
    threshold = cont.clone();

    cv::findContours(cont, contours, hierarchy, CV_RETR_TREE, CV_CHAIN_APPROX_SIMPLE);

    for(size_t i=0; i<contours.size(); i++){
        cv::drawContours(frame, contours, i, cv::Scalar(0,0,255), 2);
    }

    cv::imshow("Contour", threshold);
    cv::imshow("Video", frame);

    if(cv::waitKey(10)==27 ) break;      
}