@senspond

>

개발>모바일

안드로이드(Android) OpenCV 세팅하기, Junit 테스트를 위한 Java 세팅까지

등록일시 : 2025-01-22 (수) 05:59
업데이트 : 2025-01-22 (수) 05:59
오늘 조회수 : 5
총 조회수 : 30

    안드로이드(Android) OpenCV 세팅하기, Junit 테스트를 위한 Java 세팅까지


    Andorid OpenCV 세팅하기입니다.

    참고로 이 글은 Kotlin이 아닌 Java 기반 세팅인데, 방법은 마찬가지입니다.


    안드로이드 OpenCV 세팅하기


    OpenCV Android SDK 다운로드

    먼저 OpenCV SDK 를 다운로드 합니다.


    Releases · opencv/opencv





    Import Module

    안드로이드 스튜디오에서 File > New > Import Module 로 OpenCV SDK로 넣어줍니다.




    모듈명은 적절하게 opencv로


    Add Module Dependency

    그 다음에 Project Structure에서 Dependencies에서 app에 Module Dependency를 추가합니다.






    Gradle Build




    프로젝트가 java 세팅이면 opencv build.gradle에서 apply plugin: 'kotlin-android'를 주석하고 gradle build 합니다.




    제대로 build가 되면 이런식으로 되어 있을것입니다.





    OpenCV-android-sdk/sdk/native/jni 에 있는 파일들을 모두 app/src/jniLibs 에 복사해줍니다.



    구동 테스트

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        if (!OpenCVLoader.initDebug()) {
             Log.e(TAG, "OpenCV 초기화 실패!");
        } else {
             Log.d(TAG, "OpenCV 초기화 성공!");
        }
    }

    직접 애뮬레이터를 구동해서 초기화가 되는지 테스트를 해봅니다.





    AndroidJUnit4로 OpenCV 테스트

    가상 애뮬레이터를 가동시키면서 Junit으로 테스트하는 방법입니다.

    import android.graphics.Bitmap;
    import android.graphics.Canvas;
    import android.graphics.Color;
    import android.graphics.Paint;
    import androidx.test.ext.junit.runners.AndroidJUnit4;
    
    import org.junit.Before;
    import org.junit.Test;
    import org.junit.runner.RunWith;
    import org.opencv.android.OpenCVLoader;
    import org.opencv.android.Utils;
    import org.opencv.core.Core;
    import org.opencv.core.CvType;
    import org.opencv.core.Mat;
    
    
    @RunWith(AndroidJUnit4.class)
    public class AndroidOpenCVTest {
    
        @Before
        public void setUp() {
            // Android OpenCV 초기화
            if (!OpenCVLoader.initDebug()) {
                throw new RuntimeException("OpenCV initialization failed!");
            }
        }
    
        @Test
        public void test() {
            Mat m  = Mat.eye(3, 3, CvType.CV_8UC1);
            System.out.println("m = " + m.dump());
            int width = 100;
            int height = 100;
            Bitmap testImage = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
    
            Canvas canvas = new Canvas(testImage);
            Paint paint = new Paint();
            paint.setColor(Color.WHITE);
            canvas.drawRect(25, 25, 75, 75, paint); // 흰색 사각형 그리기
            Bitmap rotatedImage = rotateImage(testImage, Core.ROTATE_90_CLOCKWISE);
            int rotatedPixel = rotatedImage.getPixel(25, 75); 
            System.out.println(rotatedPixel);
        }
    
    
        private Bitmap rotateImage(Bitmap inputImage, int angle) {
            Mat src = new Mat();
            Utils.bitmapToMat(inputImage, src);
            Mat dst = new Mat();
            Core.rotate(src, dst, angle);
            Bitmap outputImage = Bitmap.createBitmap(dst.cols(), dst.rows(), Bitmap.Config.ARGB_8888);
            Utils.matToBitmap(dst, outputImage);
            return outputImage;
        }
    }




    그런데 개발할 때 애뮬레이터를 매번 가동 시키면서 테스트하면 오래 걸려서

    애뮬레이터를 띄우고 안드로이드 환경의 JVM이 아닌, 로컬 JVM환경에서 빠르게 테스트가 가능하면 좋겠죠?


    Junit Local JVM으로 OpenCV 테스트하기

    테스트 플랫폼 OpenCV 다운로드

    Junit으로 테스트하려면 현재 윈도우 환경이라 윈도우 opencv가 필요합니다.

    안드로이드 환경이 아닌 테스트 환경에서 JVM이 구동 되는 OpenCV 네이티브 코드가 필요합니다.

    C/C++로 만들어진 라이브러리다 보니 약간 불편함이 있습니다.


    Releases - OpenCV







    윈도우에서는 OS가 64비트면 x64, 32비트면 x84에 있는 dll를 사용합니다. 리눅스는 확장자가 .so 파일


    Local JVM OpenCV Junit Test

    package com.rgbitsoft.phstyle;
    
    import org.junit.Test;
    import org.opencv.core.Core;
    import org.opencv.core.CvType;
    import org.opencv.core.Mat;
    
    public class OpenCVTests {
    
        static {
            System.load("F:\\Dev\\opencv\\opencv-windows\\build\\java\\x64\\opencv_java4100.dll");
        }
        @Test
        public void test(){
            Mat m  = Mat.eye(3, 3, CvType.CV_8UC1);
            System.out.println("m = " + m.dump());
        }
    }

    System.load로 직접 dll경로를 입력하거나, 아니면 시스템 환경변수에 등록하고 불러옵니다.




    org.opencv.android 하위에 있지 않은 core 패키지들은 이렇게 로컬 JVM에서 Junit으로만 테스트가 가능합니다.

    다만, org.opencv.android 하위 패키지들은 mock 테스트로는 실제 테스트가 불가합니다.

    그건 어쩔 수 없이 AndroidJUnit4로 테스트를 해야합니다.

    그래도 Opencv 코어 로직과 관련한 코드들은 로컬JVM으로 빠르게 테스트해가면서 개발할 수 있습니다.



    senspond

    안녕하세요. Red, Green, Blue 가 만나 새로운 세상을 만들어 나가겠다는 이상을 가진 개발자의 개인공간입니다.

    댓글 ( 0 )

    카테고리내 관련 게시글

    현재글에서 작성자가 발행한 같은 카테고리내 이전, 다음 글들을 보여줍니다

    @senspond

    >

    개발>모바일

    • 구글 플레이스토어 인앱결제 내부테스트 하는방법

      구글 플레이스토어 인앱결제 내부테스트 하는방법을 정리해봤습니다.
        2024-09-03 (화) 07:57
      1. [현재글] 안드로이드(Android) OpenCV 세팅하기, Junit 테스트를 위한 Java 세팅까지

        안드로이드(Android) OpenCV 세팅하기, Junit 테스트를 위한 Java 세팅까지
          2025-01-22 (수) 05:59
        1. 딥러닝 모델을 플러터로 모바일기기에 임베딩하기

          딥러닝 모델을 플러터로 모바일기기에 임베딩하기
            2024-11-14 (목) 12:12
          1. Android Native C++ 로그를 안드로이드 logcat로 확인하기

            Android Native C++ 로그를 안드로이드 logcat로 확인하기
              2025-02-08 (토) 06:07