2014-09-11 304 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,但我不知道該怎麼做。