我需要对矩阵中的所有元素求和。我使用了这个函数:
sum(sum(A));
在matlab中,A
是一个大小为300*360的矩阵。我想在OpenCV中实现相同的功能。我使用了类似于以下内容的代码。
double s=cv::sum(cv::sum(A));
但是出现了错误,显示无法将标量转换为双精度。如何解决这个问题?
我需要对矩阵中的所有元素求和。我使用了这个函数:
sum(sum(A));
在matlab中,A
是一个大小为300*360的矩阵。我想在OpenCV中实现相同的功能。我使用了类似于以下内容的代码。
double s=cv::sum(cv::sum(A));
但是出现了错误,显示无法将标量转换为双精度。如何解决这个问题?
与Matlab不同,opencv中的cv::sum(A)
会沿着所有维度求和并返回一个等于Matlab的sum(sum(A))
的标量(单个数字)。
因此,你需要的是
double s = cv::sum(A)[0];
cv::Scalar s = cv::sum(A);
的写法不太正确,应该改为:double psum = cv::sum(A)[0];
。这样可以得到矩阵A所有元素的和。请注意,不要改变原有语句的含义。 - berakcv::sum
返回一个 cv::Scalar
元素。例如,如果你有一张3通道的图像,则返回值将有3个元素,每个通道都会单独求和。[0]
将访问该标量的第一个值。对于具有BGR顺序的RGB图像(如OpenCV中常用的),标量的 [0]
将访问总和的"蓝色通道", [1]
是"绿色通道"的总和,而 [2]
是该示例中"红色通道"的总和。http://docs.opencv.org/modules/core/doc/operations_on_arrays.html#sum - MickaMat
对象传递给这个函数吗? - Romantic ElectronScalar cv::sum(InputArray src)
返回一个Scalar
,其中每个通道都被单独求和(输入图像必须具有1到4个通道)。如果我们要找的是跨所有通道的所有值的总和,则需要再进行一步操作,对返回的Scalar
的所有元素求和。一个简洁的解决方案可以使用dot
函数和填充有“1”的标量来实现:
cv::sum(A).dot(cv::Scalar::ones());
这也适用于单通道图像,而不会增加显著的额外计算。
sum(A(:))
而不是sum(sum(A))
。 - bla