@senspond
>
안드로이드(Android) OpenCV 세팅하기, Junit 테스트를 위한 Java 세팅까지
Andorid OpenCV 세팅하기입니다.
참고로 이 글은 Kotlin이 아닌 Java 기반 세팅인데, 방법은 마찬가지입니다.
먼저 OpenCV SDK 를 다운로드 합니다.
안드로이드 스튜디오에서 File > New > Import Module 로 OpenCV SDK로 넣어줍니다.
모듈명은 적절하게 opencv로
그 다음에 Project Structure에서 Dependencies에서 app에 Module Dependency를 추가합니다.
프로젝트가 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 초기화 성공!");
}
}
직접 애뮬레이터를 구동해서 초기화가 되는지 테스트를 해봅니다.
가상 애뮬레이터를 가동시키면서 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으로 테스트하려면 현재 윈도우 환경이라 윈도우 opencv가 필요합니다.
안드로이드 환경이 아닌 테스트 환경에서 JVM이 구동 되는 OpenCV 네이티브 코드가 필요합니다.
C/C++로 만들어진 라이브러리다 보니 약간 불편함이 있습니다.
윈도우에서는 OS가 64비트면 x64, 32비트면 x84에 있는 dll를 사용합니다. 리눅스는 확장자가 .so 파일
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으로 빠르게 테스트해가면서 개발할 수 있습니다.
안녕하세요. Red, Green, Blue 가 만나 새로운 세상을 만들어 나가겠다는 이상을 가진 개발자의 개인공간입니다.
현재글에서 작성자가 발행한 같은 카테고리내 이전, 다음 글들을 보여줍니다
@senspond
>