Search code examples
opencvimage-processingvideo-capture

Displaying an outline on top of an image


I am trying to draw a face outline and overlay it on top of a webcam image.

But towards the end, I think I am using addWeighted in a wrong way, because my program crashes.

Could you please help me understand what I am doing wrong with imshow and addWeighted?

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

Solution

  • This works fine:

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