gpt4 book ai didi

c++ - OpenCV 检测点是否位于线/平面上

转载 作者:太空宇宙 更新时间:2023-11-03 21:58:53 25 4
gpt4 key购买 nike

我正在为目前手动执行的光学设备开发一种自动校准形式。校准的第一部分是确定光束是否照亮了一组“校准”点。

我正在使用 OpenCV 并对图像进行阈值处理和裁剪,只留下可能的相关点。我知道想要确定这些点是否位于直线(水平)线上;如果他们有足够的数量,光束就在正确的位置! (这些点位于一条直线上,但光束通常是弯曲的,因此击中大部分点就足够了,有 21 个点在阈值化时显示为白色圆圈)。

我曾尝试使用直方图,但在阈值化图像上结果不正确,现在正在查看霍夫线,但这会检测边缘的直线,因为我想确定检测到的点是否位于一条线上。

这是我使用的阈值代码:

cvThreshold(output, output, 150, 256, CV_THRESH_BINARY);

具有 1 到 640 个 bin(图像宽度)的任何位置的直方图结果是在 0 和接近最大值的大约 2/3 处的两条线。不是没有阈值的预期或获得的分布。

一些图片试图说明这一点(注意“嘈杂”的光点,这是系统设置的一个特征,无法克服):

12 points in a stright line next to one another (beam in correct position)

The sort of output wanted (for illistration, if the points are on the line this is all I need to know!)

如有任何帮助,我们将不胜感激。一种想法是提取点的坐标并进行比较,但我不知道该怎么做。

最佳答案

如果它能帮助任何人,这里是我使用的一些简单线性回归代码的非常基础(初稿)。

    // Calculate the averages of arrays x and y
double xa = 0, ya = 0;

for(int i = 0; i < n; i++)
{
xa += x[i];
ya += y[i];
}
xa /= n;
ya /= n;

// Summation of all X and Y values
double sumX = 0;
double sumY = 0;
// Summation of all X*Y values
double sumXY = 0;
// Summation of all X^2 and Y^2 values
double sumXs = 0;
double sumYs = 0;

for(int i = 0; i < n; i++)
{
sumX = sumX + x[i];
sumY = sumY + y[i];

sumXY = sumXY + (x[i] * y[i]);

sumXs = sumXs + (x[i] * x[i]);
sumYs = sumYs + (y[i] * y[i]);
}
// (X^2) and (Y^2) sqaured
double Xs = sumX * sumX;
double Ys = sumY * sumY;

// Calculate slope, m
slope = (n * sumXY - sumX * sumY) / (n* sumXs - Xs);

// Calculate intercept
intercept = ceil((sumY - slope * sumX) / n);

// Calculate regression index, r^2
double r_top = (n * sumXY - sumX * sumY);
double r_bottom = sqrt((n* sumXs - Xs) * (n* sumYs - Ys));
double r = 0;

// Check line is not perfectly vertical or horizontal
if(r_top == 0 || r_bottom == 0)
r = 0;
else
r = r_top/ r_bottom;

有更多有效的方法可以做到这一点(请参阅 CodeCogs 或 AGLIB)但作为快速修复此代码似乎有效。

为了在 OpenCV 中检测圆圈,我从这篇文章中删除了 Hough 变换和改编代码: Detection of coins (and fit ellipses) on an image

然后是细化坐标(删除任何异常值等)以确定圆圈是否位于回归的斜率和截距值的水平线上的情况。

关于c++ - OpenCV 检测点是否位于线/平面上,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5596805/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com