2015-01-26 3 views
1

Я не могу избавиться от этой ошибки в OpenCV:OpenCV InRange меняет тип Mat

OpenCV Error: Sizes of input arguments do not match (The operation is neither 'array op array' (where arrays have the same size and type), nor 'array op scalar', nor 'scalar op array')

я узнал с Mat.type();, что всеми моими Mat(img) имеет тип 16, но после того, как функция inRange моего img3 измененного типа 0, . Тогда я не могу использовать функцию bitwise_and, потому что у нее нет того же типа.

Как его преобразовать в тот же тип?

Mat img1 = imread(argv[1], 1); 
Mat img2, img3, img4; 

cvtColor(img1, img2, CV_BGR2HSV); 
GaussianBlur(img2, img2, Size(15,15), 0); 
inRange(img2, Scalar(h_min_min,s_min_min,v_min_min), Scalar(h_max_min,s_max_min,v_max_min), img3); // now img3 changed type to 0 
bitwise_and(img1, img3, img4); // img1.type()=16, img3.type()=0 ERROR 
+0

Для всех целей и задач 'inRange' в OpenCV дает вам пороговое двоичное изображение. Тип 'CV_8U', если я не ошибаюсь. Попробуйте преобразовать его обратно в желаемый тип, используя 'img3.convertTo (img3, CV_16U)' или все, что вам нужно. – Xonxt

+0

Благодарим за быстрый ответ, но после img3.convertTo (img3, CV_16U) тип равен 2, а после img3.convertTo (img3, 16) является типом еще 0 – User

+0

чего вы хотите достичь? установить все элементы в ноль, которые не входят в диапазон? вместо bitwise_and попробуйте 'img1.copyTo (img4, img3);' и попробуйте 'imshow (" img3 ", img3); cv :: waitKey (0); ', чтобы проверить, дает ли' inRange' результат, который вы хотите получить. – Micka

ответ

0

Это нормально, так как inRange возвращает маску 1-канала (значение для каждого пикселя), таким образом, чтобы выполнить операцию побитовой просто преобразовать маску обратно в 3-канальном изображение:

cvtColor(img3,img3,CV_GRAY2BGR); 
bitwise_and(img1, img3, img4);// now both images are CV_8UC3 (=16) 

EDIT: как говорит Берак, для изменения количества каналов вы должны использовать cvtColor, а не Mat::convertTo. Извини за это.

+0

Спасибо за быстрый ответ, но это не помогло. Тип по-прежнему равен 0. inRange (img2, Scalar (h_min_min, s_min_min, v_min_min), Scalar (h_max_min, s_max_min, v_max_min), img3); cout << "Изображение перед конвертированием:" << img3.type() << endl; // 0 img3.convertTo (img3, CV_8UC3); cout << "Изображение после convertTo:" << img3.type() << endl; // 0 – User

+0

convertTo не меняет количество каналов, а только глубину. здесь вместо этого нужно cvtColor. – berak

+0

Вы абсолютно правы, @berak –

Смежные вопросы