【问题标题】:Sum of elements in a matrix in OpenCV?OpenCV中矩阵中的元素总和?
【发布时间】:2014-03-19 10:42:35
【问题描述】:

我需要对矩阵中的所有元素求和。我使用了函数

  sum(sum(A)); 

在matlab中。其中A 是一个大小为 300*360 的矩阵。 我想在 OpenCV 中实现相同的功能。我用过这样的东西。

  double s=cv::sum(cv::sum(A));

但显示无法将标量转换为双精度的错误。如何解决这个问题?

【问题讨论】:

标签: c++ matlab opencv image-processing computer-vision


【解决方案1】:

与 Matlab 不同,在 opencv 中,cv::sum(A) 沿所有维度求和并返回一个等于 Matlab 的 sum(sum(A)) 的数字(标量)。
所以,你需要的是

double s = cv::sum(A)[0];

【讨论】:

  • 不太正确:cv::Scalar s = cv::sum(A); 如果那是 1chan 垫,那就是:double psum = cv::sum(A)[0];
  • [0] 代表什么。谁能解释一下?
  • cv::sum 返回一个 cv::Scalar 元素。例如,如果您有一个 3 通道图像,则返回值有 3 个元素,每个通道一个。所以每个通道都是独立总结的。 [0] 将访问该标量的第一个值。对于具有 BGR 排序的 RGB 图像(如主要用于 OpenCV),标量的[0] 将访问汇总的“蓝色通道”,“[1]”将是“绿色通道”和“[2] 的总和' 是该示例中“红色通道”的总和。 docs.opencv.org/modules/core/doc/operations_on_arrays.html#sum
  • 我可以将Mat 对象传递给这个函数吗
  • 这样做的原因是 cv::Mat 是运行时类型的;无论数组是否实际包含 uint8、int16、float 等,都会调用相同的 cv::sum();所以所有情况都必须返回相同的类型。 'Scalar' 包含 4 个双打,可容纳所有情况(最多 4 个通道)。与使用编译时类型的其他矩阵实现对比,例如CImg 对于不同的元素类型,您通常有不同的函数返回类型。
【解决方案2】:

除了@Shai你可以使用;

double sum = cv::sum(A).val(0);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-17
    相关资源
    最近更新 更多