使用 OpenCV 绘制长轴椭圆
Drawing ellipse with large axes with OpenCV
我正在尝试在图像中的两点之间绘制稍微弯曲的线(半径较大的圆弧)。为此,我使用 OpenCV 中的 ellipse
。 ellipse
对于 axes
参数的大值 (~5000) 性能有限:
startAngle
参数的微小变化(~0.1 度)不影响绘制的椭圆。绘制的椭圆大约每 0.9 度更新一次。由于 startAngle
参数是 float 类型,我希望步长变化更精细。
- 画出来的椭圆好像是由直线组成的。我再次期待更详细的信息。
演示所描述的行为:
重现代码:
import cv2
import numpy as np
radius = 5000
center = (-2500, 4300)
for i in range(31):
img = np.zeros((500, 500, 3), dtype=np.uint8)
start_angle = -59 + i / 10
cv2.ellipse(img, center=center, axes=(radius, radius), angle=0, startAngle=-59, endAngle=-54, color=(0, 0, 255), thickness=1)
cv2.ellipse(img, center=center, axes=(radius, radius), angle=0, startAngle=start_angle, endAngle=-54, color=(0, 255, 0), thickness=1)
cv2.putText(img, 'Start angle: {} deg'.format(start_angle), (10, 450), color=(0, 0, 255), fontScale=1, fontFace=cv2.FONT_HERSHEY_SIMPLEX)
cv2.imshow('', img)
cv2.waitKey(100)
cv2.imshow('', img)
cv2.waitKey()
有没有办法在没有上述限制的情况下在图像中的两点之间绘制略微弯曲的线?
编辑:
根据 Christoph 的 Rackwitz 回答,我创建了一个基于 cv2.polylines
:
绘制圆弧的函数
def arc(img, center, radius, start_angle, end_angle, points_count, color, thickness):
pts = []
for angle in np.linspace(start_angle, end_angle, points_count):
x = int(center[0] + radius * np.cos(angle * np.pi / 180))
y = int(center[1] + radius * np.sin(angle * np.pi / 180))
pts.append([x, y])
cv2.polylines(img, [np.array(pts)], isClosed=False, color=color, thickness=thickness)
与cv2.ellipse
比较:
import cv2
import numpy as np
def arc(img, center, radius, start_angle, end_angle, points_count, color, thickness):
pts = []
for angle in np.linspace(start_angle, end_angle, points_count):
x = int(center[0] + radius * np.cos(angle * np.pi / 180))
y = int(center[1] + radius * np.sin(angle * np.pi / 180))
pts.append([x, y])
cv2.polylines(img, [np.array(pts)], isClosed=False, color=color, thickness=thickness)
radius = 5000
center = (-2500, 4300)
start_angle = -59
end_angle = -54
img = np.zeros((500, 500, 3), dtype=np.uint8)
cv2.ellipse(img, center=center, axes=(radius, radius), angle=0, startAngle=start_angle, endAngle=end_angle, color=(0, 0, 255), thickness=1)
arc(img, center, radius, start_angle, end_angle, points_count=101, color=(0, 255, 0), thickness=1)
cv2.imshow('', img)
cv2.waitKey()
方法cv2.ellipse
(红色)画直线和解决方案基于cv2.polylines
(绿色)按要求画稍微弯曲的线。
您可以绘制多段线并自己计算线段的坐标。
我正在尝试在图像中的两点之间绘制稍微弯曲的线(半径较大的圆弧)。为此,我使用 OpenCV 中的 ellipse
。 ellipse
对于 axes
参数的大值 (~5000) 性能有限:
startAngle
参数的微小变化(~0.1 度)不影响绘制的椭圆。绘制的椭圆大约每 0.9 度更新一次。由于startAngle
参数是 float 类型,我希望步长变化更精细。- 画出来的椭圆好像是由直线组成的。我再次期待更详细的信息。
演示所描述的行为:
重现代码:
import cv2
import numpy as np
radius = 5000
center = (-2500, 4300)
for i in range(31):
img = np.zeros((500, 500, 3), dtype=np.uint8)
start_angle = -59 + i / 10
cv2.ellipse(img, center=center, axes=(radius, radius), angle=0, startAngle=-59, endAngle=-54, color=(0, 0, 255), thickness=1)
cv2.ellipse(img, center=center, axes=(radius, radius), angle=0, startAngle=start_angle, endAngle=-54, color=(0, 255, 0), thickness=1)
cv2.putText(img, 'Start angle: {} deg'.format(start_angle), (10, 450), color=(0, 0, 255), fontScale=1, fontFace=cv2.FONT_HERSHEY_SIMPLEX)
cv2.imshow('', img)
cv2.waitKey(100)
cv2.imshow('', img)
cv2.waitKey()
有没有办法在没有上述限制的情况下在图像中的两点之间绘制略微弯曲的线?
编辑:
根据 Christoph 的 Rackwitz 回答,我创建了一个基于 cv2.polylines
:
def arc(img, center, radius, start_angle, end_angle, points_count, color, thickness):
pts = []
for angle in np.linspace(start_angle, end_angle, points_count):
x = int(center[0] + radius * np.cos(angle * np.pi / 180))
y = int(center[1] + radius * np.sin(angle * np.pi / 180))
pts.append([x, y])
cv2.polylines(img, [np.array(pts)], isClosed=False, color=color, thickness=thickness)
与cv2.ellipse
比较:
import cv2
import numpy as np
def arc(img, center, radius, start_angle, end_angle, points_count, color, thickness):
pts = []
for angle in np.linspace(start_angle, end_angle, points_count):
x = int(center[0] + radius * np.cos(angle * np.pi / 180))
y = int(center[1] + radius * np.sin(angle * np.pi / 180))
pts.append([x, y])
cv2.polylines(img, [np.array(pts)], isClosed=False, color=color, thickness=thickness)
radius = 5000
center = (-2500, 4300)
start_angle = -59
end_angle = -54
img = np.zeros((500, 500, 3), dtype=np.uint8)
cv2.ellipse(img, center=center, axes=(radius, radius), angle=0, startAngle=start_angle, endAngle=end_angle, color=(0, 0, 255), thickness=1)
arc(img, center, radius, start_angle, end_angle, points_count=101, color=(0, 255, 0), thickness=1)
cv2.imshow('', img)
cv2.waitKey()
方法cv2.ellipse
(红色)画直线和解决方案基于cv2.polylines
(绿色)按要求画稍微弯曲的线。
您可以绘制多段线并自己计算线段的坐标。