36. opencv4.4を呼び出すAndroid設定opencv4.4および追加モジュール(java / c ++)darkenetyolo4.0モデルチェック

基本的な考え方:プロジェクトのニーズにより、Android Studioで最新のdarknet yolo4の認識効果をテストする必要があります。ここでは、構成環境と開発プロセスを記録します。ブログの最後に、2つのBaiduリンクが提供されます。 Javaはopencv DNNのyolo4モデルを呼び出し、androidはC ++を使用してopencv DNNのyolo4モデルを呼び出します。

1.使用可能なAndroid Studioプロジェクトを作成します。その構成は基本的に次のとおりです。

 

次に、環境コンパイルツールを構成します。私の環境ツール構成ツールは次のとおりです。

Androidフォンに次のように表示されます:(期間中に発生したその他の問題は、自分で解決してください)

 2. opencv公式Webサイトにアクセスして、opencvに対応するAndroidコードをダウンロードします。

axel -n 100 https://jaist.dl.sourceforge.net/project/opencvlibrary/4.4.0/opencv-4.4.0-android-sdk.zip

解凍されたディレクトリ構造は次のとおりです。

ubuntu @ ubuntu:OpenCV-android-sdk $ tree -L 2

├──ライセンス
├──README.android
├──サンプル
│├──15パズル
│├──build.gradle
│├──カメラ校正
│├──色ブロブ検出
│├──顔面検出
│├──のGradle
│├──gradle.properties
│├──gradlew
│├──gradlew.bat
│├──画像操作
│├──settings.gradle
│├──チュートリアル-1- camerapreview
│├ ──チュートリアル-2- mixedprocessing
│└──チュートリアル-3- cameracontrol
└──SDK
    ├──build.gradle
    ├──など
    ├──ジャワ
    ├──libcxx_helper
    └──ネイティブ

15ディレクトリ、8ファイル

次に、Android Studioでopencv4.4.0モジュールのインポートを開始します---> file ---> new ---> import Module

次に、対応するプロジェクトに対応するパッケージを設定します。

Android Studioでopencv4.4によってyolo4を呼び出すための構成ファイルのダウンロードアドレスは、https//github.com/opencv/opencv_extra/blob/4.4.0/testdata/dnnです

モデルをダウンロードするには、yoloの公式Webサイトにアクセスしてください。

Android Sudioのコードファイルは、\ app \ src \ main \ java \ com \ example \ testyolo4 \ MainActivity.javaです。

package com.example.androidyolo;
import android.os.Bundle;
import android.os.Environment;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import org.opencv.android.OpenCVLoader;
import org.opencv.core.Mat;
import org.opencv.core.Point;
import org.opencv.core.Scalar;
import org.opencv.core.Size;
import org.opencv.dnn.Dnn;
import org.opencv.dnn.Net;
import org.opencv.imgcodecs.Imgcodecs;
import org.opencv.imgproc.Imgproc;
import java.io.File;

public class MainActivity extends AppCompatActivity {

    static {
        System.loadLibrary("opencv_java4");
    }
    private String sdPath = Environment.getExternalStorageDirectory().getAbsolutePath();
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        boolean load = OpenCVLoader.initDebug();
        if (load) {
            Log.i("MainActivity", "Open CV Libraries loaded...");
        } else {
            Log.i("MainActivity", "Open CV Libraries not loaded...");
        }
//
        String image_file = sdPath + File.separator + "1.png";//IMG_9452.JPG
        Mat im = Imgcodecs.imread(image_file, Imgcodecs.IMREAD_COLOR);
        // get a new Frame
        // Mat im = inputFrame.rgba();
        String[] names = new String[]{
                "aeroplane","bicycle","bird","boat","bottle",
                "bus","car","cat","chair","cow",
                "diningtable","dog","horse","motorbike","person",
                "pottedplant","sheep","sofa","train","tvmonitor"
        };
           ///\\storage\\sdcard0\\360\\yolov4-tiny.cfg
        String cfg_path= sdPath + File.separator + "yolov4.cfg";
        String model_path= sdPath + File.separator + "yolov4.weights";
        Net net = Dnn.readNetFromDarknet(cfg_path, model_path);
        if ( net.empty() ) {
            System.out.println("Reading Net error");
        }

        if( im.empty() ) {
            System.out.println("Reading Image error");
        }

        Mat frame = new Mat();
        Size sz1 = new Size(im.cols(),im.rows());
        Imgproc.resize(im, frame, sz1);
        Mat resized = new Mat();
        Size sz = new Size(416,416);
        Imgproc.resize(im, resized, sz);
        float scale = 1.0F / 255.0F;
        Mat inputBlob = Dnn.blobFromImage(im, scale, sz, new Scalar(0), false, false);
        net.setInput(inputBlob, "data");//
        Mat detectionMat = net.forward();//Mat detectionMat = net.forward("detection_out");
        if( detectionMat.empty() ) {
            System.out.println("No result");
        }

