2014-02-19 2 views
16

Мне нужно суммировать все элементы в матрице. Я использовал функциюСумма элементов в матрице в OpenCV?

sum(sum(A)); 

в MATLAB. Где A - это матрица размером 300 * 360. Я хочу реализовать ту же функцию в OpenCV. Я использовал что-то вроде этого.

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

Но есть ошибки, которые не могут преобразовать скаляр в двойное. Как решить эту проблему?

+7

так же, как и в сторону, в Matlab это лучше 'сумма (A (:))' вместо 'суммы (сумма (A))' – bla

+0

возможно дубликат [OpenCV: Получение общей сложности значений Матем ] (http://stackoverflow.com/questions/10156044/opencv-getting-the-total-of-mat-values) – m0nhawk

ответ

33

В отличие от Matlab, в opencv, cv::sum(A) суммирует по всем измерениям и возвращает одно число (скалярное), которое равно Matlab's sum(sum(A)).
Итак, что вам нужно, это

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

не совсем корректно: 'cv :: Scalar s = cv :: sum (A);' if это 1chan mat, это: 'double psum = cv :: sum (A) [0];' – berak

+0

Что означает [0]. Кто-нибудь может объяснить? – kadu

+14

'cv :: sum' возвращает элемент' cv :: Scalar'. Например, если у вас есть 3-канальное изображение, возвращаемое значение имеет 3 элемента, по одному для каждого канала. Таким образом, каждый канал суммируется независимо. '[0]' получит доступ к первому значению этого Скалара. Для изображений RGB с упорядочением BGR (как, в основном, используется в OpenCV) '[0]' из Scalar будет обращаться к суммированному «синему каналу», «[1]» будет суммой «зеленого канала» и «[ 2] 'является суммой «красного канала» в этом примере. http://docs.opencv.org/modules/core/doc/operations_on_arrays.html#sum – Micka

8

В дополнение с @Shai вы можете использовать;

double sum = cv::sum(A).val(0); 
Смежные вопросы