を繰り返し888私はImage
は、OpenCVの行列にカメラ2 APIを使用してImageReader
から受け取ったとCameraBridgeViewBase
、より具体的に機能deliverAndDrawFrame
を使用して画面に表示変換しようとしています。読者のImageFormat
はYUV_420_888
です。私が理解する限り、各ピクセルのグレースケール値を持つYプレーンと、4つのピクセルごとに1つおきにU/Vを持つUプレーンがあります。しかし、この画像を表示しようとすると、画像が繰り返して90度回転したように見えます。以下のコードは、(ちょうどRGBA、今のところありませんグレースケール)OpenCVの行列にYUVデータを置くことになっている:アンドロイドImageReaderのYUV 420データ
/**
* Takes an {@link Image} in the {@link ImageFormat#YUV_420_888} and puts it into a provided {@link Mat} in rgba format.
*
* @param yuvImage {@link Image} in the {@link ImageFormat#YUV_420_888} format.
*/
public static void yuv420888imageToRgbaMat(final Image yuvImage, final Mat rgbaMat) {
final Image.Plane
Yp = yuvImage.getPlanes()[0],
UandVp = yuvImage.getPlanes()[1];
final ByteBuffer
Ybb = Yp .getBuffer(),
UandVbb = UandVp.getBuffer();
Ybb .get(mYdata , 0, 480*640 );
UandVbb.get(mUandVData, 0, 480*640/2 - 8);
for (int i = 0; i < 640*480; i++) {
for (int j = 0; j < 4; j++) {
mRawRGBAFrameData[i + 640*480*j] = mYdata[i];
}
mRawRGBAFrameData[i*4 ] = mYdata[i];
mRawRGBAFrameData[i*4+1] = mYdata[i];
mRawRGBAFrameData[i*4+2] = mYdata[i];
mRawRGBAFrameData[i*4+3] = -1;
}
}
ここでOpenCVのフレームのために私のコードです:
private class CameraFrame implements CvCameraViewFrame {
private Mat mRgba;
@Override
public Mat gray() {
return null;
}
@Override
public Mat rgba() {
mRgbaMat.put(0, 0, mRawRGBAFrameData);
return mRgba;
}
public CameraFrame(final Mat rgba) {
super();
mRgba = rgba;
}
}
ためのコードフレーム描画受信:
private final ImageReader.OnImageAvailableListener mOnImageAvailableListener = new ImageReader.OnImageAvailableListener() {
@Override
public void onImageAvailable(ImageReader reader) {
final Image yuvImage = reader.acquireLatestImage();
yuv420888imageToRgbaMat(yuvImage, mRgbaMat);
deliverAndDrawFrame(mFrame);
yuvImage.close();
}
};
および、この画像読取装置を製造するためのコードである:
mRgbaMat = new Mat(mFrameHeight, mFrameWidth, CvType.CV_8UC4);
mFrame = new CameraFrame(mRgbaMat);
mImageReader = ImageReader.newInstance(mFrameWidth, mFrameHeight, ImageFormat.YUV_420_888, 1);
mImageReader.setOnImageAvailableListener(mOnImageAvailableListener, mBackgroundHandler);
AllocateCache();
これは、アレイの初期化である:
protected static byte[] mRawRGBAFrameData = new byte[640*480*4], mYdata = new byte[640*480], mUandVData = new byte[640*480/2];
注意:mFrameWidth
480とmFrameHeight
では、640の一つ奇妙なことは、ImageReader
それから受信Image
ための高さと幅は寸法が反転していることです。 https://i.stack.imgur.com/lcdzf.pngここ
これにより画像の代わりyuv420888imageToRgbaMat
https://i.stack.imgur.com/T2MOI.png
for (int i = 0; i < 640*480; i++) {
mRawRGBAFrameData[i] = mYdata[i];
}
に我々はデータYのフレームに繰り返し、いくつかの理由のためであることが確認できている:ここでは
は、上記のコードを持つ画像でありますこれは実際の見栄えのよい画像を与える。