1

Android (Java) で openCv を使用しています。私たちは多くの問題に直面しています:

convertTo() が機能しないため、3 チャンネルの画像を cvtColor() に渡さずに 1 チャンネルに変換することはできません。

grayImg.convertTo(grayImg, CvType.CV_8UC1);

cvtColor() は奇妙な出力を出します:

Imgproc.cvtColor(src, grayImg, Imgproc.COLOR_RGB2GRAY);

この行の出力は、4 回繰り返された画像です。この繰り返しを取り除く唯一の方法は、この行を追加することです。出力は白と黒の画像ですが、3 チャンネルなので、1 チャンネルの画像が必要なため、今後の関数がクラッシュします。

Imgproc.cvtColor(grayImg, grayImg, Imgproc.COLOR_GRAY2RGB,3);

エッジ検出用の canny():

Imgproc.Canny(grayImg, grayImg, 10, 100,3,true);

findContours() は恐ろしい数の輪郭を数えますが、画像内のオブジェクトの数は 2 つだけですが、入力画像は 3 チャンネルの bmp 画像であり、それを Mat に変換します。

出力画像:

https://dl.dropbox.com/u/36214963/canny.jpg

ご心配をありがとう

4

3 に答える 3

4

BGR2GRAYではなく試してみてくださいRGB2GRAY。同じ問題があり、これで解決しました。これに関するドキュメントにもメモがあります

イメージをある色空間から別の色空間に変換します。

この関数cvtColorは、入力画像をある色空間から別の色空間に変換します。RGB 色空間からの変換の場合、チャネルの順序を明示的に指定する必要があります ( RGB or BGR)。OpenCV のデフォルトのカラー形式は RGB と呼ばれることが多いですが、実際には BGR (バイトが逆になっています) であることに注意してください。したがって、標準 (24 ビット) カラー イメージの最初のバイトは 8 ビットの青のコンポーネントになり、2 番目のバイトは緑になり、3 番目のバイトは赤になります。4 番目、5 番目、6 番目のバイトは 2 番目のピクセル (青、緑、赤の順) になります。

于 2012-06-19T09:31:14.630 に答える
0

私はこれまでopencvを実際に使用したことはありませんconvertToが、あなたが探している答えではないと思います。

opencvのドキュメントを見て、私はこれを見つけまし

cvtColor-画像をある色空間から別の色空間に変換します

Mat color; // the input image
Mat gray(color.rows, color.cols, color.depth()); 
cvtColor(color, gray, CV_BGR2GRAY);

または単に(そして関数cvtColorは内部で画像を作成します):

Mat color;
Mat gray;
cvtColor(color, gray, CV_BGR2GRAY);
于 2012-06-09T08:55:59.480 に答える
0

最初の質問を正しく理解できれば、RGB 画像をグレースケール画像に変換する方法が 2 つあります。

オプション 1: 3 チャンネルの画像を 1 チャンネルに変換します。

IplImage *RGB_image = cvLoadImage("my_colored_image.jpg");
IplImage *GRAY_IMAGE = cvCreateImage(cvGetSize(RGB_image), IPL_DEPTH_8U, 1);
cvCvtColor(RGB_image, GRAY_IMAGE, CV_RGB2GRAY);

オプション 2: カラー イメージをグレースケール イメージとして直接読み取ります。

IplImage* GRAY_IMAGE = cvLoadImage("my_colored_image.jpg", CV_LOAD_IMAGE_GRAYSCALE);

これがあなたに合っていることを願っています。

于 2012-06-09T10:47:08.360 に答える