2014-09-11 106 views
0

在我的Android应用我从画廊的图片作为位图是这样的Imgproc.drawContours(....)没有显示出来

Bitmap bitm = getMyImage("Thanks!"); 

,我有一个所谓的垫垫声明如下:

Mat mat = new Mat(bitm.getHeight(), bitm.getWidth(), CVType.CV_8UC3); 

我试图摆脱的形象,我已经成功地得到了轮廓,然后用领域吸取回原始图像上:

Imgproc.drawContours(mat, contours, -1, new Scalar(200,200,0), 2); 
displayMat(mat); 

如果我这样使用它,它可以工作,但轮廓绘制在一张空白图像上,而这不是我想要的。我想让它在原始图像上绘制。如果我的代码前面的段之前使用

Utils.bitmapToMat(bitm, mat); 

,显示的图像只是没有“拉”轮廓preprossed图像。为什么?

+1

我没有使用Android opencv,但我想我已经读过他们使用8UC4图像的地方?!?所以'新Scalar(200,200,0)'也需要一个alpha值。否则,它会使用默认的alpha值,我猜可能是透明的。因此,把'Utils.bitmapToMat(bitm,mat);'放在你的代码之前,并把它改为'Scalar(200,200,0,255)'或'Scalar(200,200,0,0)',这意味着一个非透明的alpha值。 – Micka 2014-09-11 13:23:58

+0

@Micka谢谢!这是它没有出现的原因。如果你留下你的评论作为答案,我一定会接受它:) – Olumide 2014-09-11 17:55:31

回答

2

Asfaik Android使用带有alpha值的图像,所以CV_8UC4是正确的数据类型。

所以

Mat mat = new Mat(bitm.getHeight(), bitm.getWidth(), CVType.CV_8UC3); 

Imgproc.drawContours(mat, contours, -1, new Scalar(200,200,0), 2); 

displayMat(垫);

在空白/空白8UC3图像(如果内存为空)上正确绘制轮廓。

但是,如果您想通过首先转换Utils.bitmapToMat(bitm, mat);来绘制输入图像,则将覆盖您的8UC3内存并将其替换为8UC4数据。之后,您将绘制Scalar(200,200,0),它将使用第4个通道,但cv::Scalar会自动将这些通道与default zero values相加,因此您可以将轮廓绘制为透明。所以请使用Scalar(200,200,0,255),它应该给你预期的结果。

Mat mat = new Mat(bitm.getHeight(), bitm.getWidth(), CVType.CV_8UC3); 

Utils.bitmapToMat(bitm, mat); 

Imgproc.drawContours(mat, contours, -1, new Scalar(200,200,0,255), 2); 

displayMat(mat);

另一种方法是将位图转换为8UC3,但我不知道该怎么做。