2017-09-21 22 views
0

i.MX6 및 Android 4.4를 사용하여 실시간으로 감지 한 카메라 및 회선을 표시하려고합니다. 안드로이드 카메라 인 .addCallbackBuffer를 사용하여 프레임을 가져오고 TextureView를 사용하여 카메라 미리보기를 표시합니다.TextureView를 사용하여 카메라 미리보기와 감지 된 선을 동시에 표시 할 수 있습니까?

JNI (C++) 이미지 처리를 수행하는 데 사용되었다 OpenCV보다> 바이트 [] Mat-로 변환> 프레임 buffer- 얻을

JNI 매트를 반환 할 수

이미 위에 선을 그리는 (.getNativeObjAddr()를 사용) 또는 라인의 시작과 끝 지점 인 두 좌표를 반환하십시오.

이 코드는 JNI의 새로운 매트이며 두 좌표를 반환하기를 바랍니다. 이 메소드가 작동하지 않으면 Java에서 Mat를 새로 작성하고 .getNativeObjAddr()을 JNI로 보낸 다음 Mat를 리턴하십시오. TextureView에서 매트 보이기?

질문 : TextureView를 사용하여 카메라 미리보기와 감지 된 라인을 동시에 표시하는 방법은 무엇입니까?

getFrameThread에서
public class MainActivity extends Activity implements TextureView.SurfaceTextureListener, PreviewCallback { 
protected Camera mCamera; 
private TextureView mTextureView; 
public byte[][] cameraBuffer; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    this.requestWindowFeature(Window.FEATURE_NO_TITLE); 
    setContentView(R.layout.activity_main); 

    mTextureView = new TextureView(this); 
    mTextureView.setSurfaceTextureListener(this); 
    setContentView(mTextureView); 
} 
.... 
@Override 
public void onSurfaceTextureAvailable(SurfaceTexture surface, int width, int height) { 
    mCamera = Camera.open(0); 
    int bufferSize = mCamera.getParameters().getPictureSize().width * mCamera.getParameters().getPictureSize().height 
      * ImageFormat.getBitsPerPixel(mCamera.getParameters().getPreviewFormat())/8; 
    cameraBuffer = new byte[3][bufferSize]; 

    thread = new getFrameThread(this, kCameraWidth, kCameraHeight); 
    for (int i = 0; i < 3; ++i) 
     mCamera.addCallbackBuffer(cameraBuffer[i]); 

    mCamera.setPreviewCallbackWithBuffer(this);    
    thread.start(); 

    if (mCamera == null) { 
     throw new RuntimeException("Default camera not available"); 
    } 
    try { 
     mCamera.setPreviewTexture(surface); 
     mCamera.startPreview(); 
    } catch (IOException ioe) { 
     // Something bad happened 
    } 
} 

@Override 
public void onPreviewFrame(byte[] data, Camera camera) { 
    // TODO Auto-generated method stub 
    camera.addCallbackBuffer(data);//callback data to cameraBuffer 
    thread.refresh(data, countFrame);//send new frame data to JNI 
} 
.... 
static { 
    System.loadLibrary("opencv_java"); //load opencv_java lib 
    System.loadLibrary("testLib"); 
} 
public native void getRawFrame(byte[] data,int width, int height, int count); 

} 

이 (스레드 JNI 기능 'getRawFrame'를 실행) JNI에서

public class getFrameThread extends Thread{ 
    public byte[] data; 
    { 
    ..... 
    mainActivity.getRawFrame(data, 480, 720); 
    ..... 
    } 

    public void refresh(byte[] data, int countFrame){ 
     this.data = data; 
    } 
} 

#include <jni.h> 
#include <stdio.h> 
#include <stdlib.h> 

#include <opencv2/opencv.hpp> 
using namespace cv; 

extern"C" 
{ 
..... 
JNIEXPORT void JNICALL Java_com_example_adas_MainActivity_getRawFrame(JNIEnv* env, jobject thisobject, 
    jbyteArray data, jint width, jint height){ 

    int length = env->GetArrayLength(data); 
    unsigned char *bufferIn = (unsigned char*) env->GetPrimitiveArrayCritical(data, NULL); 

    yuvMat = Mat(height * 3/2, width, CV_8UC1, bufferIn); 
    cvtColor(yuvMat, grayMat, cv::COLOR_YUV2GRAY_I420); 


    //Do lines detected 
    ..... 
    env->ReleasePrimitiveArrayCritical(data, bufferIn, JNI_ABORT); 
} 

답변

0

당신은 카메라 라이브 TextureView를 오버레이 할 수 MainActivity.java에서

이미지보기에서는이 이미지를 부분적으로 투명하게 유지하는 것이 좋습니다. 그러나 이것은 증강 현실을위한 좋은 해결책이 아닙니다. 그 이유는 OpenCV에서 생성 된 컨텐츠가 지연되기 때문입니다. 이 지연은별로 중요하지 않지만 사용자에게는 매우 불편할 수 있습니다.

라이브 카메라 스트림을 숨기고 OpenCV 처리로 변경된 이미지 (onPreviewFrame())를 표시하면 결과가 훨씬 좋습니다. 화면에 표시된 AR은 (카메라 라이브 뷰에 비해) 몇 밀리 초 지연되지만 장면은 감지 된 라인과 일치합니다. 이 blog post에서 좋은 예 (상세한 프로그래밍 지침)를 발견했습니다.

Android Camera API는 onPreviewFrame() 콜백을 수신 할 실시간 미리보기가 있어야하므로 TextureView가 필요합니다. 이것을 숨기려면 다른 뷰와 오버레이하거나 OpenGL 수준에서 텍스처를 조작 할 수 있습니다.

OpenGL을 사용하여 OpenCV의 결과를 표시 할 수도 있습니다. 종종 이러한 워크 플로의 성능이 다른 방법으로 이미지를 표시하는 것보다 훨씬 낫습니다.

OpenCV 처리 결과 인 비트 맵이 아닌 OpenGL을 사용하여 카메라 미리보기를 별도의 질감으로 사용할 수도 있습니다.

+0

감사합니다. OpenCV의 결과를 표시하는 OpenGL을 시도해 보겠습니다. –

+0

OpenCV의 결과를 표시하기 위해 OpenGL을 사용하는 힌트 또는 기능을 제공 할 수 있습니까? 감사. –

+0

[graphika] (https://github.com/google/grafika)를 Android 카메라와 OpenGL 관계를 배우기위한 좋은 출발점으로 추천 할 수 있습니다. 이 [article] (http://www.anandmuralidhar.com/blog/android/corners/)도 유용 할 것입니다. 그것은 내 요점을 보여줍니다 : 전체 흐름이 약간 지연 되더라도 빨간 점이 화면의 올바른 픽셀에 고정됩니다. –