cartToPolar返回的角度不够明显

问题描述 投票:0回答:1

我的目标是使用opencv基于角度使用3种颜色着色相机渐变幅度。

为了获得梯度幅度,我将帧从相机转换为灰度,然后应用高斯模糊,然后在x轴和y轴上创建sobel,并使用阈值函数对其进行二值化。在最后一步,我使用了名为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;

    }
}

我想要基于相机视图的三色(红色,蓝色,绿色,白色,黑色)渐变幅度,但实际输出有一种颜色(白色,黑色,红色)

c++ opencv gradient gaussian magnitude
1个回答
1
投票

你有两个二进制图像(sobel_x_binsobel_y_bin),它们用作每个像素的渐变的xy分量。因此,每个像素只能有四个不同的梯度向量,只有三个不同的角度:

  • x=0, y=0 - >角度未定义。可能会返回0。
  • x=255, y=0 - >角度为0°(梯度向量沿x轴)。
  • x=0, y=255 - >角度为90°(梯度向量沿y轴)。
  • x=255, y=255 - >角度为45°。

看看你递给cartToPolar的阵列,这应该变得清晰。

为什么要用二进制阈值对渐变图像进行阈值处理?如果要切断低于一定幅度的所有渐变,则可以使用不同的阈值函数(检查available options)。但这应该在幅度图像(例如cartToPolar返回的图像)上完成,而不是单个组件。

你应该试试这个:

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);
Sobel(gauss, sobel_y, CV_32F, 0.0, 1.0, 3);
cartToPolar(sobel_x, sobel_y, gradient, angle, true);

然后从那里探索如何获得你需要的东西。

© www.soinside.com 2019 - 2024. All rights reserved.