OpenCV 的 HoughLines 以什么顺序列出 [rho,theta] 矩阵中检测到的线?
In what order, OpenCV's HoughLines lists the detected lines in the [rho,theta] matrix?
当给定的带有线条的图像被传递到 OpenCV 的 HoughLine 变换时,它 returns 一个 rho 和 theta 对的列表,每对定义一条单独的线条。在这个 rho,theta 对列表中,行的排列顺序是什么。
例如,当在 python 中使用此 8 行图像时,
image with 8 line
以下为八行返回了 rho,theta 矩阵。
[[ 461. 1.48352981]
[ 380. 1.48352981]
[ 212. 1.48352981]
[ 112. 1.48352981]
[ 65. 1.48352981]
[ 334. 1.48352981]
[ 269. 1.48352981]
[ 508. 1.48352981]]
在这个矩阵中,行的排列顺序是如何由 openCV 决定的?
可能是它们以字典序 (r, Θ) 或 (Θ, r) 顺序返回,因此您的平行线将通过增加与原点的距离或随机出现(角度的顺序不可预测) ).
函数的设计者没有理由强制执行特定的顺序,因为在一般情况下线条没有逻辑(平行或准平行线除外)。
如果你想要一个特定的命令,由你来指定和执行它。例如,通过增加 r 进行排序,注意在 Θ 转半圈时分配一个负号。您还可以在垂直交点的纵坐标上排序。
小猪找到后,实力回归。我之前的段落仍然适用。
来自 OpenCV 源代码https://github.com/opencv/opencv/blob/master/modules/imgproc/src/hough.cpp
函数 HoughLinesStandard 从第 80 行开始实施标准霍夫变换。
如果我们向下滚动一点(第 166 行),我们会发现:
// stage 3. sort the detected lines by accumulator value
std::sort(_sort_buf.begin(), _sort_buf.end(), hough_cmp_gt(accum));
现在行列表按累加器值升序排序。最好的 linesMax
结果被放入输出缓冲区。
// stage 4. store the first min(total,linesMax) lines to the output buffer
linesMax = std::min(linesMax, (int)_sort_buf.size());
double scale = 1./(numrho+2);
for( i = 0; i < linesMax; i++ )
{
LinePolar line;
int idx = _sort_buf[i];
int n = cvFloor(idx*scale) - 1;
int r = idx - (n+1)*(numrho+2) - 1;
line.rho = (r - (numrho - 1)*0.5f) * rho;
line.angle = static_cast<float>(min_theta) + n * theta;
lines.push_back(Vec2f(line.rho, line.angle));
如果您不知道累加器值是什么,请阅读霍夫变换的工作原理。 https://en.wikipedia.org/wiki/Hough_transform
它基本上说明了多少像素对 rho theta 对有贡献。
当给定的带有线条的图像被传递到 OpenCV 的 HoughLine 变换时,它 returns 一个 rho 和 theta 对的列表,每对定义一条单独的线条。在这个 rho,theta 对列表中,行的排列顺序是什么。
例如,当在 python 中使用此 8 行图像时, image with 8 line
以下为八行返回了 rho,theta 矩阵。
[[ 461. 1.48352981]
[ 380. 1.48352981]
[ 212. 1.48352981]
[ 112. 1.48352981]
[ 65. 1.48352981]
[ 334. 1.48352981]
[ 269. 1.48352981]
[ 508. 1.48352981]]
在这个矩阵中,行的排列顺序是如何由 openCV 决定的?
可能是它们以字典序 (r, Θ) 或 (Θ, r) 顺序返回,因此您的平行线将通过增加与原点的距离或随机出现(角度的顺序不可预测) ).
函数的设计者没有理由强制执行特定的顺序,因为在一般情况下线条没有逻辑(平行或准平行线除外)。
如果你想要一个特定的命令,由你来指定和执行它。例如,通过增加 r 进行排序,注意在 Θ 转半圈时分配一个负号。您还可以在垂直交点的纵坐标上排序。
小猪找到后,实力回归。我之前的段落仍然适用。
来自 OpenCV 源代码https://github.com/opencv/opencv/blob/master/modules/imgproc/src/hough.cpp
函数 HoughLinesStandard 从第 80 行开始实施标准霍夫变换。
如果我们向下滚动一点(第 166 行),我们会发现:
// stage 3. sort the detected lines by accumulator value
std::sort(_sort_buf.begin(), _sort_buf.end(), hough_cmp_gt(accum));
现在行列表按累加器值升序排序。最好的 linesMax
结果被放入输出缓冲区。
// stage 4. store the first min(total,linesMax) lines to the output buffer
linesMax = std::min(linesMax, (int)_sort_buf.size());
double scale = 1./(numrho+2);
for( i = 0; i < linesMax; i++ )
{
LinePolar line;
int idx = _sort_buf[i];
int n = cvFloor(idx*scale) - 1;
int r = idx - (n+1)*(numrho+2) - 1;
line.rho = (r - (numrho - 1)*0.5f) * rho;
line.angle = static_cast<float>(min_theta) + n * theta;
lines.push_back(Vec2f(line.rho, line.angle));
如果您不知道累加器值是什么,请阅读霍夫变换的工作原理。 https://en.wikipedia.org/wiki/Hough_transform
它基本上说明了多少像素对 rho theta 对有贡献。