0
votes

To reduce the noise in an image, I am trying to get the average of 10 images.

Mat imgMain = new Mat(n_height, n_width, CvType.CV_32FC4);
Mat imgFin = new Mat(n_height, n_width, CvType.CV_32FC4);

for(int i=1; i <= 10; i++) {
    //Crop the image
    image.recycle();
    image = null;
    image = BitmapFactory.decodeFile("/storage/sdcard0/DCIM/A" + String.valueOf(i) + ".jpg");
    pimage = Bitmap.createBitmap(image, leftOff1, topOff1, n_width, n_height);
    Utils.bitmapToMat(pimage, imgMain);

    scaleAdd(imgMain, 0.1, imgFin, imgFin);
    }

Running the application, I get the following msg:

Caused by: CvException [org.opencv.core.CvException: cv::Exception: /hdd2/buildbot/slaves/slave_ardbeg1/50-SDK/opencv/modules/core/src/matmul.cpp:2079: error: (-215) src1.type() == src2.type() in function void cv::scaleAdd(cv::InputArray, double, cv::InputArray, cv::OutputArray) ] at org.opencv.core.Core.scaleAdd_0(Native Method) at org.opencv.core.Core.scaleAdd(Core.java:6690) at MainActivity.imageAnalysis(MainActivity.java:123)

where line 123 is scaleAdd(imgMaing, 0.1, imgFin, imgFin);

According to the reference, src1, src2 and dst MAT should be of same size and type. However, I get this error when I set imgFin type to 32FC4 but do not get any errors when imgFin is set to 8UC4. Any experience of this kind? I need to keep the floating numbers in imgFin which is why I can't go with 8UC4.

1

1 Answers

0
votes
// this line will overwrite your imgMain, 
// the type will be CV_8UC4, regardless, what you said before.
Utils.bitmapToMat(pimage, imgMain);

// so, convert to float:
imgMain.convertTo(imgMain, CvType.CV_32FC4);

// now add float images, to avoid precision loss:
scaleAdd(imgMain, 0.1, imgFin, imgFin);