Диапазон значений оттенка в opencv - PullRequest
0 голосов
/ 29 апреля 2019

Следует отметить, что OpenCV имеет диапазон значений оттенка [0 179] ( Обнаружение красных кружков на изображении с использованием OpenCV ) (пожалуйста, исправьте меня, если утверждение неверно).Здесь ниже моя функция для получения значений оттенка изображения Mat:

Mat MainWindow::getHue(const Mat &src)
{
    Mat bgr32; //CV_32FC3
    src.convertTo(bgr32,CV_32FC3,1/255.0);

    Mat hsv(bgr32.size(), CV_32FC3);
    cvtColor(bgr32,hsv, COLOR_BGR2HSV);

    Mat hue(hsv.size(), CV_32FC1);
    Mat sat(hsv.size(), CV_32FC1);
    Mat val(hsv.size(), CV_32FC1);
    Mat out[] = {hue,sat,val};
    split(hsv,out);

    return hue;
}

Сгенерированное значение оттенка таким образом фактически находится в диапазоне [0, 360].В чем проблема?Я использую opencv3.4.5.

1 Ответ

1 голос
/ 29 апреля 2019

Здесь - документация для преобразования RGB в HSV.

Поскольку диапазон uchar равен [0,255], вы не можете сохранить весь диапазон оттенков.Поэтому opencv решил использовать хитрость.Для матриц этого типа разделите оттенок на 2. Однако этот прием используется только для uchar матриц.Матрицы с плавающей точкой, которые могут хранить весь диапазон оттенков, не должны прибегать к этому.

Чтобы увидеть трюк в действии, просто используйте матрицу uchar:

Mat MainWindow::getHue(const Mat &src)
{

    Mat hsv(src.size(), CV_8UC3);
    cvtColor(src,hsv, COLOR_BGR2HSV);

    Mat hue(hsv.size(), CV_8UC1);
    Mat sat(hsv.size(), CV_8UC1);
    Mat val(hsv.size(), CV_8UC1);
    Mat out[] = {hue,sat,val};
    split(hsv,out);

    return hue;
}

Теперь hue находится в диапазоне [0, 180].

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...