2014-03-04 50 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