Note that there are some explanatory texts on larger screens.

plurals
  1. POConverting YUV->RGB(Image processing)->YUV during onPreviewFrame in android?
    primarykey
    data
    text
    <p>I am capturing image using SurfaceView and getting Yuv Raw preview data in <b>public void onPreviewFrame4(byte[] data, Camera camera)</b></p> <p>I have to perform some image preprocessing in onPreviewFrame so i need to convert Yuv preview data to RGB data than image preprocessing and back to Yuv data.</p> <p>I have used both function for encoding and decoding Yuv data to RGB as following :</p> <pre><code>public void onPreviewFrame(byte[] data, Camera camera) { Point cameraResolution = configManager.getCameraResolution(); if (data != null) { Log.i("DEBUG", "data Not Null"); // Preprocessing Log.i("DEBUG", "Try For Image Processing"); Camera.Parameters mParameters = camera.getParameters(); Size mSize = mParameters.getPreviewSize(); int mWidth = mSize.width; int mHeight = mSize.height; int[] mIntArray = new int[mWidth * mHeight]; // Decode Yuv data to integer array decodeYUV420SP(mIntArray, data, mWidth, mHeight); // Converting int mIntArray to Bitmap and // than image preprocessing // and back to mIntArray. // Encode intArray to Yuv data encodeYUV420SP(data, mIntArray, mWidth, mHeight); } } static public void decodeYUV420SP(int[] rgba, byte[] yuv420sp, int width, int height) { final int frameSize = width * height; for (int j = 0, yp = 0; j &lt; height; j++) { int uvp = frameSize + (j &gt;&gt; 1) * width, u = 0, v = 0; for (int i = 0; i &lt; width; i++, yp++) { int y = (0xff &amp; ((int) yuv420sp[yp])) - 16; if (y &lt; 0) y = 0; if ((i &amp; 1) == 0) { v = (0xff &amp; yuv420sp[uvp++]) - 128; u = (0xff &amp; yuv420sp[uvp++]) - 128; } int y1192 = 1192 * y; int r = (y1192 + 1634 * v); int g = (y1192 - 833 * v - 400 * u); int b = (y1192 + 2066 * u); if (r &lt; 0) r = 0; else if (r &gt; 262143) r = 262143; if (g &lt; 0) g = 0; else if (g &gt; 262143) g = 262143; if (b &lt; 0) b = 0; else if (b &gt; 262143) b = 262143; // rgb[yp] = 0xff000000 | ((r &lt;&lt; 6) &amp; 0xff0000) | ((g &gt;&gt; 2) &amp; // 0xff00) | ((b &gt;&gt; 10) &amp; 0xff); // rgba, divide 2^10 ( &gt;&gt; 10) rgba[yp] = ((r &lt;&lt; 14) &amp; 0xff000000) | ((g &lt;&lt; 6) &amp; 0xff0000) | ((b &gt;&gt; 2) | 0xff00); } } } static public void encodeYUV420SP_original(byte[] yuv420sp, int[] rgba, int width, int height) { final int frameSize = width * height; int[] U, V; U = new int[frameSize]; V = new int[frameSize]; final int uvwidth = width / 2; int r, g, b, y, u, v; for (int j = 0; j &lt; height; j++) { int index = width * j; for (int i = 0; i &lt; width; i++) { r = (rgba[index] &amp; 0xff000000) &gt;&gt; 24; g = (rgba[index] &amp; 0xff0000) &gt;&gt; 16; b = (rgba[index] &amp; 0xff00) &gt;&gt; 8; // rgb to yuv y = (66 * r + 129 * g + 25 * b + 128) &gt;&gt; 8 + 16; u = (-38 * r - 74 * g + 112 * b + 128) &gt;&gt; 8 + 128; v = (112 * r - 94 * g - 18 * b + 128) &gt;&gt; 8 + 128; // clip y yuv420sp[index++] = (byte) ((y &lt; 0) ? 0 : ((y &gt; 255) ? 255 : y)); U[index] = u; V[index++] = v; } } </code></pre> <p>The problem is that encoding and decoding Yuv data might have some mistake because if i skip the preprocessing step than also encoded Yuv data are differ from original data of PreviewCallback.</p> <p>Please help me to resolve this issue. I have to used this code in OCR scanning so i need to implement this type of logic.</p> <p>If any other way of doing same thing than please provide me.</p> <p>Thanks in advance. :)</p>
    singulars
    1. This table or related slice is empty.
    plurals
    1. This table or related slice is empty.
    1. This table or related slice is empty.
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload