写一个程序,用opencv画贝塞尔曲线,要求可以在画布上点击设置控制点
时间: 2023-06-27 09:02:07 浏览: 89
手写opencv2实现贝塞尔bezier曲线
5星 · 资源好评率100%
以下是一个简单的程序,它使用OpenCV库在画布上绘制贝塞尔曲线。它允许用户通过单击鼠标来设置控制点,并且在每次单击时更新曲线。
``` python
import cv2
import numpy as np
# 定义鼠标回调函数
def draw(event, x, y, flags, param):
global img, points
if event == cv2.EVENT_LBUTTONDOWN:
# 在图像上绘制控制点
cv2.circle(img, (x, y), 5, (0, 0, 255), -1)
points.append((x, y))
# 如果已经有足够的控制点,就绘制贝塞尔曲线
if len(points) > 1:
pts = np.array(points, np.int32)
pts = pts.reshape((-1, 1, 2))
cv2.polylines(img, [pts], False, (0, 255, 0), 3, cv2.LINE_AA)
if len(points) > 2:
curve = np.array(points, np.float32)
curve = curve.reshape((-1, 1, 2))
cv2.polylines(img, [curve], False, (255, 0, 0), 3, cv2.LINE_AA)
bezier = cv2.approxPolyDP(curve, 3, True)
cv2.polylines(img, [bezier], False, (0, 255, 255), 3, cv2.LINE_AA)
# 创建空白图像
img = np.zeros((512, 512, 3), np.uint8)
points = []
# 创建窗口并绑定鼠标回调函数
cv2.namedWindow('Bezier Curve')
cv2.setMouseCallback('Bezier Curve', draw)
while True:
cv2.imshow('Bezier Curve', img)
key = cv2.waitKey(1) & 0xFF
if key == ord('q'):
break
cv2.destroyAllWindows()
```
该程序创建了一个空白图像,然后创建了一个窗口并将鼠标回调函数绑定到该窗口上。当用户单击图像时,回调函数将在单击位置绘制控制点,并在足够的控制点可用时绘制贝塞尔曲线。程序将继续等待用户操作,直到用户按下“q”键退出程序。
阅读全文