2014-03-31 33 views
0

我想對從android設備攝像頭捕獲的圖像進行預處理。需要建議:從相機處理彩色圖像; Android的; OpenCV的; NDK; C++

我可以描述我的應用程序的屍身這樣:

1)Java的一部分。

// Getting preview from camera. 
    public void onPreviewFrame(byte[] arg0, Camera arg1) { 
    if (imageFormat == ImageFormat.NV21) { 
      frameData = arg0; // private byte[] frameData = null; 
     } 
    } 
    // ... 
    // After some code - call native function. 
    ImageProcessing(width, height, frameData, output); // private int[] output= null; 
    // Setting output to bitmap, etc... 
    MyCameraPreview.setImageBitmap(bitmap); // Dislplay, etc... 

2.)C++部分。 ImageProcessing

extern "C" 
jboolean huge_prefix_ImageProcessing(
      JNIEnv* env, 
      jobject thiz, 
      jint width, 
      jint height, 
      jbyteArray frameData, 
      jintArray output) 
    { 
     jbyte* pFrameData = env->GetByteArrayElements(frameData, 0); 
     jint* pOutput = env->GetIntArrayElements(output, 0); 

     Mat gray(height, width, CV_8UC1, (unsigned char *)pFrameData); 
     // Some processing and writing gray to result. 
     // ... 
     return true; 
    } 

一切都適用於灰度圖像。但是現在我需要執行RGB圖像的處理。有人能以正確的方式給我一個建議嗎?我做了幾次嘗試:

  • ImageProcessing函數內部將pFrameData轉換爲rgb格式(來自nv21)。
  • 在函數onPreviewFrame中,將nv21更改爲RGB_565,並在圖像容器中進行了其他更改。
+1

你沒有使用CvCameraViewFrame和onCameraFrame? http://docs.opencv.org/doc/tutorials/introduction/android_binary_package/dev_with_OCV_on_Android.html – auselen

+0

沒有,我無論如何也不能使用它。但我現在會嘗試。 – str14821

+0

因爲當我玩它時,灰色和RGB使用非常微不足道,所以我建議使用它們。 – auselen

回答

2

你有沒有嘗試過這樣的事情? (從你的JNI包裝器中調用)

void convertYUV(int width, int height, jbyteArray yuvArray) { 

    // Get the data from JEnv. 
    signed char *data = JNIEnvInfo::getInstance()->getJNIEnv()->GetByteArrayElements(yuvArray, 0); 

    // Convert to Mat object. 
    Mat imgbuf(Size(width,height), CV_8UC4, (unsigned char*) data); 
    Mat img = imdecode(imgbuf, CV_LOAD_IMAGE_COLOR); 

    // 
    // Release the JNI data pointer. 
    JNIEnvInfo::getInstance()->getJNIEnv()->ReleaseByteArrayElements(yuvArray, (jbyte*) yuvArray, 0); 

    // ... do stuff with the Mat .. 

} 



Mat convertRGB(int width , int height , jintArray rgb8888) 
{ 

    // 
    int *rgb; 
    int i; 

    // 
    // Get the data from JEnv. 
    int *data = JNIEnvInfo::getInstance()->getJNIEnv()->GetIntArrayElements(rgb8888, 0); 

    // 
    // Copy the data. 
    for(i = 0; i < width * height; i++) { 
     rgb[i] = data[i]; 
    } 

    // 
    // Convert to mat object. 
    Mat imgbuf(Size(width,height), CV_8UC3, rgb); 
    Mat img = imdecode(imgbuf, CV_LOAD_IMAGE_COLOR); 

    // 
    // Release the JNI data pointer. 
    JNIEnvInfo::getInstance()->getJNIEnv()->ReleaseIntArrayElements(rgb8888, (jint*) rgb8888, 0); 

    return img; 
} 
+0

嗯,我試過這種方式,程序終止後imdecode。 – str14821

+1

我修正了一個錯誤,你現在可以試試,爲我工作。 –

+0

它幫助,謝謝。 – str14821