2012-03-22 5 views
1

OpenCV 2.3.1 라이브러리를 사용하는 facedetect Android 응용 프로그램에서 작업하고 있습니다. 나는 내 삼성 GT-P1000 에 사진을 찍어 갤러리에 저장하는 코드를 발견했다. 그런 다음 갤러리에서 이미지를 선택하여 .cpp 파일에서 OpenCV 기능을 사용할 수 있도록 이미지를 으로 선택합니다. 이를 위해서는 비트 맵에서 IplImage 변환이 필요합니다 (.java 및 .cpp 코드 스 니펫이 아래에 추가됩니다).IplImage를 Android 비트 맵으로 표시

자바 코드는 다음과 같다 :

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; 
} 

그러나 I 비트 맵 데이터에 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; 
} 

그리고 자바 코드는 다음과 같아야합니다

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

코드를 테스트하지 – zhijie

관련 문제