如何使用opencv和c ++从网络摄像头框架中找到轮廓?

时间:2014-08-16 17:50:00

标签: c++ opencv

我的目标是通过捕获网络摄像头中的帧来查找轮廓。我能够用静态图像做到这一点,但后来我尝试在网络摄像头框架中使用相同的概念,它给了我这个错误:

"OpenCV Error: Assertion failed (mtype == type0 || (CV_MAT_CN(mtype) == CV_MAT_CN
(type0) && ((1 << type0) & fixedDepthMask) != 0)) in cv::_OutputArray::create, f
ile C:\builds\2_4_PackSlave-win64-vc11-shared\opencv\modules\core\src\matrix.cpp
, line 1486"

这是我用来查找程序中轮廓的代码;

 Rng rng(12345);

    Mat captureframe,con,threshold_output;

    vector<vector<Point> > contours; //
   vector<Vec4i> hierarchy;

    while(true)
            {
                capturedevice>>captureframe;
                con = captureframe.clone();
                cvtColor(captureframe,con,CV_BGR2GRAY);

    threshold( con, threshold_output, thresh, 255, THRESH_BINARY );
     findContours( threshold_output, contours, hierarchy, CV_RETR_TREE, CV_CHAIN_APPROX_SIMPLE, Point(0, 0) );

     Mat drawing = Mat::zeros( threshold_output.size(), CV_8UC3 );

    for( int i = 0; i< contours.size(); i++ )
    {
    Scalar color = Scalar( rng.uniform(0, 255), rng.uniform(0,255), rng.uniform(0,255) );

     drawContours( drawing, contours, i, color, 1, 8, vector<Vec4i>(), 0, Point() );
    }


    imshow("contour drawing",drawing);
    }

2 个答案:

答案 0 :(得分:1)

我认为问题在于以下两行:

con = captureframe.clone();
cvtColor(captureframe,con,CV_BGR2GRAY);

第一行中,您将con作为captureFrame的克隆,这意味着con 是一个3频道图片并且在第二行中,您试图使con成为 grayScale图像,即1通道,因此您将获得与图像类型相关的错误。

您应该尝试执行以下操作(我不确定您的代码是否会在此之后运行,但在此之后您不应该获得当前错误):

con.create(captureframe.rows , captureframe.cols, CV_8UC1);
cvtColor(captureframe,con,CV_BGR2GRAY);

答案 1 :(得分:0)

伙计们非常感谢你的帮助。我终于搞清楚了我的错误,我的声明中出现了问题。我在网上寻找一些参考资料然后我偶然发现了这个代码用于对象检测。这家伙实际上宣称&#34;轮廓&#34;像这样 - &#34; std :: vector&lt; std :: vector&lt; cv :: Point&gt; &GT;轮廓; &#34;我的声明是&#34;矢量轮廓&#34;。我的声明适用于静态图像,但它在从网络摄像头查找轮廓时给了我这个错误。谁能解释一下上述两个声明之间的区别?另外,正如skm所建议的那样,我通过使用con.create(frame.rows,frame.cols,cv_8uc1)将帧捕获转换为1通道深度图像,然后将其转换为灰度图像。这一步非常重要。所以,这是我完整的工作代码!!感谢

     VideoCapture capturedevice;
        capturedevice.open(0);

        Mat frame,con;
        Mat grayframe;
         std::vector < std::vector < cv::Point > >contours; //this is very important decalartion


while(true)
        {
            capturedevice>>frame;


            con.create(frame.rows,frame.cols,CV_8UC1);
            cvtColor(frame,con,CV_BGR2GRAY);

            cv::findContours (con, contours, CV_RETR_EXTERNAL, CV_CHAIN_APPROX_NONE);
            cv::drawContours (frame, contours, -1, cv::Scalar (0, 0, 255), 2);


            imshow("frame", frame);

waitKey(33);
        }