2011-09-23 8 views
1

opencv를 사용하여 android 비트 맵을 grescale로 변환하는 데 opencv를 사용하고 있습니다. 아래 코드는 제가 사용하고있는 코드입니다.그레이 스케일 Iplimage to android 비트 맵

  IplImage image = IplImage.create(bm.getWidth(), bm.getHeight(), IPL_DEPTH_8U, 4); //creates default image 
     bm.copyPixelsToBuffer(image.getByteBuffer()); 
     int w=image.width(); 
     int h=image.height(); 
      IplImage grey=cvCreateImage(cvSize(w,h),image.depth(),1); 
      cvCvtColor(image,grey,CV_RGB2GRAY); 

bm은 원본 이미지입니다. 이 코드는 잘 작동하고 그레이 스케일로 변환됩니다, 나는 그것을 sdcard에 저장하고 다시로드하여 테스트했습니다.하지만 아래의 메소드를 사용하여로드하려고하면 내 앱이 중단되고 모든 제안 사항이 표시됩니다.

   bm.copyPixelsFromBuffer(grey.getByteBuffer()); 
       iv1.setImageBitmap(bm); 

iv1은 bm을 설정하려는 이미지 뷰입니다.

답변

0

Android 용 OpenCV 바인딩을 사용 해 본 적이 없지만 시작하려면 몇 가지 코드가 필요합니다. 의사 코드로 생각해보십시오. 시도 할 수 없기 때문에 ...하지만 기본적인 아이디어를 얻을 수 있습니다. 가장 빠른 솔루션이 아닐 수도 있습니다. this answer에 붙여 넣습니다.

public static Bitmap IplImageToBitmap(IplImage src) { 
    int width = src.width; 
    int height = src.height; 
    Bitmap bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888); 
    for(int r=0;r<height;r++) { 
     for(int c=0;c<width;c++) { 
      int gray = (int) Math.floor(cvGet2D(src,r,c).getVal(0)); 
      bitmap.setPixel(c, r, Color.argb(255, gray, gray, gray)); 
     } 
    } 
    return bitmap; 
} 
+0

이것은 좋지만 속도가 너무 느립니다 ... 800x600 이미지의 경우 최대 5 초가 걸립니다. 빠른 솔루션? –

+0

성능이 중요한 코드의 경우 기본으로 돌아갈 방법이 없습니다. 이 제품은 조금 오래되었지만이를 수행하는 방법을 보여줍니다. http://www.ibm.com/developerworks/opensource/tutorials/os-androidndk/. – bytefish

-1

귀하의 IplImage grey은 하나 개의 채널을 가지고, 그리고 Bitmap bm 4 또는 3 (ARGB_8888, ARGB_4444, RGB_565)가 있습니다. 따라서 bm은 그레이 스케일 이미지를 저장할 수 없습니다. 사용하기 전에 이것을 rgba로 변환해야합니다.

예 : (코드)

IplImage image = IplImage.create(bm.getWidth(), bm.getHeight(), IPL_DEPTH_8U, 4); 
bm.copyPixelsToBuffer(image.getByteBuffer()); 
int w=image.width(); int h=image.height(); 
IplImage grey=cvCreateImage(cvSize(w,h),image.depth(),1); 
cvCvtColor(image,grey,CV_RGB2GRAY); 

당신이 그것을로드 할 경우 를 내가 수 (당신은 당신의 image를 재사용하거나 다른 (temp) 만들 수 있습니다)

IplImage temp = cvCreateImage(cvSize(w,h), IPL_DEPTH_8U, 4); // 4 channel 
cvCvtColor(grey, temp , CV_GRAY2RGBA); //color conversion 
bm.copyPixelsFromBuffer(temp.getByteBuffer()); //now should work 
iv1.setImageBitmap(bm); 

을 도움이 될 것입니다!

관련 문제