2016-03-04 3 views
4

Я создаю приложение для сканера и пытаясь определить «качество предварительного просмотра» из обратного вызова предварительного просмотра камеры. Я хочу настроить камеру AUTO_FLASH_MODE, где она будет включена, если среда слишком темная.Как определить среднюю интенсивность пикселей из предварительного просмотра камеры?

Как определить, существует ли высокое среднее значение темных пикселей? Это означает (в предварительном просмотре), я получаю темноту и, следовательно, нужно включить вспышку камеры.

+0

На самом деле я хочу, чтобы настроить AUTO_FLASH_MODE камеры и я нашел любую тьму в окружающей среде (в пикселях), тогда просто включите плоть, пока мой сканер не включится. –

+1

Я удалил тег ** Flash ** (прочитайте описание этого тега, прежде чем использовать его). В любом случае все пиксели имеют значение интенсивности от 0 до 255 ... Таким образом, 128 находится на полпути между полностью яркими (255) и темными (0). Определите, какой номер означает «слишком темный» для вас, а затем проверьте значения пикселей в изображении предварительного просмотра, используя цикл 'for' в вашем коде. Посмотрите на гистограммы, так как это может быть полезно и быстрее, чем проверка каждого пикселя. –

+1

@ VC.One как искать гистограмму быстрее, чем проверять каждый пиксель. Как вы думаете, рассчитана ли гистограмма? – Piglet

ответ

1

Либо узнайте, как получить доступ к значениям пикселей вашего изображения и рассчитать среднюю интенсивность самостоятельно, либо использовать любую библиотеку обработки изображений для этого.

Темные пиксели имеют низкие значения, яркие пиксели имеют высокие значения. Вы хотите рассчитать среднее значение всех красных, зеленых и синих значений, деленное на три раза больше вашего количества пикселей. Определите порог для включения вспышки, но имейте в виду, что вам нужно получить новое время экспозиции. Предпочитайте, чтобы вспышка превышала время экспозиции, поскольку длительное время экспозиции дает более высокий шум изображения.

3

Я попробовал этот подход, но я думаю, что это занимает лишнее время обработки растрового изображения, а затем получить средний цвет экрана,

@Override 
    public void onPreviewFrame(byte[] data, Camera camera) { 
     Size cameraResolution = resolution; 
     PreviewCallback callback = this.callback; 
     if (cameraResolution != null && callback != null) 
     { 
      int format = camera.getParameters().getPreviewFormat(); 
      SourceData source = new SourceData(data, cameraResolution.width, cameraResolution.height, format, getCameraRotation()); 
      callback.onPreview(source); 
      final int[] rgb = decodeYUV420SP(data, cameraResolution.width, cameraResolution.height); 

      //Bitmap bmp = decodeBitmap(source.getData()); 
      Bitmap bmp = Bitmap.createBitmap(rgb, cameraResolution.width, cameraResolution.height, Bitmap.Config.ARGB_8888); 
      if (bmp != null) 
      { 
       //bmp = decodeBitmap(source.getData()); 
       ByteArrayOutputStream bytes = new ByteArrayOutputStream(); 
       // bmp.compress(Bitmap.CompressFormat.JPEG, 70, bytes); 
       Bitmap resizebitmap = Bitmap.createBitmap(bmp, 
         bmp.getWidth()/2, bmp.getHeight()/2, 60, 60); 

       int color = getAverageColor(resizebitmap); 
       Log.i("Color Int", color + ""); 
       // int color = resizebitmap.getPixel(resizebitmap.getWidth()/2,resizebitmap.getHeight()/2); 

       String strColor = String.format("#%06X", 0xFFFFFF & color); 
       //String colorname = sColorNameMap.get(strColor); 

       Log.d("strColor", strColor); 
       Log.i("strColor", color + ""); 
       if(!mIsOn) 
       { 
        if (color == -16777216 || color < -16777216)//minimum color code (full dark) 
        { 

         mIsOn = true; 
         setTorch(true); 
         Log.d("Yahooooo", "" + color); 
        } 
       } 

       Log.i("Pixel Value", 
         "Top Left pixel: " + Integer.toHexString(color)); 
      } 
     } 
     else 
     { 
      Log.d(TAG, "Got preview callback, but no handler or resolution available"); 
     } 
    } 
} 
    private int[] decodeYUV420SP(byte[] yuv420sp, int width, int height) 
    { 
     final int frameSize = width * height; 

    int rgb[]=new int[width*height]; 
    for (int j = 0, yp = 0; j < height; j++) { 
     int uvp = frameSize + (j >> 1) * width, u = 0, v = 0; 
     for (int i = 0; i < width; i++, yp++) { 
      int y = (0xff & ((int) yuv420sp[yp])) - 16; 
      if (y < 0) y = 0; 
      if ((i & 1) == 0) { 
       v = (0xff & yuv420sp[uvp++]) - 128; 
       u = (0xff & 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 < 0) r = 0; else if (r > 262143) r = 262143; 
      if (g < 0) g = 0; else if (g > 262143) g = 262143; 
      if (b < 0) b = 0; else if (b > 262143) b = 262143; 

      rgb[yp] = 0xff000000 | ((r << 6) & 0xff0000) | ((g >> 2) & 
        0xff00) | ((b >> 10) & 0xff); 


     } 
    } 
    return rgb; 
} 

    private int getAverageColor(Bitmap bitmap) 
    { 
    int redBucket = 0; 
    int greenBucket = 0; 
    int blueBucket = 0; 
    int pixelCount = 0; 

    for (int y = 0; y < bitmap.getHeight(); y++) { 
     for (int x = 0; x < bitmap.getWidth(); x++) { 
      int c = bitmap.getPixel(x, y); 

      pixelCount++; 
      redBucket += Color.red(c); 
      greenBucket += Color.green(c); 
      blueBucket += Color.blue(c); 
      // does alpha matter? 
     } 
    } 

    int averageColor = Color.rgb(redBucket/pixelCount, greenBucket 
      /pixelCount, blueBucket/pixelCount); 
    return averageColor; 
} 
+0

Я не специалист по Android. Я уверен, что есть способ получить байтовые данные вашего изображения предварительного просмотра. Разве это не все ваши данные байта в этой функции? Вы используете его как вход для декодирования битмапа .... Если нет, я предлагаю вам создать новый простой вопрос здесь: Как получить значения пикселей с камеры Android или Google для этого ... Я думаю, что ваш заголовок здесь бит расплывчатый. – Piglet

Смежные вопросы