Nuke Olaf - Log Store
[Android] 안드로이드 - openCV 튜토리얼 본문
https://docs.opencv.org/4.1.2/d9/d3f/tutorial_android_dev_intro.html
https://docs.opencv.org/4.1.2/da/d2a/tutorial_O4A_SDK.html
BaseLoaderCallback
Application Development with Static Initialization
Using async initialization is a recommended way for application development. It uses the OpenCV Manager to access OpenCV libraries externally installed in the target system.
응용 프로그램 개발에는 비동기 초기화를 사용하는 것이 좋다. OpenCV Manager를 사용하여 대상 시스템의 외부에 설치된 OpenCV 라이브러리에 액세스한다.
In most cases OpenCV Manager may be installed automatically from Google Play. For the case, when Google Play is not available, i.e. emulator, developer board, etc, you can install it manually using adb tool. See Manager Selection for details.
대부분의 경우 OpenCV Manager는 Google Play에서 자동으로 설치될 수 있다. 에뮬레이터, 개발자 보드 등 Google Play를 사용할 수없는 경우 adb 툴을 사용하여 수동으로 설치할 수 있다. 자세한 내용은 Manager Selection을 참조하십시오.
There is a very base code snippet implementing the async initialization. It shows basic principles. See the "15-puzzle" OpenCV sample for details.
비동기 초기화를 구현하는 매우 기본 코드 스니펫이 있다. 기본 원칙을 보여준다. 자세한 내용은 "15- 퍼즐"OpenCV 샘플을 참조하십시오.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
|
public class Sample1Java extends Activity implements CvCameraViewListener {
private BaseLoaderCallback mLoaderCallback = new BaseLoaderCallback(this) {
@Override
public void onManagerConnected(int status) {
switch (status) {
case LoaderCallbackInterface.SUCCESS:
{
Log.i(TAG, "OpenCV loaded successfully");
mOpenCvCameraView.enableView();
} break;
default:
{
super.onManagerConnected(status);
} break;
}
}
};
@Override
public void onResume()
{
super.onResume();
OpenCVLoader.initAsync(OpenCVLoader.OPENCV_VERSION_2_4_6, this, mLoaderCallback);
}
...
}
http://colorscripter.com/info#e" target="_blank" style="color:#e5e5e5text-decoration:none">Colored by Color Scripter
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
|
public class MainActivity extends Activity implements CvCameraViewListener2 {
private BaseLoaderCallback mLoaderCallback = new BaseLoaderCallback(this) {
@Override
public void onManagerConnected(int status) {
switch(status) {
case LoaderCallbackInterface.SUCCESS:
Log.i(TAG,"OpenCV Manager Connected");
//from now onwards, you can use OpenCV API
Mat m = new Mat(5, 10, CvType.CV_8UC1, new Scalar(0));
break;
case LoaderCallbackInterface.INIT_FAILED:
Log.i(TAG,"Init Failed");
break;
case LoaderCallbackInterface.INSTALL_CANCELED:
Log.i(TAG,"Install Cancelled");
break;
case LoaderCallbackInterface.INCOMPATIBLE_MANAGER_VERSION:
Log.i(TAG,"Incompatible Version");
break;
case LoaderCallbackInterface.MARKET_ERROR:
Log.i(TAG,"Market Error");
break;
default:
Log.i(TAG,"OpenCV Manager Install");
super.onManagerConnected(status);
break;
}
}
};
@Override
public void onResume() {
super.onResume();
OpenCVLoader.initAsync(OpenCVLoader.OPENCV_VERSION_3_1_0, this, mLoaderCallback);
}
...
}
http://colorscripter.com/info#e" target="_blank" style="color:#e5e5e5text-decoration:none">Colored by Color Scripter
|
BaseLoaderCallback
baseLoaderCallback 메서드를 이용하여, OnManagerConnected 초기화가 완료되면, UI 스레드에서 콜백이 호출된다.
아 콜백을 호출하기 전에 OpenCV 호출을 사용하거나 OpenCV 종속 네이티브 라이브러리를 로드할 수 없다. 이 메서드로 성공적으로 OpenCV 를 초기화 한 후 OpenCV 에 의존하는 고유한 고유 라이브러리를 로드해야 한다.
기본적인 BaseLoaderCallback 구현은 초기화에 실패한 경우 애플리케이션 컨텍스트를 처리하고 종료하기 위해 Activity f를 호출한다.
https://docs.opencv.org/3.4/d3/d63/classcv_1_1Mat.html
openCV 에서의 Mat 이란?
https://webnautes.tistory.com/1169
OpenCV 에서는 Mat 객체에 이미지를 숫자로 저장한다.
-
세 개의 숫자로 이루어진 순서쌍이 들어있는 하나의 작은 사각형을 픽셀이라고 부릅니다.
-
세 개의 숫자는 각각 하나의 픽셀을 구성하는 Blue, Green, Red 3개의 채널 값을 의미합니다.
-
한 채널에 8비트씩해서 각각 0~255 까지의 값을 가질 수 있습니다.
-
OpenCV에서는 메모리상의 Mat 객체에 저장할 때나 HighGUI를 이용해서 화면에 이미지를 보여줄 때 Blue, Green, Red 채널 순으로 처리합니다.
즉, 안드로이드의 카메라에서 가져온 이미지에 어떤 처리를 하기 위해서는, 이미지를 Mat 객체에 담아야한다는 뜻이다.
예를 들어 픽셀값이 (0,0,255) 인 경우 red 채널만 255이므로 해당 픽셀은 빨간색이 되며, 픽셀값이 (255,0,0)인 경우에는 blue 채널만 255이므로 해당 픽셀은 파란색이 됩니다
픽셀들은 격자상에 위치하게 되는데 모든 픽셀은 (y, x) 좌표를 가집니다. ( OpenCV에서는 (y,x)이지만 API에 따라 (x,y)인 경우도 있습니다. )
Mat 객체에 저장되어 있는 이미지와 HIghGUI 모듈을 이용해 화면에 보여지는 픽셀의 위치는 1:1로 매칭됩니다.
OpenCV에서는 화면에 보여줄 때 픽셀값이 BGR 순서를 가져야 원한 색이 화면에 보입니다.
API에 따라서는 RGB 순서를 요구하는 경우도 있습니다.
화면 출력시 요구하는 채널 순서를 따르지 않는 이미지를 화면에 보여주면 색이 다르게 보일 수 있습니다.
화면에 보여주는 API에 따라 적절하게 변환 처리해주는게 중요합니다.
RGB 색공간(color space)에서는 이미지 상에서 원하는 색을 추출하기 위해서 정확하게 범위를 정하는 게 어렵습니다.
Red, Green, Yellow의 색 조합으로 색이 결정되기 때문입니다. 그래서 보통 HSV 색공간 으로 변환하여 이미지에서 원하는 색을 추출합니다.
이제 Mat 객체에 저장된 이미지의 픽셀값을 가져오거나 픽셀값을 수정하는 방법에 대해 알아보자.
이제 Mat 객체에 저장된 이미지의 픽셀값을 가져오거나 픽셀 값을 수정하는 방법을 소개합니다.
많이 사용하는 방법에는 at, ptr, data 3가지 정도가 있습니다.
OpenCV에서 이미지의 전체 픽셀을 스캔하기 위해서는 다음 처럼 y좌표 루프를 먼저 적고 다음에 x좌표 루프를 적어야 최적화된 성능을 보입니다.
y좌표의 범위는 0 ~ 이미지의 높이( img_color.rows -1)이고 x좌표의 범위는 0 ~ 이미지의 너비(img_color.cols - 1)입니다.
1
2
3
4
5
6
7
8
9
10
|
int height = img_color.rows;
int width = img_color.cols;
for (int y = 0; y < height; y++) {
for (int x = 0; x < width; x++) {
. . . . . . . . . . . . . . . . . . . . . .
}
}
http://colorscripter.com/info#e" target="_blank" style="color:#e5e5e5text-decoration:none">Colored by Color Scripter
|
'Android' 카테고리의 다른 글
[Android] 안드로이드 - Kotlin 으로 OpenCV 사용하기 (0) | 2019.12.17 |
---|---|
[Android] 안드로이드 - openCV 에서 Camera2 api 를 지원한다 (0) | 2019.12.17 |
[Android] 안드로이드 - openCV 참고 링크 (0) | 2019.12.17 |
[Android] 안드로이드 - openCV 를 안드로이드에서 사용하는 방법 참고 사이트 (0) | 2019.12.16 |
[Android] 안드로이드 - openCV 란 무엇인가 (0) | 2019.12.16 |