Задача: В любую область камеры идет нажатие на экран. Область нажатия выделяется синим квадратом. В этой области необходимо найти самый яркий пиксель (белая точка на черном фоне) и закрасить его в красный (просто нарисовать точку по координатам). На сколько я понял, необходимо использовать алгоритм 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)
Виртуальный выделенный сервер (VDS) становится отличным выбором
Не получается сделать импорт библиотеки ArrayUtilsПри импорте возникает ошибка error: package org
Есть RecyclerView с картинками, которые загружаются из интернетаКак надо подключить ProgressBar, пока данные для RecyclerView грузятся? Вот код фрагмента
java зачем в конце блока }); стоит фигурная и круглая вместе вместе?
Есть метод,который парсит сайт и выводит рандомное слово,как мне этот метод засунуть в jsp страницу?чтобы на главной странице оно отображалось?