Моя цель - раскрасить величину градиента камеры тремя цветами в зависимости от угла с помощью opencv.
Чтобы получить величину градиента, я преобразовал кадр с камеры в шкалу серого, затем применил размытие по Гауссу, затем создал собел по осям x и y и бинаризовал их с помощью пороговой функции. На последнем этапе я использовал функцию cartToPolar(). Но после отладки угловая матрица, возвращаемая cartToPolar, имеет только 3 различных значения.
Код, отвечающий за создание величины градиента и соответствующих углов
cvtColor(frame, frame, COLOR_BGR2GRAY);
GaussianBlur(frame, gauss, Size(gauss_size, gauss_size), 2.0);
Sobel(gauss, sobel_x, CV_32F, 1.0, 0.0, 3);
threshold(sobel_x, sobel_x_bin, 20, 255, THRESH_BINARY);
Sobel(gauss, sobel_y, CV_32F, 0.0, 1.0, 3);
threshold(sobel_y, sobel_y_bin, 20, 255, THRESH_BINARY);
cartToPolar(sobel_x_bin, sobel_y_bin, gradient, angle, true);
Код, отвечающий за окраску
gradient.copyTo(gradient_colored);
cvtColor(gradient_colored, gradient_colored, COLOR_GRAY2BGR);
gradient_colored.convertTo(gradient_colored, CV_8UC3, 255);
float angle_value;
Vec3b red = Vec3b(0, 0, 255);
Vec3b green = Vec3b(0, 255, 0);
Vec3b blue = Vec3b(255, 0, 0);
Vec3b white = Vec3b(255, 255, 255);
for (int i = 0; i < gradient.rows; i++) {
for (int j = 0; j < gradient.cols; j++) {
angle_value = angle.at<float>(i, j);
// angle contains only three unique values 0, 44.9, 90, why?
Vec3b *color = &gradient_colored.at<Vec3b>(i, j);
if (angle_value > 45 && angle_value <= 135)
* color = white;
if (angle_value > 135 && angle_value <= 255)
* color = blue;
if (angle_value > 255 && angle_value <= 315)
* color = green;
if ((angle_value > 315 && angle_value <= 360) || (angle_value > 0 && angle_value <= 45))
* color = red;
}
}
Мне нужна трехцветная (красная, синяя, зеленая, белая, черная) величина градиента на основе вида камеры, но фактический результат имеет один цвет (белый, черный, красный)