OpenCV: HSV inRange возвращает двоичное изображение, сжатое и повторенное

У меня проблемы с изображением, которое я конвертирую для распознавания цветов.

Функция выглядит так:

void PaintHSVWindow(cv::Mat img){
cv::Mat HSV, threshold;
cvtColor(img, HSV, COLOR_BGR2HSV);
inRange(HSV, cv::Scalar(HMin, SMin, VMin), cv::Scalar(HMax, SMax, VMax), threshold);
Mat erodeElement = getStructuringElement(MORPH_RECT, cv::Size(3, 3));
Mat dilateElement = getStructuringElement(MORPH_RECT, cv::Size(8, 8));
erode(threshold, threshold, erodeElement);
dilate(threshold, threshold, dilateElement);
cv::resize(threshold, threshold, cv::Size(360, 286));
MyForm::setHSVWindow(threshold);

}

И вывод выглядит следующим образом:

Ввод слева, вывод справа, фильтрация для поиска желтого шара

Слева находится вход. Справа предполагаемый быть тем же изображением, преобразованным в HSV, отфильтрованным между заданными порогами, чтобы найти желтый шар, размытым и расширенным, чтобы удалить меньшие контуры, и отображенным в половине размера исходного изображения. Вместо этого он берет ожидаемое изображение и раздавливает 3 из них в одном и том же месте.

Есть предположения, почему это произошло?


ОБНОВЛЕНИЕ 1:

Хорошо, так как кажется, что запуск findContours на изображении с правым размером все еще дает мне правильный вывод, то есть контуры из искаженного, 3-кратно скопированного правого изображения можно вставить в правую позицию слева со стороны входного изображения, я решил просто взять искаженное изображение и обрезать его для отображения. Он будет использоваться только для нахождения контуров заданного диапазона HSV на изображении, и если он будет служить этой цели, я счастлив.

3

Решение

Как отмечает @Nallath, это, по-видимому, проблема канала. Согласно документации, вывод inRange() должен быть 1-канальный CV_8U образ, который является логичным AND всех каналов включительно.

Ваш результат означает, что где-то по пути threshold рассматривается как 3-канальное изображение в плоскости.

Какую версию OpenCV вы используете?

Я предлагаю вам показать threshold между каждым шагом, чтобы найти место, где происходит это преобразование. Это может быть ошибка, которая должна быть сообщается.

0

Другие решения


По вопросам рекламы [email protected]