【发布时间】:2014-03-04 12:58:32
【问题描述】:
我有一个函数,签名如下:
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 被注释掉的地方,我确保网络摄像头正在工作并且我可以在窗口中看到我自己的图像,所以问题一定出在其他地方。
谁能帮助我了解问题出在哪里以及我做错了什么?
谢谢,
【问题讨论】:
-
我想问题是,“掩码”在函数中被重新分配。通常你可以这样做,但是当你将它提供给你的函数时,你必须确保它已经具有正确的类型和大小。其他可能性是将其作为参考参数传递或在调用函数时使用返回参数;)
-
提示为什么
mask在函数中被重新分配:你将它创建为CV_8UC3,但在你的函数中,它变成了单通道图像的阈值,所以它只是CV_8UC1跨度> -
Micka,不,您根本不必分配 OutputArray 变量。缺少参考是问题
-
@berak:他不必分配它,但如果他不这样做,他就不能使用旧的数组地址(在旧的标头中),所以如果他确实分配了正确的 Mat开头的大小和类型,他不必使用引用变量。所以他可以这样做,但如果是故意的,他会因为错误的初始化分配而做错了。所以正如我所说,至少有三种不同的方法可以解决这个问题。
标签: c++ opencv image-processing video-capture