2012-03-22 13 views
1

私はOpenCV 2.3.1ライブラリを使用しているfacedetect Androidアプリケーションで作業しています。私は 私のサムスンGT - P1000の写真を作ってギャラリーに保存できるいくつかのコードを見つけました。次に、.cppファイルがOpenCV 機能を使用できるようにギャラリーからの画像を に選択します。これには、ビットマップからIplImageへの変換が必要です(.java と.cppコードスニペットが下に追加されています)。AndroidビットマップとしてIplImageを表示

は、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行のコードが使用されます。 BitmapFactoryでデコードできるように、imageDataを埋め込む必要があります。私はサンプルを読み込みました。これらのコードスニペットも同様です。しかし私は私の問題の解決策を見つけることができません。誰か提案がありますか?

答えて

4

圧縮された形式を使用していると思われますが、それは実行可能ですが複雑です。 ここでは、非圧縮データを使用したソリューションを提供します。 アンドロイドのビットマップは基本的に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

関連する問題