在一些应用中,我们不仅需要检测直线,还需要获取直线位置和方向的精确估计,这次我们将介绍最贴合一组点的直线。
在上一章博客中,我们说到了概率霍夫变换,它的n*4的返回向量lines中就包含了每一条直线的所有信息(每条直线的起始点和终止点)参考我的上一个博客点击打开链接
我们将选定的直线画在一张准备好的白板图像oneline中,并用非操作进行黑白的翻折。使得直线更加明显。
现在,我们遍历这张oneline图像,每当出现白色值的时候,就说明我们找到了一个直线上的点,我们把这个点的信息记录在向量points中。
//将选定的直线中所有的坐标确定下来,并储存在points中
//push_back的含义为在向量的末尾加上数据
//vector在刚刚声明定义的时候大小是0,也就是vector.size=0
std::vector<cv::Point> points;
for (int y = 0; y < oneline.rows; y++)
{
uchar* rowPtr = oneline.ptr<uchar>(y);
for (int x = 0; x < oneline.cols; x++)
{
if (rowPtr[x])
{
points.push_back(cv::Point(x, y));
std::cout << x << " " << y << endl;
}
}
}
我们在拥有了这么多点之后,现在就要进行图像拟合,我们使用cv::fitline函数
void fitLine( InputArray points, OutputArray line, int distType,
d