Erstellen Sie eine einfache Android-App, die das Kamerabild nur negativ und positiv invertiert und ausgibt. OpenCV4 wird für die Kameraeingabe verwendet. Es kann als Basisprojekt zum Erstellen einer Anwendung mit Kamerabildern verwendet werden. In diesem Artikel werde ich erklären, wie die OpenCV-Bibliothek in das APK aufgenommen wird, ohne OpenCV Manager zu verwenden.
** Nachtrag (18.07.2020) ** Diese Methode kann anscheinend nicht mit dem neuesten Android Studio (oder Android SDK) verwendet werden. Es ist besser, Camera2 API oder Camera X zu verwenden. Hier erfahren Sie, wie Sie CameraX verwenden. https://qiita.com/iwatake2222/items/c0ebe6d84afdef57aab3
https://developer.android.com/studio
Es kann zweckmäßig sein, den Pfad mit adb in den Ordner zu legen. (In diesem Artikel nicht verwendet)
https://github.com/opencv/opencv/releases
Laden Sie opencv-4.1.0-android-sdk.zip
von herunter und extrahieren Sie es an einen geeigneten Ort. Bitte wählen Sie die Version, die Sie mögen.
Im Folgenden wird die Erklärung mit dem Extraktionszielpfad als "{OpenCV-android-sdk}" beschrieben.
Run
-> Run'App'
und es ist in Ordnung, wenn die Standardanwendung, die Hello World ausgibt, auf Ihrem Android-Gerät gestartet wird.Datei
->
Neu->
Importmodul`{OpenCV-android-sdk} / sdk / java
an?
--Wenn "Modulname" die Standardeinstellung ist, lautet sie "sdk" und ist schwer zu verstehen. Stellen Sie sie daher entsprechend als "opencv" ein.Datei
-> Projektstruktur
--Wählen Sie links "App" und wählen Sie die Registerkarte "Abhängigkeiten"
--Klicken Sie oben rechts auf "+ (hinzufügen)" und wählen Sie "3: Modulabhängigkeit"
--Wählen Sie opencv
und OK(Nicht erforderlich) Kopie der OpenCV-Bibliothek (also Datei)
Früher mussten Sie die OpenCV-Bibliothek (also Datei) selbst in jniLibs
kopieren, aber jetzt (OpenCV4 oder höher ??) scheint dies unnötig.
(Nicht erforderlich) AndroidManifest, build.gradle korrigieren
In der Vergangenheit war es notwendig, "targetSdkVersion" usw., die in "AndroidManifest.xml" von OpenCV angegeben sind, zu löschen oder verschiedene sdkVersions ("compileSdkVersion" usw.) in "build.gradle" mit der App auszurichten. hätten. --Jetzt (OpenCV4 oder höher ??) scheint unnötig
Der Code der Aktivität, die OpenCV verwendet (app \ src \ main \ java \ com \ example \ myapplication \ MainActivity.java
, wenn Sie zum Zeitpunkt der Projekterstellung Leere Aktivität ausgewählt und keine Einstellungen geändert haben), lautet wie folgt Bearbeiten
In der Praxis ist beides ausreichend. In einem echten Produkt würde ich nur "System.loadLibrary" verwenden.
MainActivity.java
public class MainActivity extends AppCompatActivity {
static {
System.loadLibrary("opencv_java4"); //hinzufügen
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
OpenCVLoader.initDebug(); //hinzufügen
}
}
Führen Sie es in diesem Status aus. Wenn Logcat das folgende Protokoll anzeigt, ist es in Ordnung.
Logcat-Ausgabe
2019-05-25 18:50:20.050 29439-29439/com.example.myapplication I/OpenCV/StaticHelper: General configuration for OpenCV 4.1.0 =====================================
2019-05-25 18:50:20.050 29439-29439/com.example.myapplication I/OpenCV/StaticHelper: Version control: 4.1.0
2019-05-25 18:50:20.050 29439-29439/com.example.myapplication I/OpenCV/StaticHelper: Platform:
2019-05-25 18:50:20.050 29439-29439/com.example.myapplication I/OpenCV/StaticHelper: Timestamp: 2019-04-07T19:03:43Z
2019-05-25 18:50:20.050 29439-29439/com.example.myapplication I/OpenCV/StaticHelper: Host: Linux 4.15.0-47-generic x86_64
2019-05-25 18:50:20.050 29439-29439/com.example.myapplication I/OpenCV/StaticHelper: Target: Android 1 aarch64
2019-05-25 18:50:20.050 29439-29439/com.example.myapplication I/OpenCV/StaticHelper: CMake: 3.6.0-rc2
2019-05-25 18:50:20.050 29439-29439/com.example.myapplication I/OpenCV/StaticHelper: CMake generator: Ninja
2019-05-25 18:50:20.050 29439-29439/com.example.myapplication I/OpenCV/StaticHelper: CMake build tool: /opt/android/android-sdk.gradle/cmake/3.6.4111459/bin/ninja
2019-05-25 18:50:20.050 29439-29439/com.example.myapplication I/OpenCV/StaticHelper: Configuration: Release
Als ich mir die Oberseite von Logcat ansah, wurde ein Fehler wie "OpenCV / StaticHelper: OpenCV-Fehler: Infobibliothek für OpenCV kann nicht geladen werden" angezeigt, der sich jedoch nicht auf den Vorgang auswirkte.
Nachdem Sie ein Projekt mit OpenCV haben, erstellen wir eine Anwendung, die die Live-Ansicht der Kamera anzeigt.
Nehmen Sie Einstellungen vor, um die Kamera zu verwenden
Zunächst müssen Sie deklarieren, dass "diese Anwendung eine Kamera verwendet".
Fügen Sie die folgenden drei Zeilen zu "app / src / main / AndroidManifest.xml" hinzu. Fügen Sie es direkt unter "
AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.myapplication">
<!--↓ Hinzufügen-->
<uses-permission android:name="android.permission.CAMERA"/>
<uses-feature android:name="android.hardware.camera" android:required="false"/>
<uses-feature android:name="android.hardware.camera.autofocus" android:required="false"/>
<!--↑ Hinzufügen-->
<application
android:allowBackup="true"
Kürzung
</application>
</manifest>
Tatsächlich reicht es aus, nur das Manifest festzulegen. Dies allein erfordert jedoch, dass der Benutzer Berechtigungen auf dem Administrationsbildschirm der App festlegt. Normale Benutzer wissen nicht einmal, wo sich der Bildschirm befindet.
Daher zeigt die App freiwillig einen Anforderungsbildschirm mit der Frage "Bitte geben Sie mir die Erlaubnis" an.
Wenn mit dem folgenden Code keine Berechtigung festgelegt ist, wird der Berechtigungsanforderungsbildschirm angezeigt. Der aufrufende Code wird später angezeigt.
MainActivity.java
public static boolean getPermissionCamera(Activity activity) {
if (ContextCompat.checkSelfPermission(
activity,
android.Manifest.permission.CAMERA)
!= PackageManager.PERMISSION_GRANTED) {
String[] permissions = new String[]{Manifest.permission.CAMERA};
ActivityCompat.requestPermissions(
activity,
permissions,
0);
return false;
} else {
return true;
}
}
Fügen Sie CameraView zum Layout hinzu. Öffnen Sie layout / activity_main.xml
und fügen Sie im Textmodus org.opencv.android.JavaCameraView
hinzu.
activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Hello World!"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<!--↓ Hinzufügen-->
<org.opencv.android.JavaCameraView
android:id="@+id/camera_view"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:visibility="visible"
tools:layout_editor_absoluteX="0dp"
tools:layout_editor_absoluteY="0dp"
app:show_fps="true"/>
<!--↑ Hinzufügen-->
</android.support.constraint.ConstraintLayout>
Der vollständige Code wird unten angezeigt.
CameraBridgeViewBase.CvCameraViewListener
.
--Nach dem Hinzufügen von implementiert CameraBridgeViewBase.CvCameraViewListener
zu MainActivity
drücken Sie Alt + Eingabetaste, um den entsprechenden Import hinzuzufügen. Drücken Sie erneut Alt + Eingabetaste, um Implementierungsmethoden auszuführen und die erforderlichen Funktionen hinzuzufügenCameraBridgeViewBase
und weisen Sie es der JavaCameraView
zu, die Sie zuvor im Layout platziert haben. Geben Sie diese Aktivität mit "setCvCameraViewListener" an, damit "onCameraViewStarted", "onCameraViewStopped" und "onCameraFrame" früher aufgerufen werden.
-- onCameraFrame
ist eine Funktion, die jedes Bild aufruft. Das Eingabebild von der Kamera wird in das Argument (inputFrame
) eingegeben, und die anzuzeigende Matte wird im Rückgabewert festgelegt.
―― Da dieser onCameraFrame
in einem vom UI-Thread getrennten Thread ausgeführt wird, scheint es in Ordnung zu sein, hier eine umfangreiche Verarbeitung wie die Bildverarbeitung durchzuführen. Ich weiß nicht, ob es Best Practice ist.
――Dieses Mal habe ich versucht, das Negative und das Positive umzukehrenMainActivity.java
public class MainActivity extends AppCompatActivity implements CameraBridgeViewBase.CvCameraViewListener {
private CameraBridgeViewBase m_cameraView;
static {
System.loadLibrary("opencv_java4");
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
getPermissionCamera(this);
// OpenCVLoader.initDebug();
m_cameraView = findViewById(R.id.camera_view);
m_cameraView.setCvCameraViewListener(this);
m_cameraView.enableView();
}
public static boolean getPermissionCamera(Activity activity) {
if (ContextCompat.checkSelfPermission(
activity,
android.Manifest.permission.CAMERA)
!= PackageManager.PERMISSION_GRANTED) {
String[] permissions = new String[]{Manifest.permission.CAMERA};
ActivityCompat.requestPermissions(
activity,
permissions,
0);
return false;
} else {
return true;
}
}
@Override
public void onCameraViewStarted(int width, int height) {
}
@Override
public void onCameraViewStopped() {
}
@Override
public Mat onCameraFrame(Mat inputFrame) {
//Führen Sie hier eine Bildverarbeitung durch
//Versuchen Sie, das Negative und das Positive umzukehren
Core.bitwise_not(inputFrame, inputFrame);
return inputFrame;
}
}
Der Bildschirm kann sich je nach Modell, Geräteorientierung und Einstellungen drehen. Diese Anpassungen erschweren den Code und die Beschreibung und werden weggelassen. Ebenso werden das Ende und die Rückgabe von onDestory und onResume weggelassen.
Recommended Posts