15

I'm trying to covert a MAt to a Bitmap use following code :

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

my seedsImage is a Mat object. And the Exception and got is 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) I tried to search through but no solution worked for me. Can anynone help?

user3764893
  • 697
  • 5
  • 16
  • 33
Le Duy Khanh
  • 1,339
  • 3
  • 17
  • 36

2 Answers2

25

1) OpenCV Mat constructor expects <rows, cols> pair instead of <width, height> as its arguments. So you have to change your second line to

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

2) Imgproc.cvtColor can change the dimensions of the tmp object. So it is safe to create a bitmap after the color conversion:

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());}
Rui Marques
  • 8,567
  • 3
  • 60
  • 91
Andrey Kamaev
  • 29,582
  • 6
  • 94
  • 88
4

Try this code for mat to bitmap conversion

**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());
    }
 }**
MaNaSu
  • 49
  • 1
  • i believe your code will work only in the case when we are using `CvCameraViewListener2`. But what if its a general case where i want to just a write a method! – Mayank Apr 20 '16 at 09:23