gpt4 book ai didi

java - 在 OpenCV、Java 中添加两个 Mats 时出错

转载 作者:行者123 更新时间:2023-11-28 05:52:58 25 4
gpt4 key购买 nike

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

CvException:/Volumes/./././././././arithm.cpp:639: error: (-209) 操作既不是“数组操作数组”(数组有相同的大小和相同的 channel 数),也不是函数 void cv::arithm_op(...) 中的“数组运算标量”和“标量运算数组”

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

我的代码(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 具有相同的大小,但它们的 channel 数不同:imgMat 有 4 个 channel ,而 res 有 3 个 channel 。

因为只有当两个矩阵具有相同的大小和 channel 数时,您才能相加,所以您可以在调用 add< 之前将 imgMat 转换为 3 channel 图像 像:

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

关于java - 在 OpenCV、Java 中添加两个 Mats 时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34828901/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com