伙计们。该图像有两个轮廓。我可以用opencv findcontour函数找到它们。我想知道的是如何判断哪条轮廓线和哪条轮廓线是曲线?任何人都可以告诉如何去做?任何建议将被认真考虑。先谢谢了。
回答
首先假定你有一条线,并应用一些基本的代数。
首先找到线的斜率和y截距。线的斜率被定义为y的变化除以x的变化。所以给出了两个点(X0,Y0),(X1,Y1):
y = mx + b
b = y - mx
所以
:slope = (y0-y1)/(x0-x1)
的y截距是使用斜率截距方程(y=mx+b)
并求解对于b发现
y_intercept = y0 - slope * x0
一旦你有斜率和Y轴截距,你只需要遍历轮廓的点,看看所有的点是否落在同一条线上。如果他们这样做,你有一条线;如果他们不这样做,你会有一条曲线。
因为我不知道你正在使用什么语言,这里是伪代码的整个过程:
// First assume you have a line - find the slope and y-intercept
slope = (point[0].y - point[1].y)/(point[0].x - point[1].x);
y_intercept = point[0].y - (slope * point[0].x);
// Using slope-intercept (y = mx + b), see if the other points are on the same line
for (n = 0 to numPoints)
{
if ((slope * point[n].x + y_intercept) != point[n].y)
{
// You've found a point that's not on the line - as soon as you
// find a point that's not on the line, you know that the contour
// is not a straight line
}
}
请注意,您使用浮点数这里要处理,所以你”在if
条件中必须考虑到这一点 - 您无法直接比较浮点数的相等性,因此您需要将它们舍入到某个可接受的准确度。为了保持伪代码的简单性,我放弃了这一点。
几点:使用前两个点来定义线条可能会产生很大的噪音,因为它们非常接近。使用第一个和最后一个点应该会更好。使用一维斜率和截距不适用于垂直线。因此,最好用2D矢量(起始点和方向)定义线,然后计算点与线的实际距离。 –
嗨,Jeff&Nico。非常感谢你。现在我明白并知道如何去做。感谢您的杰出答案! –
- 1. 在OpenCV中关闭轮廓曲线
- 2. OpenCV C++:通过轮廓区域对轮廓线进行排序
- 3. 我如何平滑OpenCV中的曲线(轮廓)?
- 4. 如何判断bonjour服务是无线还是蓝牙?
- 5. 如何通过opencv计算提取轮廓的曲率?
- 6. 如何判断线程是否通过其ID与C#运行
- 7. 如何通过代码判断iPad是黑色还是白色?
- 8. 如何判断用户是否离线
- 9. 如何判断库是COM还是DCOM?
- 10. 如何知道一般路径是直线还是曲线?
- 11. 如何通过opencv判断场景是否黑暗?
- 12. 轮廓线闪烁
- 13. 我如何知道opencv中的轮廓是打开还是关闭?
- 14. 如何用opencv填充轮廓线?例如,
- 15. Opencv 2.4.11 Java:从质心到轮廓边线的绘制线
- 16. 找到轮廓后Opencv图像扭曲
- 17. 轮廓线中轮廓线的平滑度
- 18. 如何判断obj是jquery还是普通javascript
- 19. OpenCV中如何平滑的轮廓线,降低噪音
- 20. OpenCV - 如何从轮廓中移除小线段?
- 21. OpenCV MATLAB:如何绘制具有特定强度轮廓的线?
- 22. 如何通过曲线
- 23. 如何将轮廓线变成填充的轮廓?
- 24. OpenCV轮廓?
- 25. Opencv轮廓
- 26. OpenCV的:是轮廓封闭或不
- 27. 如何判断线程是否完成执行而不轮询ThreadState?
- 28. Google Analytics(分析) - 如何判断用户是通过wifi还是cell连接?
- 29. 如何判断WCF服务是通过HTTP还是HTTPS调用的?
- 30. 如何从Matplotlib格式化轮廓线
在轮廓的第一个点和最后一个点之间定义一条直线,并测量所有其他点与直线的平均距离。如果轮廓是线条,则平均距离接近于0. –
Hi Nico。感谢您的回答。这看起来非常复杂。我想知道是否有更简单的方法来做到这一点?对不起,我英文很差。 –
你可以做的是用轮廓的第一个和最后一个点进行拟合,并检查其他点是否落在上面。你不需要检查所有的点来确定这一点,你可以简单地选择每个'第n'点。 –