Créez une application Android simple qui inverse simplement l'image de la caméra de manière négative et positive et la produit. OpenCV4 est utilisé pour l'entrée de la caméra. Il peut être utilisé comme projet de base pour créer une sorte d'application utilisant des images de caméra. Dans cet article, j'expliquerai comment inclure la bibliothèque OpenCV dans l'APK sans utiliser OpenCV Manager.
** Addendum (2020/07/18) ** Il semble que cette méthode ne puisse pas être utilisée avec Android Studio (ou SDK Android) récent. Il est préférable d'utiliser l'API Camera2 ou Camera X. Voici comment utiliser CameraX. https://qiita.com/iwatake2222/items/c0ebe6d84afdef57aab3
https://developer.android.com/studio
Il peut être pratique de mettre le chemin dans le dossier avec adb. (Non utilisé dans cet article)
https://github.com/opencv/opencv/releases Téléchargez ʻopencv-4.1.0-android-sdk.zip` et décompressez-le à un emplacement approprié. Veuillez choisir la version que vous aimez.
Ci-après, l'explication sera décrite avec le chemin de destination de l'extraction comme «{OpenCV-android-sdk}».
--Ouvrez Android Studio
--Cliquez sur Démarrer un nouveau projet Android Studio
--Sélectionnez ʻEmpty Activity` et Next
Exécuter
-> Exécuter'App'
dans la barre de menu, et c'est OK si l'application par défaut qui génère Hello World démarre sur votre appareil Android.Fichier
->
Nouveau-> ʻImport Module
dans la barre de menuRépertoire source
, spécifiez {OpenCV-android-sdk} / sdk
qui a été téléchargé et développé plus tôt.
--Spécifiez {OpenCV-android-sdk} / sdk / java
dans OpenCV 3.x ou version antérieure?Nom du module
est la valeur par défaut, ce sera sdk
et il est difficile à comprendre, alors définissez-le correctement comme ʻopencv`.Suivant
, Terminer
Fichier
-> Structure du projet
dans la barre de menu
--Sélectionnez ʻapp sur la gauche et sélectionnez l'onglet
Dépendances--Cliquez sur
+ (ajouter)en haut à droite et sélectionnez
3: Dépendance du module --Sélectionnez ʻopencv
et OK(Non requis) Copie de la bibliothèque OpenCV (donc fichier)
Dans le passé, vous deviez copier vous-même la bibliothèque OpenCV (donc fichier) dans jniLibs
, mais maintenant (OpenCV4 ou version ultérieure ??) cela semble inutile.
(Non requis) Correction d'AndroidManifest, build.gradle
Auparavant, il est nécessaire de supprimer targetSdkVersion
etc. spécifié dans ʻAndroidManifest.xml d'OpenCV, ou d'aligner diverses sdkVersions (
compileSdkVersionetc.) dans
build.gradle` avec app. eu.
--Maintenant (OpenCV4 ou version ultérieure ??) semble inutile
Le code de l'activité qui utilise OpenCV (si vous avez sélectionné Activité vide au moment de la génération du projet et n'avez modifié aucun paramètre, ʻapp \ src \ main \ java \ com \ example \ myapplication \ MainActivity.java`) comme suit Éditer
En pratique, l'un ou l'autre suffit. Dans un vrai produit, je n'utiliserais que System.loadLibrary
.
MainActivity.java
public class MainActivity extends AppCompatActivity {
static {
System.loadLibrary("opencv_java4"); //ajouter à
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
OpenCVLoader.initDebug(); //ajouter à
}
}
Exécutez dans cet état, et si Logcat affiche le journal suivant, c'est OK.
Sortie Logcat
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
D'une manière ou d'une autre, quand j'ai regardé le haut de Logcat, ʻOpenCV / StaticHelper: Erreur OpenCV: Impossible de charger la bibliothèque d'informations pour OpenCV` J'ai eu cette erreur, mais cela n'a pas affecté l'opération.
Maintenant que vous avez un projet qui intègre OpenCV, créons une application qui affiche la vue en direct de la caméra.
Définissez les paramètres pour utiliser l'appareil photo
Tout d'abord, vous devez déclarer que "cette application utilise une caméra".
Ajoutez les trois lignes suivantes à ʻapp / src / main / AndroidManifest.xml. Ajoutez-le directement sous
. Ajoutez-le dans la même ligne que le
AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.myapplication">
<!--↓ Ajouter-->
<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"/>
<!--↑ Ajouter-->
<application
android:allowBackup="true"
réduction
</application>
</manifest>
En fait, il suffit de définir le manifeste. Cependant, cela seul nécessite que l'utilisateur définisse les autorisations à partir de l'écran d'administration de l'application. Les utilisateurs normaux ne savent même pas où se trouve l'écran.
Par conséquent, l'application affichera volontairement un écran de demande demandant «Veuillez me donner la permission».
Avec le code suivant, si l'autorisation n'est pas définie, l'écran de demande d'autorisation s'affiche. Le code d'appel sera affiché plus tard.
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;
}
}
Ajoutez CameraView à la mise en page. Ouvrez layout / activity_main.xml
et en mode texte, ajoutez ʻorg.opencv.android.JavaCameraView`.
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" />
<!--↓ Ajouter-->
<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"/>
<!--↑ Ajouter-->
</android.support.constraint.ConstraintLayout>
Le code complet est indiqué ci-dessous.
--Hérite de l'interface CameraBridgeViewBase.CvCameraViewListener
.
à
MainActivity, appuyez sur Alt + Entrée pour ajouter l'importation de manière appropriée. Encore une fois, appuyez sur Alt + Entrée pour mettre en œuvre des méthodes pour ajouter les fonctions requises --Déclarez
CameraBridgeViewBase et affectez-le à
JavaCameraViewque vous avez placé dans la mise en page précédemment. Spécifiez cette activité avec
setCvCameraViewListener pour appeler ʻonCameraViewStarted
, ʻonCameraViewStopped et ʻonCameraFrame
ajoutés plus tôt.
--ʻOnCameraFrame est une fonction appelée chaque image. L'image d'entrée de la caméra est entrée dans l'argument (ʻinputFrame
), et le Mat à afficher est défini dans la valeur de retour.
―― Puisque ce ʻonCameraFrame` s'exécute dans un thread séparé du thread de l'interface utilisateur, il semble qu'il soit acceptable de faire un traitement lourd tel que le traitement d'image ici. Je ne sais pas si c'est la meilleure pratique.
―― Cette fois, j'ai essayé d'inverser le négatif et le positif devient lourd, les images par seconde du dessin ralentiront naturellement. C'est bien pour les implémenteurs. Il semble que la fonction ʻonCameraFrame
ne sera pas appelée à nouveau lors d'un traitement intensif dans ʻonCameraFrame`. Il ne semble donc pas nécessaire d'en faire un réentrant.MainActivity.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) {
//Faites un peu de traitement d'image ici
//Essayez d'inverser le négatif et le positif
Core.bitwise_not(inputFrame, inputFrame);
return inputFrame;
}
}
L'écran peut pivoter en fonction du modèle, de l'orientation de l'appareil et des paramètres. Ces ajustements compliquent le code et la description et sont omis. De même, la fin et le retour de onDestory et onResume sont également omis.
Recommended Posts