안녕하세요!
한가위 잘 보내셨는지요
제가 이번에 안드로이드로 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);
}
}