현재 나만의 프로젝트 생성으로 OpenCV 를 import 하여 영상처리할 수 있는 환경을 구축하지는 못했다.
대부분의 블로그들이 OpenCV 샘플코드를 이용하여 개발환경이 되었다고 하였는데 이는 완벽한 환경이 아니지 않나..?
나중에 알게되면..포스팅을하겠지만 자료가 너무나도 부족해 일단은
샘플코드를 분석해본다.
native 코드가 포함된 샘플소스인 tutorial 2 Advanced - 1.Add Native OpenCV 프로젝트를 사용해보았다.
개인적으로 opencv라이브러리를 include 하면 경로문제로 힘들었는데 이 샘플에선 문제없나보다..
일단 기본적인 native 함수 원형 생성은 넘어가겠다..
내용에 있어서 보아하니 Mat 구조체를 쓰나보다....
주로 Opencv2.1에서 벗어나지 못하다가 최근 버전업을 해보았는데
방금 알아보니 이미지 픽셀데이터 접근방식이 벡터방식(C++) 로 바뀌었다고 한다....
Mat 구조체의 접근방식을 알아봐야한다.
#include <jni.h> using namespace std; extern "C" { (JNIEnv* env, jobject thiz, jint width, jint height, jbyteArray yuv, jintArray bgra) //_bgra int형 배열로부터 8bit 4채널로 바꿔 mbgra라는 Mat 구조체 //_bgra int형 배열로부터 8bit 1채널로 바꿔 mbgra라는 Mat 구조체 //Please make attention about BGRA byte order //일부 CV_YUV420sp2BGR이 안먹힌다. sp를 i로 바꿔서 해도 무방할듯..? vector<KeyPoint> v; FastFeatureDetector detector(50); //특징점 추출 함수 호출
//픽셀데이터 접근 추가사항(본인이 추가한 내용이다.) for(int co=0; co<mbgra.cols; co++) }
//메모리 해제 env->ReleaseIntArrayElements(bgra, _bgra, 0); } |
정확하지 않고 구글링과 개인적인 추측으로만 위 코드를 해설하자면,,,, jbyte* 와 jint* 는 포인터형으로 들어온 배열로부터 각 요소들을 참조하여 각각 _yuv, _bgra 를 만들었다. Mat 형 구조체를 만들어 들어온 data[]와 rgba[] 주소를 참조하게 정의하였다. Mat 함수형은 아주 많은 오버로딩이 되어있었다.. myuv는 입력데이터 주소를 읽어 1채널로 만든것이고 mbgra는 4채널 8bit로 최종데이터 int형 배열 주소를 참조하도록하였다. (비어있는 상태) cvtColor 함수를 사용하여 myuv데이터를 YUV상태에서 BGR 체계로 변환한다. (4채널이다.) 변환 결과데이터는 mbgra에 넣도록 하였다. vector 선언하고 detector을 이용하여 특징점을 추출한다. v.size만큼 돌면서 v[벡터 인덱스] 의 포인터를 중심으로 서클을 그려준다. 추가로 픽셀데이터에 접근을 하는 방법을 찾아보았다. Mat image 가 선언되었다는 가정하에. 주로 쓰이는 방법으로는 image.at<Vec3b>(x,y)[0] //B image.at<Vec3b>(x,y)[1] //G image.at<Vec3b>(x,y)[2] //R 내가 이전에 데이터에 접근하는 방식과 유사한 방법으로 보인다. 아직 이방법은 확인을 못했다. 화면이 정상적으로 안나오는데 이것때문인지는 확인못했다.
|
간단한 샘플소스 + 이미지 데이터 접근으로
<기본 샘플을 안드로이드에서 돌려봤을때이다.>
<위 소스에서 필자가 추가한 데이터에서 Blue값을 255로 주었을 때 화면이다.>
'Android' 카테고리의 다른 글
[JNI] JNI 형식 및 데이터 구조 (0) | 2012.07.03 |
---|---|
[JNI] GetByteArrayElements (0) | 2012.07.03 |
Eclipse에서 JavaCV 설치/사용 (4) | 2012.06.10 |
카메라 뷰와 촬영 예제 (3) | 2012.06.07 |
Android + NDK + OpenCV (0) | 2012.06.01 |