当带有线的给定图像传递给OpenCV的HoughLine变换时,它返回rho和theta对的列表,每对定义一条单独的线。在这个rho,theta对列表中列出行的顺序是什么。
例如,当这个带有8行的图像用于python时, 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确定的?
答案 0 :(得分:3)
来自OpenCV源代码https://github.com/opencv/opencv/blob/master/modules/imgproc/src/hough.cpp
函数HoughLinesStandard从第80行开始实现标准的hough变换。
如果我们向下滚动一点(第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));
如果您不知道累加器值是什么,请阅读Hough变换的工作原理。 https://en.wikipedia.org/wiki/Hough_transform
它基本上表示有多少像素贡献给那个rho theta对。
答案 1 :(得分:1)
可能是它们以字典(r,Θ)或(Θ,r)顺序返回,因此您的平行线将通过增加距离原点的距离或随机(角度的顺序是不可预测的)来实现。
函数的设计者没有理由强制执行特定的顺序,因为在一般情况下没有行的逻辑(并行或准平行的行是例外)。
如果您需要特定订单,则由您来指定和实施。例如,通过增加r进行排序,当Θ进行半转时,注意分配负号。您还可以使用垂直方向对交叉点的纵坐标进行排序。
在仔猪发现之后,他们会被力量归还。我的上一段仍然适用。