2012-10-30 9 views
12

Próbuję tajnych matę do użytku Bitmap następujący kod:konwertować matę Bitmap OpenCV dla Androida

Bitmap bmp = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888); 
    Mat tmp = new Mat (width,height,CvType.CV_8UC1,new Scalar(4)); 
    try { 
    //Imgproc.cvtColor(seedsImage, tmp, Imgproc.COLOR_RGB2BGRA); 
    Imgproc.cvtColor(seedsImage, tmp, Imgproc.COLOR_GRAY2RGBA, 4); 
    Utils.matToBitmap(tmp, bmp);} 
    catch (CvException e){Log.d("Exception",e.getMessage());} 

mój seedsImage jest obiektem Mat. Wyjątek i otrzymałem: 10-09 22:15:09.418: D/Exception(2461): ..\..\modules\java\generator\src\cpp\utils.cpp:105: error: (-215) src.dims == 2 && info.height == (uint32_t)src.rows && info.width == (uint32_t)src.cols in function void Java_org_opencv_android_Utils_nMatToBitmap2(JNIEnv*, _jclass*, jlong, _jobject*, jboolean) Próbowałem przeszukać, ale dla mnie nie było rozwiązania. Czy anynon może pomóc?

+0

zmieniono na CV_8UC1 ale nadal dostaje błędy –

+0

z http: // stackoverflow. com/questions/17390289/convert-bitmap-to-mat-after-capture-image-using-android-camera - czy przyjrzałeś się metodzie Utils.matToBitmap (mat, bmp)? – user1689757

Odpowiedz

17

1) Konstruktor OpenCV Mat oczekuje zamiast pary <rows, cols> zamiast <width, height> jako argumentów. Więc trzeba zmienić drugą linię do

Mat tmp = new Mat (height, width, CvType.CV_8U, new Scalar(4)); 

2) Imgproc.cvtColor może zmienić wymiary obiektu tmp. Tak to jest bezpieczne, aby stworzyć bitmapę po konwersji kolorów:

Bitmap bmp = null; 
Mat tmp = new Mat (height, width, CvType.CV_8U, new Scalar(4)); 
try { 
    //Imgproc.cvtColor(seedsImage, tmp, Imgproc.COLOR_RGB2BGRA); 
    Imgproc.cvtColor(seedsImage, tmp, Imgproc.COLOR_GRAY2RGBA, 4); 
    bmp = Bitmap.createBitmap(tmp.cols(), tmp.rows(), Bitmap.Config.ARGB_8888); 
    Utils.matToBitmap(tmp, bmp); 
} 
catch (CvException e){Log.d("Exception",e.getMessage());} 
+0

Ciągle mam ten sam problem. Coś nie tak z konfiguracją bitmapy? –

4

Spróbuj kod maty do konwersji bitmap

**Mat mRgba; 
public void onCameraViewStarted(int width, int height) { 
     mRgba = new Mat(height, width, CvType.CV_8UC4); 
} 
public Mat onCameraFrame(Mat inputFrame) { 
    inputFrame.copyTo(mRgba); 
    return mRgba; 
} 
private void captureBitmap(){ 
     bitmap = Bitmap.createBitmap(mOpenCvCameraView.getWidth()/4,mOpenCvCameraView.getHeight()/4, Bitmap.Config.ARGB_8888); 
    try { 
      bitmap = Bitmap.createBitmap(mRgba.cols(), mRgba.rows(), Bitmap.Config.ARGB_8888); 
       Utils.matToBitmap(mRgba, bitmap); 
       mBitmap.setImageBitmap(bitmap); 
       mBitmap.invalidate(); 
    }catch(Exception ex){ 
      System.out.println(ex.getMessage()); 
    } 
}** 
+0

Wierzę, że twój kod będzie działał tylko w przypadku, gdy używamy 'CvCameraViewListener2'. Ale co jeśli jest to ogólny przypadek, w którym chcę tylko napisać metodę! – Mayank