        for (int i = 0; i < detectionMat.rows(); i++)
        {
            int probability_index = 5;
            int size = (int) (detectionMat.cols() * detectionMat.channels());
            float[] data = new float[size];
            detectionMat.get(i, 0, data);
            float confidence = -1;
            int objectClass = -1;
            for (int j=0; j < detectionMat.cols();j++)
            {
                if (j>=probability_index && confidence<data[j])
                {
                    confidence = data[j];
                    objectClass = j-probability_index;
                }
            }

            if (confidence > 0.3)
            {
                System.out.println("Result Object: "+i);
                for (int j=0; j < detectionMat.cols();j++)
                    System.out.print(" "+j+":"+ data[j]);
                System.out.println("");
                float x = data[0];
                float y = data[1];
                float width = data[2];
                float height = data[3];
                float xLeftBottom = (x - width / 2) * frame.cols();
                float yLeftBottom = (y - height / 2) * frame.rows();
                float xRightTop = (x + width / 2) * frame.cols();
                float yRightTop = (y + height / 2) * frame.rows();
                System.out.println("Class: "+ names[objectClass]);
                System.out.println("Confidence: "+confidence);
                System.out.println("ROI: "+xLeftBottom+" "+yLeftBottom+" "+xRightTop+" "+yRightTop+"\n");

                Imgproc.rectangle(frame, new Point(xLeftBottom, yLeftBottom),
                        new Point(xRightTop,yRightTop),new Scalar(0, 255, 0),3);
            }
        }

        Imgcodecs.imwrite(sdPath + File.separator +"out.jpg", frame );

        ///

    }
}

出力画像

パッケージ化されたAndroid StudioとOpencv4.4.0プロジェクトを提供する

リンク:https 
://pan.baidu.com/s/1iEvY9yYJzXn3ZcBFD4n40A抽出コード:uyx1

補足:Androidのc ++モジュールでopencv4.4.0を使用する場合は、次の手順を実行するだけで済みます。opencv4.4.0のSDK全体をインポートする必要はありません。libsパッケージと対応するインクルードヘッダーファイルをインポートするだけです。対応するAndroid cmakefile.txtおよび対応するgradleを構成する必要があります):

対応するファイルを対応するディレクトリにコピーします。フォルダがない場合は、自分で作成してください。

対応する他のファイルの変更と構成は次のとおりです。

CMakefile.txtファイルの変更された内容は次のとおりです。

# For more information about using CMake with Android Studio, read the
# documentation: https://d.android.com/studio/projects/add-native-code.html

# Sets the minimum version of CMake required to build the native library.

cmake_minimum_required(VERSION 3.4.1)

# Creates and names a library, sets it as either STATIC
# or SHARED, and provides the relative paths to its source code.
# You can define multiple libraries, and CMake builds them for you.
# Gradle automatically packages shared libraries with your APK.

# 添加opencv的头文件目录
include_directories(${CMAKE_SOURCE_DIR}/include)

# 导入opencv的so
add_library(libopencv_java4 SHARED IMPORTED)
set_target_properties(libopencv_java4 PROPERTIES IMPORTED_LOCATION
        ${CMAKE_SOURCE_DIR}/../jniLibs/libs/${ANDROID_ABI}/libopencv_java4.so)

add_library( # Sets the name of the library.
             native-lib

             # Sets the library as a shared library.
             SHARED

             # Provides a relative path to your source file(s).
             native-lib.cpp )

# Searches for a specified prebuilt library and stores the path as a
# variable. Because CMake includes system libraries in the search path by
# default, you only need to specify the name of the public NDK library
# you want to add. CMake verifies that the library exists before
# completing its build.

find_library( # Sets the name of the path variable.
              log-lib

              # Specifies the name of the NDK library that
              # you want CMake to locate.
              log )

# Specifies libraries CMake should link to your target library. You
# can link multiple libraries, such as libraries you define in this
# build script, prebuilt third-party libraries, or system libraries.

target_link_libraries( # Specifies the target library.
                       native-lib
                        jnigraphics
                        libopencv_java4 # 链接opencv的so
                       # Links the target library to the log library
                       # included in the NDK.
                       ${log-lib} )

対応するGradleファイルの変更。

        externalNativeBuild {
            cmake {
                cppFlags "-std=c++11"
                arguments '-DANDROID=c++_shared'
                abiFilters 'armeabi-v7a','arm64-v8a','x86','x86_64'

            }
        }
    }
    sourceSets{
        main{
            jniLibs.srcDirs=["src/main/jniLibs/libs"]
        }
    }

その後、Android C ++モデルでopencvを呼び出すことができます。

以下は、opencv4.4.0を使用してC ++ yolo4を呼び出すandroidの例です(このコードでは、C ++のリストデータ構造を使用して、コードロジックをAndroidに渡されるリスト構造にカプセル化し、参照できます~~)

リンク:https 
://pan.baidu.com/s/1PDHyaCGTwq-LE95vv4yAxg抽出コード:k2yn

おすすめ

転載: blog.csdn.net/sxj731533730/article/details/108380540
おすすめ