2014-12-31 3 views
2

Android 용 openCV의 새로운 기능이며 백그라운드에서 작동하는 이미지 처리 (이미지 줄 감지)를 수행하는 앱이 필요합니다.백그라운드에서 Android 카메라 OpenCV

나는 이미 내가 (JNI 포함) 필요한 모든 이미지 처리를 수행 응용 프로그램을 만들었습니다하지만 백그라운드에서 작동하지 않고는

(내가 생각하는 서비스에서 작동하지 않습니다) CvCameraViewListener2를 사용

내가 가장 좋은 방법은 surfacetexture가있는 서비스를 만드는 것이지만 이미 검색 한 내용은 이해할 수 없습니다. (이미 파노라마 효과를 보았습니다.)

그럼 서비스에서 (CvCameraViewListener2로) 수행 한 작업을 백그라운드로 작업 할 수 있습니까? 아니면 surfacetexture로 0에서 모든 것을해야합니까?

미리 감사드립니다.

답변

1

저는 OpenCV 및 Android Camera로 작업했습니다. 그것은 시작하기가 그렇게 어렵지 않습니다. 프레임을 처리하기 위해 JNI를 사용했습니다. 당신이해야 할 일들.

  • 사용 android.hardware.Camera
  • OnPreviewFrame 방법의 SurfaceHolder.Callback 및 Camera.PreviewCallback

를 확장하는 클래스를 작성하는 것 아마 NV21의 형식 (byte[] 데이터를 얻을 수 YUV) RGBA로 변환하거나 필요에 맞게 변환해야합니다. 프레임 데이터를 얻은 후에는 UI 스레드를 방해하지 않도록 프레임을 처리 할 백그라운드 스레드를 만들어야합니다.


private class ProcessPreviewDataTask 
     extends 
      AsyncTask<byte[], Void, Boolean> { 

    @Override 
    protected Boolean doInBackground(byte[]... datas) { 
     mState = STATE_PROCESS_IN_PROGRESS; 
     Log.i(TAG, "background process started"); 
     byte[] data = datas[0]; 

     /* JNI Call here */ 

     mCamera.addCallbackBuffer(data); 
     mProcessInProgress = false; 
     return true; 
    } 

    @Override 
    protected void onPostExecute(Boolean result) { 
     mState = STATE_PROCESS; 
     threadInProcess = false; 
    } 
} 

@Override 
public void onPreviewFrame(byte[] data, Camera camera) { 
    if (data == null) { 
     Log.i(TAG, "data is null"); 
     return; 
    } 

    int expectedBytes = previewWidth * previewHeight * 
      ImageFormat.getBitsPerPixel(ImageFormat.NV21)/8; 

    if (expectedBytes != data.length) { 
     Log.e(TAG, "Mismatched size of buffer! Expected "); 

     mState = STATE_NO_CALLBACKS; 
     mCamera.setPreviewCallbackWithBuffer(null); 
     return; 
    } 

    if (mProcessInProgress) { 
     mCamera.addCallbackBuffer(data); 
     return; 
    } 

    if (mState == STATE_PROCESS) { 
     mProcessInProgress = true; 

     processDataTask = new ProcessPreviewDataTask(); 
     processDataTask.execute(data); 

    } else { 
     mCamera.addCallbackBuffer(data); 
     return; 
    } 

} 

난 당신이 사용할 수있는 샘플 코드가 있습니다. 당신은 그것을 here 찾을 수 있습니다.

+0

나는이 개 프로그램이 하나 개 더 질문 .. 있습니다 1 - 않는이 이미지 처리 물건 2 - 나는 2 프로그램을 만들기 위해 1을 호출하는 필요한 다른 물건 않는 또 다른 하나 (아무 것도 보이지 않고 프로그램 2가 계속 작동하기 때문에 서비스처럼) 그래서 정말로 필요한 것은 프로그램 1입니다. 그래서 프로그램 1 서비스를 호출하는 프로그램 2를 실행 한 다음 program2가 닫히면 서비스 1을 닫습니다. 이 프로그램을 어떻게 서비스로 만들 수 있습니까? –

+0

정말 혼란 스럽습니다. 이미지 처리 부분을 서비스로 실행하고 싶습니까? 이미지 처리 만 포함하거나 카메라에 액세스하는 것도 포함됩니까? 내가 만든 앱은 비슷한 기능을합니다. 긴 노출 사진을 만듭니다. 따라서 사용자가 시작 버튼을 누르면 이미지 처리 부가 시작되고 사용자가 중지 버튼을 누르면 중지됩니다. 또한 거기에 일시 중지 및 다시 시작 기능이 포함되어 있습니다. 비슷한 것을 찾고 계십니까? – Froyo

+0

카메라에 액세스하여 이미지 처리 작업을 수행하는 앱이 필요합니다. (실시간 처리) 다른 앱이 다른 작업을하는 동안 해당 앱/서비스 또는 그와 유사한 작업을 계속해야합니다. –

관련 문제