[JNI/NDK] Android Camera ( YUV420 to RGB, RGBA)

Author : 오늘도 내일도 퓨림노 / Date : 2011.06.06 20:42 / Category : before/Develop(Old)


광고 한번만 클릭 부탁드립니다^^

포스팅을 보시는 분들을 위해 노력 하는 블로거를 위하여! 부탁드립니다. 재미 삼아 포스팅을 정리하지만, 광고를 달아보았습니다. 얼마나 열심히 할 수 있을지...의문이지만요^^ 

Subject HashMap 사용법, (아니 중첩 arraylist 사용법)

최종수정일 : 2011.06.06

안녕하세요^^
 안드로이드에 Camera 를 공부하면서
(with JavaCV) 발생하는 문제점 입니다. 
이미지 프로세싱을 하기위해서는 OpenCV 이미지의 IplImage 형태로 변환을 하게 됩니다. 

Android Camera 의 영상YUV420 으로 되어있습니다. 
이를 RGB, RGBA 형태로 변환을, 그리고 data형의 변환을 합니다. (byte[] => IplImage) 로 변환!
by 퓨림노
 
(파일 출처가 기억이 안납니다. 죄송합니다.)

몇가지 주의 사항을 알려드리겠습니다. 

1. Android 에서 Image Processing 을 하기위해서, 아래와 같이 하면 되겠지? 라는 생각을 하면 안된다.

processImage(byte[] data, int width, int height) 에서 

 data[]  -> bgr[] -> IplImage -> ( Image Processing ) -> bgr[] -> data[] 의 순서대로 흘러가면

카메라의 영상이 변경이 되어있을 꺼라 생각 된다. 그러나 Android에 Camera를 이리저리 손대보아도 수정이 불가 하였다. 그래서 Document 를 찾아봐야하는데..안찾아봤네요!!!!!!( posting 하면서 느낀점...)

아무튼..Caemra 의 영상을 수정하여 되돌리기는 실패를 하였다.( 현재로서는...수정되면 고쳐야죠~!!)

테스트를 할때에는 Image processing 을 하고나서 결과이미지를 file 로 저장을 하여서 확인을 하였습니다. 
간단하게 소스를 공개 하겟습니다. 

[소스코드]

 
protected void processImage(byte[] data, int width, int height) {
		try {
			
			// Debug  Get Time1 
			DebugFIleIO.getInstance().newFile( "processImage_1", "_0");
			
			int size3 = width * height * 3;			
			byte bgr[] = new byte[size3];			
			IplImage ImgGray = cvCreateImage(cvSize(width, height), IPL_DEPTH_8U, 1 );
			IplImage ImgRGB = cvCreateImage(cvSize(width, height), IPL_DEPTH_8U, 3 );
			
			// test 1/2 size
			//IplImage ImgGray2 = cvCreateImage(cvSize(width/2, height/2), IPL_DEPTH_8U, 1 );
			
			
			VRConvert.vrBGRformYUV(bgr, data, width, height);
			ImgRGB.getByteBuffer().put(bgr); // IplImage <- bgr(byte)
			cvCvtColor( ImgRGB, ImgGray, CV_BGR2GRAY );
			
			// test 1/2 size
			//cvResize( ImgGray, ImgGray2 );
			
			DebugFIleIO.getInstance().newFile( "processImage_2", "_0");
			LSDMgr.getInstance().LsdImageProcessingonMobile( ImgRGB, ImgGray, width, height);

		} catch (Exception e) {
			Log.w("vbflash", "Exception - processImage()... ");
		}
		postInvalidate();
	}
vrBGRformYUV() 함수는 첨부파일에 있는 것을 사용하면 됩니다. ( 알아서 스샤샤샤!! )
그리고 'ㅅ'/ 뭐 딱히 더 드릴 이야기는 없습니다.
물론 요까지 하신다면 알아서 척척 하실 수 있을꺼라 생각됩니다.

(이것도 URL 을 잘 모르겠네요...T_T)

참 포스팅을 끝내려고하니깐, 당연히 알아두어야 하는 것이 있지 않습니까!?
카메라를 Image Processing 을 하였는데 Camera 에는 결과 출력을 해야하지 않겠습니까!?

MFC처럼 OnDraw() 함수에 출력만 해주면 됩니다.
물론 Android 에서 Camera 를 사용하는 방법은 여러가지가 있는데, 위의
processImage() 함수가 호출이 되지 않던가?
아니면 Draw() 가 안되는 경우가 발생하게 됩니다. 물론 위에 압축파일을 실행해서 보시면 알꺼라 생각합니다.

카메라의 구조를 각각의 class 로 뽑으려고 하였으나, 생각처럼 안되네요...(위의 소스는 인터넷에서 추출한 소스입니다.

[소스코드]


protected void onDraw(Canvas canvas) {

// ...

		Paint paint = new Paint();
		paint.setColor(Color.RED);

		String s = "JavaCV for Android";
		float textWidth = paint.measureText(s);
		int w = getWidth();
		int h = getHeight();
		
		canvas.drawText(s, (getWidth() - textWidth) / 2, 20, paint);
		
		Paint pntR = new Paint();
		pntR.setColor( Color.YELLOW );
		pntR.setStrokeWidth(5);
//... draw ...
//... draw ...

}

전 이글을 보는 당신보다 한발짝 더 나아가고 싶습니다. !! 

Tags : , , , , , , ,

Trackbacks 트랙백0 / Comments 5

Blog Information

퓨림노

블로그에 공부 및 취미 등 다양한 내용으로 포스팅 예정입니다~^^ 오랫동안 사용한 블로그인 만큼!! 다시 시작합니다~^^

Search

Statistics

  • Total : 468,357
  • Today : 75
  • Yesterday : 43

Archives

Copyright © http://vbflash.net All Rights Reserved
Designed by CMSFactory.NET