У меня проблемы с изображением, которое я конвертирую для распознавания цветов.
Функция выглядит так:
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 на изображении, и если он будет служить этой цели, я счастлив.
Как отмечает @Nallath, это, по-видимому, проблема канала. Согласно документации, вывод inRange()
должен быть 1-канальный CV_8U
образ, который является логичным AND
всех каналов включительно.
Ваш результат означает, что где-то по пути threshold
рассматривается как 3-канальное изображение в плоскости.
Какую версию OpenCV вы используете?
Я предлагаю вам показать threshold
между каждым шагом, чтобы найти место, где происходит это преобразование. Это может быть ошибка, которая должна быть сообщается.