在图像上显示轮廓

时间:2014-03-07 10:11:10

标签: opencv image-processing video-capture

我正在尝试绘制面部轮廓并将其叠加在网络摄像头图像之上。

但是到最后,我认为我以错误的方式使用addWeighted,因为我的程序崩溃了。

你能否帮我理解我在imshowaddWeighted做错了什么?

int main( int argc, const char** argv )
{
  VideoCapture camera;
  camera.open(0);

  if( !camera.isOpened() )
  {
    cerr << "Could not access the camera!" << endl;
    return  1;
  }

  while( true )
  {
    Mat cameraFrame;
    camera >> cameraFrame;

    if( cameraFrame.empty() )
    {
      cerr << "Could not grab a camera frame!" << endl;
      return  1;
    }

    Mat gray;
    cvtColor( cameraFrame, gray, CV_BGR2GRAY );
    Size size = cameraFrame.size();
    Mat faceOutline = Mat::zeros( size, CV_8UC3 );      // Draw a black canvas.
    Scalar color = CV_RGB( 255, 255, 0 );               // Yellow
    int thickness = 4;
    ellipse( faceOutline, Point(320, 240), Size(320, 240), 0, 0, 360, color, thickness, CV_AA );
    addWeighted( gray, 1.0, faceOutline, 0.7, 0, gray, CV_8UC3 );
    imshow( "final image", gray );

    char keypress = waitKey(20);
    if( keypress == 27 ) break;
  }
}

3 个答案:

答案 0 :(得分:1)

  • 为什么不直接将椭圆绘制到cameraFrame中?

    椭圆(cameraFrame,Point(320,240),尺寸(320,240),0,0,360,颜色,厚度,CV_AA);

  • 如果您想使用addWeighted,

    1. 两个输入图像的类型必须匹配(不能为灰度图像添加颜色)
    2. 因素必须总计为1.0
    3. 最后一个参数是深度,而不是类型(即你可以将它转换为浮点数,但不能改变通道数)
    4. addWeighted(cameraFrame,0.7,faceOutline,0.3,0,cameraFrame);

答案 1 :(得分:1)

我认为您的灰色图像是单通道,而您的faceOutline图像有3个通道。

来自documentation

  

src2 - 与src1具有相同大小和通道编号的第二个输入数组。

尝试mixChannels切换多频道图片的单个频道

答案 2 :(得分:1)

这很好用:

int main( int argc, const char** argv )
{
    VideoCapture camera;
    camera.open(0);

    if( !camera.isOpened() )
    {
        cerr << "Could not access the camera!" << endl;
        return  1;
    }

    while( true )
    {
        Mat cameraFrame;
        camera >> cameraFrame;

        if( cameraFrame.empty() )
        {
            cerr << "Could not grab a camera frame!" << endl;
            return  1;
        }

        Mat gray;
        cvtColor( cameraFrame, gray, cv::COLOR_BGR2GRAY );
        Size size = cameraFrame.size();
        Mat faceOutline = Mat::zeros( size, CV_8UC3 );      // Draw a black canvas.
        Scalar color = Scalar( 255, 255, 0 );               // Yellow
        int thickness = 4;
        cvtColor( gray, gray, cv::COLOR_GRAY2BGR );
        ellipse( faceOutline, Point(320, 240), Size(320, 240), 0, 0, 360, color, thickness );
        addWeighted( gray, 1.0, faceOutline, 0.7, 0, gray, CV_8UC3 );
        imshow( "final image", gray );
        char keypress = waitKey(20);
        if( keypress == 27 ) break;
    }
}