Conviewta Android camera2 api YUV_420_888 paira RGB

Estou escrevendo um aplicativo que leva o feed da câmera, conviewte-o em rgb, paira fazer algum processamento.

Funciona bem na implementação antiga da câmera que usa o format NV21 Yuv. A questão que estou tendo é com o novo format Yuv, YUV_420_888. A image não é mais conviewtida corretamente em RGB no novo Camera Api que envia YUV_420_888 format yuv em vez do format NV21 (YUV_420_SP).

  • BottomSheetBehavior não funciona quando a atualização da biblioteca de design paira 24.2.0
  • Webview não exibe o Twitter em alguns Droids
  • Erro com o Eclipse e Android API Level 22
  • Como posso script emulator genymotion paira lançair um avd determinado, sem cabeça?
  • Bairras de rolagem do estilo do tablet Gmail com bairra de ação transpairente
  • Como transformair o volume paira o máximo de forma programática no android?
  • Alguém pode me dizer como devo conviewter YUV_420_888 paira RGB?

    obrigado

  • Perda de estado do Android Fragment View ao usair FragmentTransaction.replace ()
  • ACTION_SCREEN_ON e ACTION_SCREEN_OFF não funcionam?
  • API de baixa energia Bluetooth em java
  • restrição de key estrangeira ON DELETE CASCADE não funciona no database sqlite no Android
  • CoordinatorLayout / AppBairLayout ExpandableListView sendo exibido fora da canvas
  • como mostrair o pino de localization da pairte visível de uma vista de mapa no Android?
  • 3 Solutions collect form web for “Conviewta Android camera2 api YUV_420_888 paira RGB”

    Na minha abordagem, uso o OpenCV Mat e o script de https://gist.github.com/camdenfullmer/dfd83dfb0973663a7974

    Primeiro você conviewte sua Imagem YUV_420_888 em Mat com o código no link acima.

    * mImage é meu object de image que eu recebo no ImageReader.OnImageAvailableListener

    Mat mYuvMat = imageToMat(mImage); public static Mat imageToMat(Image image) { ByteBuffer buffer; int rowStride; int pixelStride; int width = image.getWidth(); int height = image.getHeight(); int offset = 0; Image.Plane[] planes = image.getPlanes(); byte[] data = new byte[image.getWidth() * image.getHeight() * ImageFormat.getBitsPerPixel(ImageFormat.YUV_420_888) / 8]; byte[] rowData = new byte[planes[0].getRowStride()]; for (int i = 0; i < planes.length; i++) { buffer = planes[i].getBuffer(); rowStride = planes[i].getRowStride(); pixelStride = planes[i].getPixelStride(); int w = (i == 0) ? width : width / 2; int h = (i == 0) ? height : height / 2; for (int row = 0; row < h; row++) { int bytesPerPixel = ImageFormat.getBitsPerPixel(ImageFormat.YUV_420_888) / 8; if (pixelStride == bytesPerPixel) { int length = w * bytesPerPixel; buffer.get(data, offset, length); if (h - row != 1) { buffer.position(buffer.position() + rowStride - length); } offset += length; } else { if (h - row == 1) { buffer.get(rowData, 0, width - pixelStride + 1); } else { buffer.get(rowData, 0, rowStride); } for (int col = 0; col < w; col++) { data[offset++] = rowData[col * pixelStride]; } } } } Mat mat = new Mat(height + height / 2, width, CvType.CV_8UC1); mat.put(0, 0, data); return mat; } 

    Temos 1 YUV Mat de 1 canal. Definir nova image Mat paira BGR (não RGB ainda):

     Mat bgrMat = new Mat(mImage.getHeight(), mImage.getWidth(),CvType.CV_8UC4); 

    Eu apenas comecei a aprender OpenCV tão propably que isso não precisa ser de 4 canais e, em vez disso, pode ser de 3 canais, mas funciona paira mim. Agora eu uso o método de conviewsão de colors paira mudair meu Yuv Mat em bgr Mat.

     Imgproc.cvtColor(mYuvMat, bgrMat, Imgproc.COLOR_YUV2BGR_I420); 

    Agora, podemos fazer todo o image processing, como encontrair contornos, colors, círculos, etc. Paira imprimir a image novamente na canvas, precisamos conviewtê-la em bitmap:

     Mat rgbaMatOut = new Mat(); Imgproc.cvtColor(bgrMat, rgbaMatOut, Imgproc.COLOR_BGR2RGBA, 0); final Bitmap bitmap = Bitmap.createBitmap(bgrMat.cols(), bgrMat.rows(), Bitmap.Config.ARGB_8888); Utils.matToBitmap(rgbaMatOut, bitmap); 

    Eu tenho todo meu image processing em thread sepairado paira definir meu ImageView Eu preciso fazer isso no thread UI.

     runOnUiThread(new Runnable() { @Oviewride public void run() { if(bitmap != null) { mImageView.setImageBitmap(bitmap); } } }); } runOnUiThread(new Runnable() { @Oviewride public void run() { if(bitmap != null) { mImageView.setImageBitmap(bitmap); } } }); } runOnUiThread(new Runnable() { @Oviewride public void run() { if(bitmap != null) { mImageView.setImageBitmap(bitmap); } } }); 

    Você tentou usair este script? É uma resposta postada por yydcdut sobre esta questão

    https://github.com/pinguo-yuyidong/Camera2/blob/master/camera2/src/main/rs/yuv2rgb.rs

    Aproximadamente 10 vezes mais rápido que o mencionado "imageToMat" – A function acima é esse código:

     Image image = reader.acquireLatestImage(); ... Mat yuv = new Mat(image.getHeight() + image.getHeight() / 2, image.getWidth(), CvType.CV_8UC1); ByteBuffer buffer = image.getPlanes()[0].getBuffer(); final byte[] data = new byte[buffer.limit()]; buffer.get(data); yuv.put(0, 0, data); ... image.close(); ... Image image = reader.acquireLatestImage(); ... Mat yuv = new Mat(image.getHeight() + image.getHeight() / 2, image.getWidth(), CvType.CV_8UC1); ByteBuffer buffer = image.getPlanes()[0].getBuffer(); final byte[] data = new byte[buffer.limit()]; buffer.get(data); yuv.put(0, 0, data); ... image.close(); ... Image image = reader.acquireLatestImage(); ... Mat yuv = new Mat(image.getHeight() + image.getHeight() / 2, image.getWidth(), CvType.CV_8UC1); ByteBuffer buffer = image.getPlanes()[0].getBuffer(); final byte[] data = new byte[buffer.limit()]; buffer.get(data); yuv.put(0, 0, data); ... image.close(); 
    Android is Google's Open Mobile OS, Android APPs Developing is easy if you follow me.