OpenCV中矩阵中元素的总和?

kad*_*adu 20 c++ matlab opencv image-processing

我需要将矩阵中的所有元素相加.我用过这个功能

  sum(sum(A)); 
Run Code Online (Sandbox Code Playgroud)

在matlab中.哪个A是尺寸为300*360的矩阵.我想在OpenCV中实现相同的功能.我用过这样的东西.

  double s=cv::sum(cv::sum(A));
Run Code Online (Sandbox Code Playgroud)

但是有错误显示无法将标量转换为双倍.如何解决这个问题?

Sha*_*hai 42

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

double s = cv::sum( A )[0];
Run Code Online (Sandbox Code Playgroud)

  • `cv :: sum`返回一个`cv :: Scalar`元素.例如,如果您有一个3通道图像,则返回值有3个元素,每个通道一个.因此,每个渠道都是独立总结的.`[0]`将访问该标量的第一个值.对于具有BGR排序的RGB图像(如主要用于OpenCV),标量的"[0]"将访问总计的"蓝色通道","[1]"将是"绿色通道"和"[ 2]'是该示例中"红色通道"的总和.http://docs.opencv.org/modules/core/doc/operations_on_arrays.html#sum (18认同)
  • 不太正确:`cv :: Scalar s = cv :: sum(A);`如果那是1chan mat,那就是:`double psum = cv :: sum(A)[0];` (8认同)
  • 它以这种方式完成的原因是cv :: Mat是运行时类型的; 无论数组实际上是否包含uint8,int16,float等,都会调用相同的cv :: sum(); 所以所有情况都必须返回相同的类型.'Scalar'包含4个双打,可容纳所有情况(最多4个通道).与使用编译时键入的其他矩阵实现形成对比,例如CImg <T>,其中您通常对不同的元素类型具有不同的函数返回类型. (3认同)

eik*_*iki 11

除了@Shai你还可以使用;

double sum = cv::sum(A).val(0);
Run Code Online (Sandbox Code Playgroud)