我有一个功能,具有以下特征:应用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