Найти самый яркий пиксель из заданной области превью камеры

119
17 августа 2019, 20:20

Задача: В любую область камеры идет нажатие на экран. Область нажатия выделяется синим квадратом. В этой области необходимо найти самый яркий пиксель (белая точка на черном фоне) и закрасить его в красный (просто нарисовать точку по координатам). На сколько я понял, необходимо использовать алгоритм decodeYUV420SP. Я через функцию onPreviewFrame и вызова из нее функции decodeYUV420SP, получаю массив цветов пикселей rgb [width * height], а затем вызываю свой алгоритм обработки. Но моя программа крашится, как только идет вызов функции обработки, не понимаю.

Подскажите пожалуйста, на правильном ли я пути или как лучше стоит реализовать это?

    public void onPreviewFrame(byte[] data, Camera camera) {
        int frameHeight = camera.getParameters().getPreviewSize().height;
        int frameWidth = camera.getParameters().getPreviewSize().width;
        // number of pixels//transforms NV21 pixel data into RGB pixels
        int rgb[] = new int[frameWidth * frameHeight];
        decodeYUV420SP(rgb, data, frameWidth, frameHeight);
    }

Алгоритм конвертирования:

void decodeYUV420SP(int[] rgb, byte[] yuv420sp, int width, int height) {
    final int frameSize = 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);
        }
    }
    if (isTrackingStar){
        findAlgorithm(rgb, width, height);
    }
}
}

Мой алгоритм поиска:

public void findAlgorithm(int[] rgb, int width, int height){
    int color_red, color_green, color_blue, curr_color, index;
    double tmp_GR, max_GR = 0;
    for (int x = mainActivity.X_touch; x < mainActivity.X_touch + 100; x++){
        for (int y = mainActivity.Y_touch; y < mainActivity.Y_touch + 100; y++){
            index = (height * y) + x;
            curr_color = rgb[index];
            color_green = Color.green(curr_color);
            color_red = Color.red(curr_color);
            color_blue = Color.blue(curr_color);
            tmp_GR = (0.299 * color_red) + (0.587 * color_green) + (0.114 * color_blue);
            if (tmp_GR > max_GR){
                max_GR = tmp_GR;
                max_X = x;
                max_Y = y;
            }
        }
    }
    drawView.x_point = max_X;
    drawView.y_point = max_Y;
    drawView.draw_point = 1;
    drawView.invalidate();
}

Ошибка:

01-18 19:23:11.558 19156-19156/com.example.vitalja.stars E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.vitalja.stars, PID: 19156
java.lang.NullPointerException: Attempt to write to field 'int com.example.vitalja.stars.DrawView.x_point' on a null object reference
    at com.example.vitalja.stars.ShowCamera.findAlgorithm(ShowCamera.java:116)
    at com.example.vitalja.stars.ShowCamera.decodeYUV420SP(ShowCamera.java:170)
    at com.example.vitalja.stars.ShowCamera.onPreviewFrame(ShowCamera.java:132)
    at android.hardware.Camera$EventHandler.handleMessage(Camera.java:1188)
    at android.os.Handler.dispatchMessage(Handler.java:102)
    at android.os.Looper.loop(Looper.java:148)
    at android.app.ActivityThread.main(ActivityThread.java:5451)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
READ ALSO
Импорт библиотеки в Java

Импорт библиотеки в Java

Не получается сделать импорт библиотеки ArrayUtilsПри импорте возникает ошибка error: package org

112
Как показать ProgressBar во время загрузки данных для RecyclerView?

Как показать ProgressBar во время загрузки данных для RecyclerView?

Есть RecyclerView с картинками, которые загружаются из интернетаКак надо подключить ProgressBar, пока данные для RecyclerView грузятся? Вот код фрагмента

134
зачем две скобки вместе в конце кода?

зачем две скобки вместе в конце кода?

java зачем в конце блока }); стоит фигурная и круглая вместе вместе?

113
Вызвать переменную или целый метод в jsp

Вызвать переменную или целый метод в jsp

Есть метод,который парсит сайт и выводит рандомное слово,как мне этот метод засунуть в jsp страницу?чтобы на главной странице оно отображалось?

135