gpt4 book ai didi

java - OpenCV Mat除法答案错误

转载 作者:行者123 更新时间:2023-12-01 21:17:10 26 4
gpt4 key购买 nike

我有以下示例代码,用于计算红色像素的百分比,

import org.opencv.core.*;


public class ImageProcessing {
static
{
System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
}

public static void main(String[] args)
{
Mat red = Mat.zeros(5, 1, CvType.CV_8UC1);
Mat sum = Mat.zeros(5, 1, CvType.CV_8UC1); // sum of red, green, and blue

double[] red_data = {1, 1, 1, 1,255};
double[] sum_data = {1,11,12,13,255};
red.put(0, 0, red_data);

sum.put(0, 0, sum_data);

Mat percentage = Mat.zeros(5, 1, CvType.CV_64FC1);

//red.convertTo(red, CvType.CV_64F);
//sum.convertTo(sum, CvType.CV_64F);
Core.divide(red, sum, percentage, CvType.CV_64FC1);



System.out.println("Results");
for (int i = 0; i < 5; i++)
{
System.out.printf("%d: %10f / %10f = %10f (%10f) \n", i+1, red.get(i, 0)[0],
sum.get(i, 0)[0],
percentage.get(i, 0)[0],
red.get(i, 0)[0]/sum.get(i, 0)[0] );

}

}
}

运行它,我希望得到 () 中的结果,但是我显然得到了奇怪的结果。我一开始认为这与整数除法有关(参见: divide two matrices in opencv )。但是将它们转换为 64 位 float (注释掉的行)。只会给出其他奇怪的结果。

没有浮点转换

Results
1: 1.000000 / 1.000000 = 6.000000 ( 1.000000)
2: 1.000000 / 11.000000 = 1.000000 ( 0.090909)
3: 1.000000 / 12.000000 = 0.000000 ( 0.083333)
4: 1.000000 / 13.000000 = 0.000000 ( 0.076923)
5: 255.000000 / 255.000000 = 6.000000 ( 1.000000)

Process finished with exit code 0

转换为 64 位 float

Results
1: 1.000000 / 1.000000 = 6.000000 ( 1.000000)
2: 1.000000 / 11.000000 = 0.545455 ( 0.090909)
3: 1.000000 / 12.000000 = 0.500000 ( 0.083333)
4: 1.000000 / 13.000000 = 0.461538 ( 0.076923)
5: 255.000000 / 255.000000 = 6.000000 ( 1.000000)

我确实注意到存在一致的结果,其中存在清晰的映射(1.0/1.0 和 255/255 的 1.0 映射到 6.0,但我找不到会导致这种情况的模式)。

最佳答案

您似乎正在使用 this divide 函数的重载:

public static void divide(Mat src1, Mat src2, Mat dst, double scale)

Parameters:

  • src1 - First source array.
  • src2 - Second source array of the same size and type as src1.
  • dst - Destination array of the same size and type as src2.
  • scale - Scalar factor.

执行操作dst(I) = saturate(src1(I) * scale/src2(I))

注意:请注意第四个参数的实际含义,您在其中传递 Core.CV_64FC1

稍微研究一下,您就会发现常量CV_64FC1的值为6

这意味着实际上,正在执行的计算是:

1 * 6 / 1
1 * 6 / 11
1 * 6 / 12
1 * 6 / 13
255 * 6 / 255

剩下的就很简单了。

请注意文档中的要求,即输出数组应“与 src2 具有相同的大小和类型。”在第一种情况下,当两个输入数组为 CV_8UC1,第二个条件不满足,因此分配一个新数组。

由于在第一种情况下输出是整数数组,因此您会看到 rounded结果。在第二种情况下,它是 float ,因此不会进行舍入。

关于java - OpenCV Mat除法答案错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39836532/

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