我有一個功能,具有以下特徵:應用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
被註釋掉,我確定攝像頭正在工作,並且我可以在窗口中看到自己的圖像,所以問題必須在其他地方。 任何人都可以幫助我瞭解問題出在哪裏,我做錯了什麼?
謝謝
我猜問題是,「面具」的功能被重新分配。通常情況下你可以這樣做,但是當你將它提供給你的函數時,你必須確保掩碼具有正確的類型和大小。其他可能性是將它作爲參考傳遞或在調用函數時使用返回參數;) – Micka
提示爲什麼'mask'在函數中重新分配:您將其創建爲'CV_8UC3',但在您的函數中,它成爲單通道圖像的閾值,所以它只是'CV_8UC1' – Micka
Micka,不,你根本不需要分配OutputArray變量。缺少的參考是問題 – berak