应用medianBlur以及拉普拉斯算子和阈值滤波器

时间:2014-03-04 12:58:32

标签: c++ opencv image-processing video-capture

我有一个功能,具有以下签名:

Mat cartoonifyImage( Mat, Mat );

我还有一个 VS2010 程序,如下所示,我应用于网络摄像头流一些过滤器,如本书所述:Mastering OpenCV

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

    // imshow( "Camera Test", cameraFrame );

    Mat displayedFrame( cameraFrame.size(), CV_8UC3 );

    cartoonifyImage( cameraFrame, displayedFrame );

    imshow( "Cartoonifier!", displayedFrame );

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

}

这是我的功能定义:

Mat cartoonifyImage( Mat srcColor, Mat mask )
{
  Mat gray, edges;

  cvtColor( srcColor, gray, CV_BGR2GRAY );

  const int MEDIAN_BLUR_FILTER_SIZE = 7;
  const int LAPLACIAN_FILTER_SIZE = 5;
  const int EDGES_THRESHOLD = 80;

  medianBlur( gray, gray, MEDIAN_BLUR_FILTER_SIZE );
  Laplacian( gray, edges, CV_8U, LAPLACIAN_FILTER_SIZE );
  threshold( edges, mask, EDGES_THRESHOLD, 255, THRESH_BINARY_INV );

  return( mask );
}

当我运行程序时,我得到一个空白(灰色)窗口。 在第一个imshow被注释掉的地方,我确保网络摄像头正常工作,我可以在窗口中看到自己的图像,所以问题必须在其他地方。 任何人都可以帮助我了解问题所在以及我做错了什么?

谢谢,

2 个答案:

答案 0 :(得分:3)

你的displayFrame永远不会被填满。

(你将它传递给func,它会在那里被操纵,但是既然你给了它一个副本,你就不会得到结果了)

从cartoonifyImage返回一个Mat:

Mat displayed = cartoonifyImage( cameraFrame );

或传递参考:

void cartoonifyImage( const Mat & cameraFrame, Mat & displayedFrame );

答案 1 :(得分:1)

Mat cartoonifyImage( Mat srcColor )
{
    Mat gray, edges, mask;

    cvtColor( srcColor, gray, CV_BGR2GRAY );

    const int MEDIAN_BLUR_FILTER_SIZE = 7;
    const int LAPLACIAN_FILTER_SIZE = 5;
    const int EDGES_THRESHOLD = 80;

    medianBlur( gray, gray, MEDIAN_BLUR_FILTER_SIZE );
    Laplacian( gray, edges, CV_8U, LAPLACIAN_FILTER_SIZE );
    threshold( edges, mask, EDGES_THRESHOLD, 255, THRESH_BINARY_INV );

    return ( mask );
}

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

        //imshow( "Camera Test", cameraFrame );

        Mat displayedFrame( cameraFrame.size(), CV_8UC3 );

        displayedFrame = cartoonifyImage(cameraFrame);

        imshow( "Cartoonifier!", displayedFrame );

        int keypress = waitKey( 20 );
        if( keypress == 27 ) break;
    }
}
相关问题