마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

카메라로 받은 bitmap을 ImageView에 출력하는 문제입니다.

0 추천

안녕하세요!
한가위 잘 보내셨는지요

제가 이번에 안드로이드로 jni/ndk 이용해서 opencv로 영상처리를 하려고합니다.

일단 안드로이드에서 yuv값을 받아서 ndk로 비트맵을 보내서 c로 처리한후에 안드로이드에서는 이 처리값을 받아서 이미지뷰에 뿌려주려고 합니다.

그런데 메인 엑티비티에서는 setContentView가 surface로 잡혀있는데 어떻게 이걸 이미지뷰에 또 뿌려줄까요?
안드로이드 완전 초보라서 이것저것 계속 찾아보다가
선배님들께 조언부탁드립니다.

아래에 코드 넣어보았습니다.
코드중에 틀린것있으면 지적 달게 받겠습니다.

읽어주셔서 감사합니다! 꾸벅

===========================================================================================

안드로이드 부분

package org.opencv.samples.tutorial2;

import java.io.IOException;
import java.util.List;

import android.app.Activity;
import android.content.Context;
import android.graphics.Bitmap;
import android.hardware.Camera;
import android.hardware.Camera.Size;
import android.os.Bundle;
import android.util.AttributeSet;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.widget.ImageView;

public class Tutorial2Activity extends Activity {
 MyCameraSurface mSurface;
 ImageView mImgView;

 public void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);

  setContentView(R.layout.imageview_layout);
 }
}

// 미리보기 표면 클래스
class MyCameraSurface extends SurfaceView implements SurfaceHolder.Callback {
 SurfaceHolder mHolder;
 Camera mCamera;
 Tutorial2Activity mainActivity;
 Bitmap prBitmap;

 public MyCameraSurface(Tutorial2Activity context) {
  super(context);
  
  mainActivity = context;
  
  mHolder = getHolder();
  mHolder.addCallback(this);
 }

 // 표면 생성시 카메라 오픈하고 미리보기 설정
 public void surfaceCreated(SurfaceHolder holder) {
  mCamera = Camera.open();
  try {
   mCamera.setPreviewDisplay(mHolder);
   mCamera.setPreviewCallback(new Camera.PreviewCallback() {
    
    @Override
    public void onPreviewFrame(byte[] data, Camera camera) {
     Camera.Parameters param = camera.getParameters();
     int width = param.getPreviewSize().width;
     int height = param.getPreviewSize().height;
     
     prBitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
     
     FindFeatures(height, width,data, prBitmap);
     System.out.println(prBitmap);
     
     mainActivity.mImgView.setImageBitmap(prBitmap);
//     mainActivity.setContentView(R.layout.imageview_layout);
    } 
   });
  } catch (IOException e) {
   mCamera.release();
   mCamera = null;
  }
 }

    // 표면 파괴시 카메라도 파괴한다.
 public void surfaceDestroyed(SurfaceHolder holder) {
  if (mCamera != null) {
   mCamera.stopPreview();
   mCamera.release();
   mCamera = null;
  }
 }

 // 표면의 크기가 결정될 때 최적의 미리보기 크기를 구해 설정한다.
 public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
  Camera.Parameters params = mCamera.getParameters();
  List<Size> arSize = params.getSupportedPreviewSizes();
  if (arSize == null) {
   params.setPreviewSize(width, height);
  } else {
   int diff = 10000;
   Size opti = null;
   for (Size s : arSize) {
    if (Math.abs(s.height - height) < diff) {
     diff = Math.abs(s.height - height);
     opti = s;
     
    }
   }
   params.setPreviewSize(opti.width, opti.height);
  }
  mCamera.setParameters(params);
  mCamera.startPreview();
 }
 
 public native void FindFeatures(int height, int width, byte in[], Bitmap prBitmap);
}

=========================================================================================

jni 부분

#include <jni.h>
#include <opencv2/core/core.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/features2d/features2d.hpp>
#include <vector>
#include <opencv/cv.h>
#include <opencv/highgui.h>
#include <opencv2/imgproc/imgproc_c.h>

using namespace std;
using namespace cv;

extern "C" {
JNIEXPORT void JNICALL Java_org_opencv_samples_tutorial2_Tutorial2Activity_FindFeatures
(JNIEnv* env, jobject, jint height, jint width, jbyteArray NV21FrameData, jintArray outPixels);

JNIEXPORT void JNICALL Java_org_opencv_samples_tutorial2_Tutorial2Activity_FindFeatures
(JNIEnv* env, jobject, jint height, jint width, jbyteArray NV21FrameData, jintArray outPixels)
{
  jbyte* _yuv  = env->GetByteArrayElements(NV21FrameData, 0);
  jint*  _bgra = env->GetIntArrayElements(outPixels, 0);

      Mat myuv(height + height/2, width, CV_8UC1, (unsigned char *)_yuv);
      Mat mbgra(height, width, CV_8UC4, (unsigned char *)_bgra);

     IplImage srcImage = myuv;
     IplImage dstImage = mbgra;

     cvCvtColor(&myuv, &mbgra, CV_YUV2BGR);
     cvCvtColor(&mbgra, &mbgra, CV_BGR2HSV);

     //메모리 해제
     env->ReleaseIntArrayElements(outPixels, _bgra, 0);
     env->ReleaseByteArrayElements(NV21FrameData, _yuv, 0);

}
}

 

익명사용자 님이 2014년 9월 11일 질문

답변 달기

· 글에 소스 코드 보기 좋게 넣는 법
· 질문에 대해 추가적인 질문이나 의견이 있으면 답변이 아니라 댓글로 달아주시기 바랍니다.
표시할 이름 (옵션):
개인정보: 당신의 이메일은 이 알림을 보내는데만 사용됩니다.
스팸 차단 검사:
스팸 검사를 다시 받지 않으려면 로그인하거나 혹은 가입 하세요.
...