2014-03-04 27 views
0

我有一个功能,具有以下特征:应用medianBlur以及拉普拉斯和门槛过滤器

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被注释掉,我确定摄像头正在工作,并且我可以在窗口中看到自己的图像,所以问题必须在其他地方。 任何人都可以帮助我了解问题出在哪里,我做错了什么?

谢谢

+1

我猜问题是,“面具”的功能被重新分配。通常情况下你可以这样做,但是当你将它提供给你的函数时,你必须确保掩码具有正确的类型和大小。其他可能性是将它作为参考传递或在调用函数时使用返回参数;) – Micka

+1

提示为什么'mask'在函数中重新分配:您将其创建为'CV_8UC3',但在您的函数中,它成为单通道图像的阈值,所以它只是'CV_8UC1' – Micka

+1

Micka,不,你根本不需要分配OutputArray变量。缺少的参考是问题 – berak

回答

3

您displayedFrame从来没有得到填补。

(你把它传递到FUNC,它被操纵的存在,但因为你给它一个副本,你没有得到结果后)

无论是从cartoonifyImage返回垫:

Mat displayed = cartoonifyImage(cameraFrame); 

或通过引用:

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

我用你的建议来传递引用,它工作,所以谢谢,但我没有改变返回类型为void,因为它仍然返回一系列图像;即矩阵。我对么? – Joshua

+1

是啊,好的。上面的“空白”更多地放大了不同的方法。 – berak

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

备注:Mat数组'(cameraFrame.size(),CV_8UC3)'的分配在这种方法中已经过时了,因为它被CV_8UC1图像替代,据我所知。 – Micka