2011-11-01 117 views
2

我有一个PNG图像pic.png,我使它透明通过使用下面的函数createMask()断言失败(src.type()== dst.type())在OpenCV中

origpic = cvLoadImage("/root/opencv/newtutorial/newcode_try2/pic.png",1); 
    pic = createMask(origpic); 

我有createMask功能

IplImage* createMask(IplImage* image) { 
     IplImage *mask; 
     mask = cvCreateImage(cvGetSize(image), 8, 1); 
     cvInRangeS(image, cvScalar(255.0, 255.0, 255.0), cvScalar(255.0, 255.0, 255.0), mask); 
     cvNot(mask, mask); 
     return mask; 
    } 

现在我的问题是,当我与

cvWarpPerspective(pic, neg_img, warp_matrix);

扭曲它

我收到此错误

OpenCV Error: Assertion failed (src.type() == dst.type()) in cvWarpPerspective, 
file /root/OpenCV-2.3.1/modules/imgproc/src/imgwarp.cpp, line 3234 
terminate called after throwing an instance of 'cv::Exception' 
what(): /root/OpenCV-2.3.1/modules/imgproc/src/imgwarp.cpp:3234: 
error: (-215) src.type() == dst.type() in function cvWarpPerspective 

回答

1

你必须创建具有相同的类型PIC的目标图像。 createMask()函数创建一个灰度图像。

所以调用warpPerspective之前,加入这一行:

neg_img = cvCreateImage(cvGetSize(pic),8,1); 

注意,你可以使用不同大小的目标图像,结果将被裁剪,或者根据warp_matrix,填充黑色空间各地:

neg_img = cvCreateImage(CvSize(200,300),8,1); 

而且也更好的想法是使用C++接口,与垫代替的IplImage。它会自动处理内存管理,它更清洁,更易于使用。你实际上必须使用c接口的唯一情况是一些嵌入式系统,其中编译器只有C。

+0

对不起,我得到这个错误OpenCV错误:输入参数的大小不匹配(该操作既不是'数组操作数组'(其中数组具有相同的大小和类型),也不是'数组操作标量',也不是'标量op array')in binary_op,file /root/OpenCV-2.3.1/modules/core/src/arithm.cpp – Wazzzy

+0

这是因为您尝试检查具有3通道标量间隔的单通道图像的范围。我无法猜测你为什么在那里实际使用那个呼叫,没有这一行,代码将是相同的。 – Sam

+0

哦,我明白了。您必须将图像转换为灰度(cvCvtColor()),并将结果发送到checkrange。你有什么是3通道图像,检查范围,并试图存储在1通道图像的结果。错误! – Sam