2

JavaCVでconvertToメソッドを使用する方法を理解するのを手伝ってください。私は多くの時間を試して検索していましたが、適切な答えが見つかりませんでした。だから私の問題は、マットのタイプを灰色の画像からCV_32Fに変換しようとして、それをAndroid画面に表示しようとすると、結果が得られないことです。これは私のソース:

    Imgproc.cvtColor(src, dst, Imgproc.COLOR_RGBA2GRAY, 1); // dst is gray image
    dst.convertTo(dst_f, CvType.CV_32F, 1./255, 0); //convert dst to CV_32F with optional scale
    Imgproc.cvtColor(dst_f, src, Imgproc.COLOR_GRAY2RGBA, 4); // to display it in android before convert to bitmap

私はこのコードでopencv C ++でも試していましたが、スムーズに実行されました:

    imshow("dst", image);
    cvtColor(image, dst, CV_BGR2GRAY);
    dst.convertTo(dst_f, CV_32F, 1.0/255, 0);
    imshow("dst_f", dst_f);

更新しました :

Android画面でオンラインで画像を表示しようとすると間違っていると思います。Androidが画面に画像を表示するには4チャンネルが必要であることは知っていましたが、表示方法がわかりません。しかし、グレーをCV_32F画像タイプに変換し、上記と同じコードで表示しようとすると、結果がなくスムーズに実行されます。

4

1 に答える 1

4

いくつかの調査と実験の後、私は黄金の答えを得ました。

Android は画面に 4 チャンネルの画像しか表示できないため、4 チャンネル (RGBA) に変換する必要がありますが、RGBA/BGRA に変換する前に、Mat 画像を同じスケーリングの CV_8U に変更する必要があります。この例を見てください:

Imgproc.cvtColor(src, dst, Imgproc.COLOR_RGBA2GRAY, 1); 
dst.convertTo(dst_f, CvType.CV_32F, 1./255, 0);    
dst_f.convertTo(final, CvType.CV_8U, 255, 0); 
Imgproc.cvtColor(final, src, Imgproc.COLOR_GRAY2RGBA, 4);

上記のコードを使用すると、コードは Android 画面で完全に機能しますが、jpg 画像または他の画像拡張子に保存しようとすると画像が壊れます。SDカードに保存したい場合は、このソースを使用できます:

Imgproc.cvtColor(src, dst, Imgproc.COLOR_RGB2GRAY, 1);
dst.convertTo(dst_f, CvType.CV_32F, 1.0/255, 0); // Convert Mat image to CV_32F and scale it to 1.0/255
dst_f.convertTo(final, CvType.CV_32F, 255, 0); //Convert it Back to Default type before
Imgproc.cvtColor(final, roi, Imgproc.COLOR_GRAY2RGB, 0);
Imgproc.cvtColor(roi, roi, Imgproc.COLOR_RGB2RGBA, 0);

何よりも私自身の実験です。何か質問があれば、できる限りお答えします。ありがとう。これが他の人に大いに役立つことを願っています

于 2013-04-28T15:17:59.890 に答える