34

BufferedImagea をMatinに変換するにはどうすればよいOpenCVですか?

Java ラッパーを使用していますOpenCV( JavaCVではありません)。私は初めてなので、OpenCVどのように機能するかを理解するのにいくつか問題がありますMat

私はこのようなことをしたいです。(Ted W. の返信に基づく):

BufferedImage image = ImageIO.read(b.getClass().getResource("Lena.png"));

int rows = image.getWidth();
int cols = image.getHeight();
int type = CvType.CV_16UC1;
Mat newMat = new Mat(rows, cols, type);

for (int r = 0; r < rows; r++) {
    for (int c = 0; c < cols; c++) {
        newMat.put(r, c, image.getRGB(r, c));
    }
}

Highgui.imwrite("Lena_copy.png", newMat);

これはうまくいきません。Lena_copy.pngは、正しい寸法の黒い画像です。

4

9 に答える 9

30

2つのライブラリで処理された画像を組み合わせる必要があるため、私も同じことをしようとしていました。そして、私がやろうとしたことは、RGB値の代わりに入れるbyte[]ことです。Matそしてそれは働いた!だから私がしたことは:

1.BufferedImageバイト配列に変換:

byte[] pixels = ((DataBufferByte) image.getRaster().getDataBuffer()).getData();

2. 次に、タイプをCV_8UC3に設定すると、単純に Mat に配置できます。

image_final.put(0, 0, pixels);

編集:また、この回答 のように逆を試みることもできます

于 2013-02-26T17:39:36.873 に答える
25

これは私にとってはうまく機能し、実行には0から1ミリ秒かかりました。

public static Mat bufferedImageToMat(BufferedImage bi) {
  Mat mat = new Mat(bi.getHeight(), bi.getWidth(), CvType.CV_8UC3);
  byte[] data = ((DataBufferByte) bi.getRaster().getDataBuffer()).getData();
  mat.put(0, 0, data);
  return mat;
}
于 2015-12-15T15:39:49.013 に答える
4

プログラムで次のコードを使用します。

protected Mat img2Mat(BufferedImage in) {
        Mat out;
        byte[] data;
        int r, g, b;

        if (in.getType() == BufferedImage.TYPE_INT_RGB) {
            out = new Mat(in.getHeight(), in.getWidth(), CvType.CV_8UC3);
            data = new byte[in.getWidth() * in.getHeight() * (int) out.elemSize()];
            int[] dataBuff = in.getRGB(0, 0, in.getWidth(), in.getHeight(), null, 0, in.getWidth());
            for (int i = 0; i < dataBuff.length; i++) {
                data[i * 3] = (byte) ((dataBuff[i] >> 0) & 0xFF);
                data[i * 3 + 1] = (byte) ((dataBuff[i] >> 8) & 0xFF);
                data[i * 3 + 2] = (byte) ((dataBuff[i] >> 16) & 0xFF);
            }
        } else {
            out = new Mat(in.getHeight(), in.getWidth(), CvType.CV_8UC1);
            data = new byte[in.getWidth() * in.getHeight() * (int) out.elemSize()];
            int[] dataBuff = in.getRGB(0, 0, in.getWidth(), in.getHeight(), null, 0, in.getWidth());
            for (int i = 0; i < dataBuff.length; i++) {
                r = (byte) ((dataBuff[i] >> 0) & 0xFF);
                g = (byte) ((dataBuff[i] >> 8) & 0xFF);
                b = (byte) ((dataBuff[i] >> 16) & 0xFF);
                data[i] = (byte) ((0.21 * r) + (0.71 * g) + (0.07 * b));
            }
        }
        out.put(0, 0, data);
        return out;
    }

参考:こちら

于 2017-02-03T16:15:34.827 に答える
3

ここで解決策を見つけました。ソリューションは Andriys に似ています。

Camera c;
c.Connect();
c.StartCapture();
Image f2Img, cf2Img;
c.RetrieveBuffer(&f2Img);
f2Img.Convert( FlyCapture2::PIXEL_FORMAT_BGR, &cf2Img );
unsigned int rowBytes = (double)cf2Img.GetReceivedDataSize()/(double)cf2Img.GetRows();

cv::Mat opencvImg = cv::Mat( cf2Img.GetRows(), cf2Img.GetCols(), CV_8UC3, cf2Img.GetData(),rowBytes );
于 2013-03-11T12:56:22.693 に答える
1

簡単な方法の1つは、

Mat newMat = Mat(rows, cols, type);

次に、BufferedImageからピクセル値を取得し、を使用してnewMatに配置します。

newMat.put(row, col, pixel);
于 2013-02-19T13:55:11.267 に答える