Как в Android подключить OpenCV?

Для подключения OpenCV в Android-приложении следуйте следующим шагам:

Шаг 1: Загрузите OpenCV SDK

Первым шагом является загрузка OpenCV SDK с официального сайта OpenCV: https://opencv.org/releases/. Выберите версию SDK, которая соответствует вашей операционной системе. Обычно SDK представлен в виде zip-архива.

Шаг 2: Импортируйте OpenCV в проект

После загрузки SDK вам нужно распаковать zip-архив и открыть ваш проект в Android Studio. Затем выберите "File -> New -> Import Module" и укажите путь к распакованной папке OpenCV Android SDK.

Когда проект успешно импортирован, вам нужно добавить зависимость OpenCV в файле build.gradle для вашего приложения, в разделе dependencies:

implementation project(':openCVLibraryXYZ')

Здесь XYZ - это версия OpenCV SDK, которую вы использовали.

После этого необходимо синхронизировать проект, чтобы все изменения применились.

Шаг 3: Инициализация OpenCV в вашем приложении

Теперь вам нужно проинициализировать библиотеку OpenCV в вашем приложении. Для этого вам понадобится OpenCVLoader, который позволит загрузить OpenCV в ваше приложение. Вы можете сделать это в методе onCreate вашей MainActivity. Вот пример:

private DrawerLayout mDrawerLayout;
private ActionBarDrawerToggle mToggle;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    mDrawerLayout = (DrawerLayout) findViewById(R.id.drawerLayout);
    mToggle = new ActionBarDrawerToggle(this, mDrawerLayout, R.string.open, R.string.close);
    mDrawerLayout.addDrawerListener(mToggle);
    mToggle.syncState();

    getSupportActionBar().setDisplayHomeAsUpEnabled(true); 

    if (!OpenCVLoader.initDebug()) {
        OpenCVLoader.initAsync(OpenCVLoader.OPENCV_VERSION_3_4_0, this, mLoaderCallback);
    } else {
        mLoaderCallback.onManagerConnected(LoaderCallbackInterface.SUCCESS);
    }
}

private BaseLoaderCallback mLoaderCallback = new BaseLoaderCallback(this) {
    @Override
    public void onManagerConnected(int status) {
        if (status == LoaderCallbackInterface.SUCCESS) {
            // OpenCV is loaded successfully
        } else {
            super.onManagerConnected(status);
        }
    }
};

Шаг 4: Проверьте работоспособность

Теперь у вас должно быть все готово для использования OpenCV в вашем Android-приложении. Вы можете проверить его, добавив код OpenCV в любую часть вашего приложения.

Например, вы можете использовать OpenCV для обработки изображений. Чтобы сделать это, вы можете создать новый класс с именем MyImageProcessing, который наследует JavaCameraView, и реализовать методы обработки изображения.

import org.opencv.android.JavaCameraView;
import org.opencv.core.Mat;
import org.opencv.core.Size;
import org.opencv.core.Scalar;
import org.opencv.core.CvType;
import org.opencv.core.Core;
import org.opencv.core.MatOfRect;
import org.opencv.core.Rect;
import org.opencv.objdetect.CascadeClassifier;
import org.opencv.android.CameraBridgeViewBase;
import org.opencv.android.LoaderCallbackInterface;

public class MyImageProcessing extends JavaCameraView implements CameraBridgeViewBase.CvCameraViewListener2 {
    private CascadeClassifier mFaceCascade;
    private Mat mRgba, mGray;

    public MyImageProcessing(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    @Override
    public void onCameraViewStarted(int width, int height) {
        mRgba = new Mat(height, width, CvType.CV_8UC4);
        mGray = new Mat(height, width, CvType.CV_8UC1);
    
        mFaceCascade = new CascadeClassifier();
        mFaceCascade.load(getCascadeFile());
    }

    @Override
    public void onCameraViewStopped() {
        mRgba.release();
        mGray.release();
    }
    
    @Override
    public Mat onCameraFrame(CvCameraViewFrame inputFrame) {
        mRgba = inputFrame.rgba();
        mGray = inputFrame.gray();
    
        MatOfRect faces = new MatOfRect();
        mFaceCascade.detectMultiScale(mGray, faces);
        
        for (Rect rect : faces.toArray()) {
            Core.rectangle(mRgba, rect.tl(), rect.br(), new Scalar(255, 0, 0), 2);
        }
    
        return mRgba;
    }
    
    private String getCascadeFile() {
        String path = getContext().getFilesDir().getPath() + "/lbpcascade_frontalface.xml";
        try {
            InputStream is = getResources().openRawResource(R.raw.lbpcascade_frontalface);
            FileOutputStream os = new FileOutputStream(path);

            byte[] buffer = new byte[4096];
            int bytesRead;
        
            while ((bytesRead = is.read(buffer)) != -1) {
                os.write(buffer, 0, bytesRead);
            }
        
            is.close();
            os.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
        
        return path;
    }
}

And then, in your MainActivity, you can use MyImageProcessing like this:

public class MainActivity extends AppCompatActivity {
    private MyImageProcessing mImageProcessing;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        mImageProcessing = (MyImageProcessing) findViewById(R.id.imageProcessing);
        mImageProcessing.setCvCameraViewListener(mImageProcessing);
    }

    @Override
    protected void onPause() {
        super.onPause();
        if (mImageProcessing != null) {
            mImageProcessing.disableView();
        }
    }

    @Override
    protected void onResume() {
        super.onResume();
        if (mImageProcessing != null) {
            mImageProcessing.enableView();
        }
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        if (mImageProcessing != null) {
            mImageProcessing.disableView();
        }
    }
}

Обратите внимание, что вы должны поместить файл lbpcascade_frontalface.xml, который используется в данном примере, в папку res/raw вашего проекта.

Вот как можно подключить OpenCV в вашем Android-приложении. Надеюсь, это поможет вам начать использовать OpenCV для различных задач компьютерного зрения в вашем приложении на Android. Удачи!