5

輪郭検出アルゴリズムの一部の OpenCV Mat をグレースケールに変換しようとしています。変換後の画像がなぜか真っ黒。私のコード (b は Android ビットマップ):

Mat tmp = new Mat (b.getWidth(), b.getHeight(), CvType.CV_8UC1);
Utils.bitmapToMat(b, tmp);
Imgproc.cvtColor(tmp, tmp, Imgproc.COLOR_BGR2GRAY);
//there could be some processing
Imgproc.cvtColor(tmp, tmp, Imgproc.COLOR_GRAY2BGRA, 4);
Utils.matToBitmap(tmp, b);

そして今、このビットマップを描いていますが、すべて黒です。このビットマップに(コメントの代わりに)輪郭検出を適用したところ、一致がなかったため、変換に問題があると思われます。変換を削除した後 (単純に bitmapToMat と matToBitmap を呼び出します)、ビットマップがすべて黒ではないため、Mat への変換も機能します。ビットマップは ARGB_8888 で、エラーはありません。出力ビットマップだけがすべて黒です。

編集: ocv imwrite でビットマップを保存しようとしたことを確認するために - まだすべて黒なので、問題は cvtColor で 100% です...

4

2 に答える 2

7

ビットマップ b が Android デバイスからのものである場合は、すべての画像ではなく OpenCV 画像のデフォルトのピクセル形式であるため、COLOR_RGB2GRAY代わりに を使用してみてください。COLOR_BGR2GRAYBGR

このコードを試してください:

Mat tmp = new Mat (b.getWidth(), b.getHeight(), CvType.CV_8UC1);
Utils.bitmapToMat(b, tmp);
Imgproc.cvtColor(tmp, tmp, Imgproc.COLOR_RGB2GRAY);
//there could be some processing
Imgproc.cvtColor(tmp, tmp, Imgproc.COLOR_GRAY2RGB, 4);
Utils.matToBitmap(tmp, b);
于 2013-04-10T02:16:52.600 に答える
0

この方法を試してみたところ、完全に機能します。最初にグレースケールに変換し、次にキャニーに変換し、最後にビットマップに変換する必要があります。

この関数は白黒画像を返します。

public static Bitmap edgesim(Mat img1) {

Bitmap image1;

//mat gray img1 holder
Mat imageGray1 = new Mat();

//mat canny image
Mat imageCny1 = new Mat();

//mat canny image
Mat imageCny2 = new Mat();

/////////////////////////////////////////////////////////////////

//Convert img1 into gray image
Imgproc.cvtColor(img1, imageGray1, Imgproc.COLOR_BGR2GRAY);

//Canny Edge Detection
Imgproc.Canny(imageGray1, imageCny1, 10, 100, 3, true);

///////////////////////////////////////////////////////////////////

//////////////////Transform Canny to Bitmap/////////////////////////////////////////
image1= Bitmap.createBitmap(imageCny1.cols(), imageCny1.rows(), Bitmap.Config.ARGB_8888);
Utils.matToBitmap(imageCny1, image1);

return image1;

}

于 2016-12-23T23:51:56.363 に答える