cartToPolar 返回的视角不够多
cartToPolar returns not enough distinct angles
我的目标是使用 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;
}
}
我想要基于相机视图的三色(红色,蓝色,绿色,白色,黑色)渐变幅度,但实际输出有一种颜色(白色,黑色,红色)
您有两个二进制图像(sobel_x_bin
和sobel_y_bin
),您可以将其用作每个像素的梯度的x
和y
分量。因此,每个像素只能有四个不同的梯度向量,只有三个不同的角度:
-
x=0, y=0
-> 角度未定义。可能返回 0。 -
x=255, y=0
->角度为 0°(梯度矢量沿 x 轴)。 -
x=0, y=255
->角度为 90°(梯度矢量沿 y 轴)。 -
x=255, y=255
->角度为 45°。
看看你交给cartToPolar
的数组,这应该会变得清晰起来。
究竟为什么要用二进制阈值对渐变图像进行阈值处理?如果要切断低于某个幅度的所有梯度,则可以使用不同的阈值函数(检查可用选项)。但这应该在量级图像(例如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);
然后从那里探索如何获得您需要的东西。
相关文章:
- 来自 std::list 的迭代器 .end() 按预期返回"0xcdcdcdcdcdcdcdcd"但 .begin()
- 什么时候在C++中返回常量引用是个好主意
- 你能重载对象变量名本身返回的内容吗
- 为什么 Serial.println(<char[]>);返回随机字符?
- C++映射:具有自定义类的运算符[]不起作用(总是返回0)
- 如何获取std::result_of函数的返回类型
- QueryWorkingSet总是返回false
- (C++)分析树以计算返回错误值的简单算术表达式
- 访问者访问变体并返回不同类型时出错
- 如何返回一个类的两个对象相加的结果
- OpenInventor从9.8升级到10.4.2后,GLSL纹理返回零
- lower_bound()返回最后一个元素
- "throw expression code" 1e7 >返回 d 是什么?投掷标准::overflow_error( "too big" ) : d;意味 着?
- 奇怪的(对我来说)返回声明 - 在谷歌上找不到任何关于它的信息
- 如何取消对nullptr的屏蔽,返回正确的对象
- 奇怪的结构&GCC&clang(void*返回类型)
- 架构决策:返回std::future还是提供回调
- 从python中调用C++函数并获取返回值
- cartToPolar 返回的视角不够多
- 对于级联成员函数调用,为什么需要返回引用?为什么只有这个指针还不够?