opencv 画笔
时间: 2023-11-08 09:04:26 浏览: 144
在 OpenCV 中,可以使用画笔绘制各种形状和线条。首先,您需要创建一个画布来绘制,然后选择颜色和线宽。接下来,您可以使用不同的函数来绘制不同的形状和线条,如下所示:
1. 绘制线条:使用 `line()` 函数可以绘制一条直线。您需要指定起始点和终止点的坐标,以及颜色和线宽。
2. 绘制矩形:使用 `rectangle()` 函数可以绘制一个矩形。您需要指定矩形的左上角和右下角的坐标,以及颜色和线宽。
3. 绘制圆形:使用 `circle()` 函数可以绘制一个圆形。您需要指定圆心的坐标、半径大小,以及颜色和线宽。
4. 绘制椭圆:使用 `ellipse()` 函数可以绘制一个椭圆。您需要指定中心点的坐标、长轴和短轴的长度,旋转角度,起始角度和结束角度,以及颜色和线宽。
5. 绘制多边形:使用 `polylines()` 函数可以绘制一个多边形。您需要提供多边形的顶点坐标,并指定是否封闭多边形、颜色和线宽。
这些函数都需要指定一个画布(图像)来进行绘制操作。
相关问题
opencv手势控制画笔代码
以下是一个简单的使用OpenCV实现手势控制画笔的代码示例:
```python
import cv2
import numpy as np
# 创建回调函数,用于调节笔画大小
def change_brush_size(x):
global brush_size
brush_size = x
# 创建回调函数,用于调节笔画颜色
def change_brush_color(x):
global brush_color
brush_color = (x, x, x)
# 定义全局变量
brush_size = 5
brush_color = (255, 255, 255)
drawing = False
# 创建画布
canvas = np.zeros((480, 640, 3), dtype=np.uint8)
# 读取摄像头
cap = cv2.VideoCapture(0)
while True:
# 读取每一帧图像
ret, frame = cap.read()
# 转换为HSV颜色空间
hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)
# 获取手部区域
# 这里使用了基于肤色的手部检测方法,你也可以使用其他手势检测方法
lower_skin = np.array([0, 20, 70], dtype=np.uint8)
upper_skin = np.array([20, 255, 255], dtype=np.uint8)
mask = cv2.inRange(hsv, lower_skin, upper_skin)
contours, hierarchy = cv2.findContours(mask, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
if len(contours) > 0:
max_contour = max(contours, key=cv2.contourArea)
x, y, w, h = cv2.boundingRect(max_contour)
hand = frame[y:y+h, x:x+w]
# 显示手部区域并进行笔画操作
cv2.rectangle(frame, (x, y), (x+w, y+h), (0, 255, 0), 2)
if drawing:
cv2.circle(canvas, (x+w//2, y+h//2), brush_size, brush_color, -1)
# 显示图像
cv2.imshow('frame', frame)
cv2.imshow('canvas', canvas)
# 按下b键清空画布
if cv2.waitKey(1) & 0xFF == ord('b'):
canvas = np.zeros((480, 640, 3), dtype=np.uint8)
# 按下d键开始/停止绘画
if cv2.waitKey(1) & 0xFF == ord('d'):
drawing = not drawing
# 滑动条调节笔画大小和颜色
cv2.createTrackbar('brush_size', 'frame', 5, 20, change_brush_size)
cv2.createTrackbar('brush_color', 'frame', 255, 255, change_brush_color)
# 按下q键退出
if cv2.waitKey(1) & 0xFF == ord('q'):
break
# 释放摄像头并关闭窗口
cap.release()
cv2.destroyAllWindows()
```
该代码使用肤色检测方法获取到手部区域,并根据手势进行笔画操作。用户可以使用滑动条调节笔画大小和颜色,按下b键清空画布,按下d键开始/停止绘画。注意,使用该代码需要保证手部区域在摄像头视野内,且手势稳定。
利用opencv和turtle自动画图
这里提供一个例子,使用opencv和turtle画一个简单的笑脸:
```python
import cv2
import numpy as np
import turtle
# 创建画布和画笔
screen = turtle.Screen()
screen.setup(600, 600)
turtle.penup()
# 读取笑脸图像
img = cv2.imread('smile.png')
# 获取笑脸轮廓
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
ret, thresh = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY)
contours, hierarchy = cv2.findContours(thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
# 定义画图函数
def draw_contour(contour):
turtle.goto(contour[0][0][0]-300, 300-contour[0][0][1])
turtle.pendown()
for point in contour:
x, y = point[0]
turtle.goto(x-300, 300-y)
turtle.penup()
# 画笑脸轮廓
for contour in contours:
draw_contour(contour)
# 画眼睛
turtle.goto(-130, 120)
turtle.dot(30)
turtle.goto(20, 120)
turtle.dot(30)
# 画嘴巴
turtle.goto(-100, 0)
turtle.pendown()
turtle.circle(100, 90)
turtle.circle(100, 90)
# 完成画图
turtle.done()
```
需要注意的是,这里使用了一张名为“smile.png”的笑脸图像作为参考,需要自己先准备好这个图像。另外,使用opencv读取图像时,需要注意颜色通道的顺序,这里使用的是BGR顺序。
阅读全文