From 7f41e4a5550ef22aaea5d9f0b9105054269af39c Mon Sep 17 00:00:00 2001 From: pilhoefermi93253 Date: Mon, 19 Jun 2023 18:42:25 +0200 Subject: [PATCH] =?UTF-8?q?Zeit=20eingef=C3=BChrt=20die=20Doppelalarme=20v?= =?UTF-8?q?erhindert=20Durch=20clustern=20der=20Pixel=20eventuell=20besser?= =?UTF-8?q?e=20Detektion=20realisiert?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../example/greenwatch/KameraAktivitaet.java | 101 +++++++++++++++--- .../com/example/greenwatch/MainActivity.java | 2 +- app/src/main/res/layout/activity_main.xml | 10 ++ 3 files changed, 95 insertions(+), 18 deletions(-) diff --git a/app/src/main/java/com/example/greenwatch/KameraAktivitaet.java b/app/src/main/java/com/example/greenwatch/KameraAktivitaet.java index 058607d..9e4ed82 100644 --- a/app/src/main/java/com/example/greenwatch/KameraAktivitaet.java +++ b/app/src/main/java/com/example/greenwatch/KameraAktivitaet.java @@ -3,6 +3,8 @@ package com.example.greenwatch; import android.graphics.ImageFormat; import android.media.Image; import android.os.Bundle; +import android.os.Handler; +import android.util.Log; import android.util.Size; import android.widget.TextView; @@ -27,9 +29,22 @@ public class KameraAktivitaet extends AppCompatActivity { private boolean isMotionDetected; private boolean camera_alarm; private TextView alarm; + private TextView test; + + + // Bildverarbeitung Variablen private ByteBuffer previousBuffer; private int previousWidth; private int previousHeight; + private int threshold = 50; + private int startX; + private int startY; + private int endX; + private int endY; + + private static final long ALARM_RESET_DELAY = 5000; + private boolean isAlarmSet = false; + private Handler alarmResetHandler = new Handler(); @Override protected void onCreate(Bundle savedInstanceState) { @@ -38,6 +53,7 @@ public class KameraAktivitaet extends AppCompatActivity { // NUR FÜR TESTS alarm = findViewById(R.id.textView); + test = findViewById(R.id.textView2); // PREVIEW // // previewView = findViewById(R.id.previewView); @@ -85,9 +101,8 @@ public class KameraAktivitaet extends AppCompatActivity { if (isMotionDetected) { alarm.setText("ALARM"); camera_alarm = true; - } else { - camera_alarm = false; - alarm.setText("OK"); + + alarmResetHandler.postDelayed(alarmResetRunnable, ALARM_RESET_DELAY); } } @@ -108,35 +123,87 @@ public class KameraAktivitaet extends AppCompatActivity { // Bildverarbeitung zur Bewegungserkennung private boolean compareFrames(Image currentImage) { - - ByteBuffer currentBuffer = currentImage.getPlanes()[0].getBuffer(); - + Image.Plane[] planes = currentImage.getPlanes(); + ByteBuffer currentBuffer = planes[0].getBuffer(); int currentWidth = currentImage.getWidth(); int currentHeight = currentImage.getHeight(); + int yRowStride = planes[0].getRowStride(); + int yPixelStride = planes[0].getPixelStride(); + + + //System.out.println("Höhe: " + currentHeight + " Breite: " + currentWidth); if (previousWidth != currentWidth || previousHeight != currentHeight) { return false; } - for (int row = 0; row < previousHeight; row++) { - for (int col = 0; col < previousWidth; col++) { + // Blöcke weiter verkleinern + int blockSize = kleinstesQuadrat(previousHeight, previousWidth) / 8; - int previousIndex = row * previousWidth + col; - int currentIndex = row * currentWidth + col; + //System.out.println(blockSize); - int previousPixel = previousBuffer.get(previousIndex) & 0xFF; - int currentPixel = currentBuffer.get(currentIndex) & 0xFF; + int numBlocksX = currentWidth / blockSize; + int numBlocksY = currentHeight / blockSize; - int pixelDifference = Math.abs(previousPixel - currentPixel); - int threshold = 120; + for (int blockY = 0; blockY < numBlocksY; blockY++) { + for (int blockX = 0; blockX < numBlocksX; blockX++) { + startX = blockX * blockSize; + startY = blockY * blockSize; + endX = startX + blockSize; + endY = startY + blockSize; + + float currentLuminance = berechneMittlereLuminanz(currentBuffer, yRowStride, yPixelStride); + float previousLuminance = berechneMittlereLuminanz(previousBuffer, yRowStride, yPixelStride); + + int pixelDifference = Math.abs((int) previousLuminance - (int) currentLuminance); + + //System.out.println(pixelDifference); if (pixelDifference > threshold) { - // Testzwecke - //String text = String.valueOf(pixelDifference); + System.out.println(pixelDifference); return true; } } } + return false; } -} \ No newline at end of file + + private float berechneMittlereLuminanz(ByteBuffer buffer, int rowStride, int pixelStride) { + int sumLuminance = 0; + int countPixels = 0; + + for (int row = startY; row < endY; row++) { + for (int col = startX; col < endX; col++) { + int bufferIndex = row * rowStride + col * pixelStride; + int currentPixel = buffer.get(bufferIndex) & 0xFF; + + sumLuminance += currentPixel; + countPixels++; + } + } + + float averageLuminance = (float) sumLuminance / countPixels; + + return averageLuminance; + } + + private int kleinstesQuadrat(int height, int width) { + if (height == width) { + return height; + } else if (height > width) { + return kleinstesQuadrat(height - width, width); + } else { + return kleinstesQuadrat(height, width - height); + } + } + + private Runnable alarmResetRunnable = new Runnable() { + @Override + public void run() { + camera_alarm = false; + alarm.setText("OK"); + } + }; +} + diff --git a/app/src/main/java/com/example/greenwatch/MainActivity.java b/app/src/main/java/com/example/greenwatch/MainActivity.java index 3925a68..520b150 100644 --- a/app/src/main/java/com/example/greenwatch/MainActivity.java +++ b/app/src/main/java/com/example/greenwatch/MainActivity.java @@ -35,6 +35,6 @@ public class MainActivity extends AppCompatActivity { } private void starteKameraAktivitaet() { - startActivity(new Intent(this, Kamera_Beschleunigungssensor.class)); + startActivity(new Intent(this, KameraAktivitaet.class)); } } \ No newline at end of file diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index 74d96b5..9065c9a 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -30,5 +30,15 @@ app:layout_constraintTop_toTopOf="parent" app:layout_constraintVertical_bias="0.247" /> + + \ No newline at end of file