2012-03-22 26 views
1

我正在使用OpenCV 2.3.1庫的FaceDetect Android應用程序。我找到了一些代碼,可以讓我在 上製作我的三星GT-P1000的照片並將其保存在圖庫中。然後我想從圖庫中選擇 ,它允許.cpp文件使用OpenCV 函數。這需要一個位圖到IplImage的轉換(下面添加.java 和.cpp代碼片段)。將IplImage顯示爲Android位圖

Java代碼看起來是這樣的:

Bitmap bitmap = BitmapFactory.decodeFile(mCurrentImagePath); 
Log.i(TAG, mCurrentImagePath); 
int width = bitmap.getWidth(); 
int height = bitmap.getHeight(); 
int[] pixels = new int[width * height]; 
bitmap.getPixels(pixels, 0, width, 0, 0, width, height); 
opencv.setSourceImage(pixels, width, height); 
byte[] imageData = opencv.getSourceImage(); 
bitmap = BitmapFactory.decodeByteArray(imageData, 0, 
imageData.length); 
mImageView.setImageBitmap(bitmap); 

的C++代碼看起來是這樣的:

IplImage * pImage = NULL; 
IplImage * loadpixels(int * pixels, int width, int height); 
IplImage * getIplImageFromIntArray 
    (JNIEnv* env, jintArray array_data, jint width, jint height); 

JNIEXPORT jboolean JNICALL Java_org_opencv_example_pruts_Test1OpenCV_setSourceImage 
    (JNIEnv * env, jobject thiz, jintArray photo_data, jint width, jint height) 
{ 
    if(pImage != NULL) 
    { 
     cvReleaseImage(&pImage); 
     pImage = NULL; 
    } 

    pImage = getIplImageFromIntArray(env, photo_data, width, height); 
    if(pImage == 0) 
    { 
     return 0; 
    } 

    return 1; 
} 

但是我需要其中的IplImage 轉換爲位圖數據的另一個JNIEXPORT功能。因此最後4行代碼將被使用。應該填充imageData以便BitmapFactory可以解碼它。我遇到了很多示例,這些代碼片段也來自這些代碼片段。然而,我無法找到解決我的問題的方法。有沒有人有一些建議?

回答

4

看來你打算使用壓縮格式,它是可行的,但很複雜。 這裏我給出一個使用未壓縮數據的解決方案。 由於android中的位圖基本上是rgba格式,所以您可以直接使用IplImage數據創建位圖,除了字節對齊問題。

JNIEXPORT jintArray JNICALL Java_org_opencv_example_pruts_Test1OpenCV_getSourceImage 
    (JNIEnv * env, jobject thiz){  
    if(pImage == 0) 
    { 
     return NULL; 
    } 

    int len = pImage->width * pImage->height * 4; 
    jintArray rgbaData = env->NewIntArray(len); 
    if(pImage->nChannels == 4){ 
     env->SetIntArrayRegion(rgbaData,0,len,(jint*)pImage->imageData); 
    }else if(pImage->nChannels == 3){ 
     IplImage* t = cvCreateImage(cvGetSize(pImage),8,4); 
     for(int h = 0; h< pImage->height; h++){ 
      char* pt= t->imageData + h * t->widthStep; 
      char* pImg = pImage->imageData+ h * pImage->widthStep; 
      for(int w =0 ; w < pImage->width; w++){ 
       memcpy(pt,pImg,3); 
       pt[3] = 255;//alpha 
       pt+=4; 
       pImg += 3; 
      } 
     } 
     env->SetIntArrayRegion(rgbaData,0,len,(jint*)t->imageData); 
     cvReleaseImage(&t); 
    }else { 
     // if pImage -> nChannels == 1 , handle it in the way you prefer 
     // I donot think your image is gray ,so forget about this situation 
    } 

    cvReleaseImage(&pImage); 
    return rgbaData; 
} 

和Java代碼應該是這樣的:

int[] imageData = opencv.getSourceImage(); 
bitmap = Bitmap.createBitmap(imageData, 0, width,width, height, Config.ARGB_8888); 
+0

代碼沒有測試 – zhijie 2012-03-22 10:13:33