注意:这是一条自由曲线,但不是直线或折线,所以它可以更复杂。
我想计算的Angular (度)的自由曲线线上的每一个弯曲的立场,并希望显示曲线是大于45,小于45度。
它是用np.arccos()
方法计算两条连续曲线之间的夹角。
....
largest_contour = max(filter_coontour, key=cv2.contourArea)
# Simplify the curve using the Ramer-Douglas-Peucker algorithm
epsilon = 0.001 * cv2.arcLength(largest_contour, True)
simplified_curve = cv2.approxPolyDP(largest_contour, epsilon, True)
# Get the coordinates of the points along the simplified curve
curve_points = simplified_curve.reshape(-1, 2)
for i in range(1, len(curve_points)):
vector = curve_points[i] - curve_points[i - 1]
if prev_vector is not None:
dot = np.dot(vector, prev_vector)
norm = np.linalg.norm(vector) * np.linalg.norm(prev_vector)
angle = np.arccos(dot / norm) * 180 / np.pi
print("angle", angle)
....
上面是我的代码,但它没有给我准确的Angular 值。请参阅所附的图像
1条答案
按热度按时间zxlwwiss1#
如果使用Douglas-Peucker(或其他类似方法)简化曲线,则会引入像拉直段和更尖锐的方向变化这样的伪影。相反,您可能更喜欢使用稍微柔化形状的任何方法(例如模糊和阈值)。
X1 E0 F1 X描述了一种用于测量非手工绘制的曲线的局部属性(如Angular 和曲率)的方法。
基本上,使用三个相邻像素可以计算密切圆,从中可以导出局部笔划Angular 和曲率。
这三个像素不应该是连续的,否则你会得到一组有限的可能值。它们应该由2个或更多像素分隔,具体取决于您的分辨率。例如,您可以计算像素(0,3,6)的结果,将结果与像素3关联,然后计算(1,4,7)、(2,5,8)、.
我希望这能帮上忙。