OpenCV абсдифф эквивалент с C ++ для Python - PullRequest
0 голосов
/ 28 июня 2018

Вот пример из C ++:

cv::absdiff(input,cv::Scalar(target),output);

, где target равно cv::Vec3b [190, 119, 102]

Я попробовал следующее в Python:

output = cv2.absdiff(image,  np.array([190, 119, 102]) )

Это не удалось:

Ошибка: утверждение не выполнено (type2 == 6 && (sz2.height == 1 || sz2.height == 4)) в arithm_op, файл /tmp/opencv-20180529-55469-97fkx6/opencv-3.4.1/modules/core/src/arithm.cpp, линия 661

Как правильно перевести этот код?

1 Ответ

0 голосов
/ 29 июня 2018

Посмотрите на сообщение об ошибке очень внимательно. Мало того, что тип массива NumPy должен быть CV_64F или плавающей точкой, высота должна быть 1 или 4. Для вашего конкретного случая это означает, что вы должны предоставить двумерный массив NumPy с высотой 1 По умолчанию ваш созданный массив имеет тип int32, поэтому убедитесь, что вы указали dtype как np.float.

Наконец, вы можете просто ввести в скаляр одну строку, которая поможет вам сделать это:

output = cv2.absdiff(image, np.array([190, 119, 102], dtype=np.float)[None])

Этот код np.array([190, 119, 102], dtype=np.float)[None] создает обычный массив NumPy, но обеспечивает точность с плавающей запятой, и мы вводим одноэлементное измерение, поэтому он становится массивом 1 x 3 2D NumPy, а не массивом 3, NumPy.

В качестве заключительной мысли вы можете просто предоставить 2D-список вместо 1D-списка в конструкторе массива NumPy для достижения того же результата. Это зависит от того, как вы создаете скаляр:

output = cv2.absdiff(image, np.array([[190, 119, 102]], dtype=np.float))
...