在OpenCV,Java中添加两个Mat时出错



我正在编写一个基于OpenCV的图像处理算法,用于阈值化。算法是用C++语言编写的,我正在为Android工作室重写Java。在一行中,我必须添加两个Mat(OpenCV矩阵)对象。在C++中它是res=Img+res;,在Java Core.add(imgMat, res, res);中。在这一行,我得到一个错误,我无法解决:

CvException: /Volumes/./././././././arithm.cpp:639: error: (-209) The operation is neither 'array op array' (where arrays have the same size and the same number of channels), nor 'array op scalar', nor 'scalar op array' in function void cv::arithm_op(...)

在下面的代码中,您可以看到两个 Mat 对象具有相同的大小,并且也具有相同的格式 (CvType)。同样,代码在C++中的外观,您可以在此问题中看到。

我的代码(java):

public Bitmap Thresholding(Bitmap bitmap)
{
    Mat imgMat = new Mat();
    Utils.bitmapToMat(bitmap, imgMat);
    imgMat.convertTo(imgMat, CvType.CV_32FC1, 1.0 / 255.0);
    Mat res = CalcBlockMeanVariance(imgMat, 21);
    Core.subtract(new MatOfDouble(1.0), res, res);
    Core.add(imgMat, res, res);
    Imgproc.threshold(res, res, 0.85, 1, Imgproc.THRESH_BINARY);
    //Imgproc.resize(res, res, new org.opencv.core.Size(res.cols() / 2, res.rows() / 2));
    res.convertTo(res, CvType.CV_8UC1, 255.0);
    Utils.matToBitmap(res, bitmap);
    return bitmap;
}
public Mat CalcBlockMeanVariance (Mat Img, int blockSide)
{
    Mat I = new Mat();
    Mat ResMat;
    Mat inpaintmask = new Mat();
    Mat patch;
    Mat smallImg = new Mat();
    MatOfDouble mean = new MatOfDouble();
    MatOfDouble stddev = new MatOfDouble();
    Img.convertTo(I, CvType.CV_32FC1);
    ResMat = Mat.zeros(Img.rows() / blockSide, Img.cols() / blockSide, CvType.CV_32FC1);
    for (int i = 0; i < Img.rows() - blockSide; i += blockSide)
    {
        for (int j = 0; j < Img.cols() - blockSide; j += blockSide)
        {
            patch = new Mat(I,new Rect(j,i, blockSide, blockSide));
            Core.meanStdDev(patch, mean, stddev);
            if (stddev.get(0,0)[0] > 0.01)
                ResMat.put(i / blockSide, j / blockSide, mean.get(0,0)[0]);
            else
                ResMat.put(i / blockSide, j / blockSide, 0);
        }
    }
    Imgproc.resize(I, smallImg, ResMat.size());
    Imgproc.threshold(ResMat, inpaintmask, 0.02, 1.0, Imgproc.THRESH_BINARY);
    Mat inpainted = new Mat();
    Imgproc.cvtColor(smallImg, smallImg, Imgproc.COLOR_RGBA2BGR);
    smallImg.convertTo(smallImg, CvType.CV_8UC1, 255.0);
    inpaintmask.convertTo(inpaintmask, CvType.CV_8UC1);
    Photo.inpaint(smallImg, inpaintmask, inpainted, 5, Photo.INPAINT_TELEA);
    Imgproc.resize(inpainted, ResMat, Img.size());
    ResMat.convertTo(ResMat, CvType.CV_32FC1, 1.0 / 255.0);
    return ResMat;
}

提前谢谢你。

虽然imgMatres具有相同的大小,但它们具有不同的通道数:imgMat有4个通道,res有3个通道。

由于只有当

两个矩阵具有相同的通道大小和数量时,您才能add两个矩阵,因此您可以在调用add之前将imgMat转换为 3 通道图像,如下所示:

Imgproc.cvtColor( imgMat, imgMat, Imgproc.COLOR_BGRA2BGR);

最新更新