[英]Opencv: How to draw a circle contour on an image
我已經編寫了一個python函數,該函數應該在圖像上繪制一個圓,該圓的中心點已使用鼠標回調來定義:
def draw_circle_contour(frame, pt, radius):
cv2.circle(frame, center=pt, radius=3, color=(255,0,0), thickness=-1)
discretized_circle_contour_x = [pt[0] + radius*np.cos(theta) for theta in np.linspace(0, 36, 36)]
discretized_circle_contour_x = map(int, discretized_circle_contour_x)
discretized_circle_contour_y = [pt[1] + radius*np.sin(theta) for theta in np.linspace(0, 36, 36)]
discretized_circle_contour_y = map(int, discretized_circle_contour_y)
discretized_circle_contour = zip(discretized_circle_contour_x, discretized_circle_contour_y)
for el in discretized_circle_contour:
cv2.circle(frame, center=el, radius=2, color=(255,0,0), thickness=-1)
現在,當我將theta指定在np.linspace(0,360,360)
內時,這將非常np.linspace(0,360,360)
。 但是,我現在只想繪制一個圓的1/10。 即我想繪制一個圓形輪廓,其中被遮蓋的角度為36°。 我認為這段代碼應該可以工作,但是由於某種原因,運行它時,結果看起來像這樣:
這里發生了什么? 誰能告訴?
正如您所指出的:除了繪制小圓圈/點外,我還可以使用cv2.polylines
繪制一個圓弧段。 這僅需要將最后兩行替換為:
for el in discretized_circle_contour:
help.append(list(el))
cv2.polylines(frame, [np.asarray(help)], isClosed=False, color=(255,0,0), thickness=1)
但是,我仍然面臨該段被多次繪制的問題,而我希望在[0,36]度之間僅繪制一次!
……我才發現原因:角度theta
需要以弧度而不是度為單位。 Whops。
發生的情況是,您在discretized_circle_contour
中的每個點上繪制了一個半徑為2的填充圓(看起來像一個點,因為半徑很小)。
如果我正確理解了您的問題,那么您真正想要的只是一個跨過半徑1/10的弧形。 您已經有了[0,36]度的拱門點,只需將其繪制為折線即可:
cv2.polylines(frame, [discretized_circle_contour], False, 1)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.