学习openCV
基本操作
读取图像:
显示图像:
保存图像:
画图
画线:
画一条从左上方到右下角的蓝色线段
要告诉函数这条线的起点和终点
# 生成一张黑色的图像
img = np.zeros((512, 512, 3), dtype=np.uint8)
# 画出一条粗细为5px的蓝色线段
cv2.line(img, (0, 0), (511, 511), (255, 0, 0), 5)
# 使用cv显示图像
cv2.imshow("img", img)
cv2.waitKey(0)
cv2.destroyAllWindows()
# 使用plt显示图像
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
plt.imshow(img)
plt.show()
画方形:
参数:左上角坐标和右下角坐标
我们在图片的右上方位置画一个绿色的方形
img = np.zeros((512, 512, 3), dtype=np.uint8)
cv2.rectangle(img, (384, 0), (310, 128), (0, 255, 0), 3)
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
plt.imshow(img)
plt.show()
画圆:
要画圆的话,只需要指定圆形的中心坐标和半径大小。
img = np.zeros((512, 512, 3), dtype=np.uint8)
cv2.circle(img, center=(250, 250), radius=30, color=(255, 0, 0), thickness=5)
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
plt.imshow(img)
plt.show()
画椭圆:
ellipse(img,center,axes,angle,startAngle,endAngle,color,thickness,lineType)
img:椭圆在哪个图片上画
center:椭圆中心点位置
axes:长轴和短轴的长度
angle:整个椭圆延逆时针方向旋转的角度
startAngle,endAngle:椭圆弧面沿顺时针方向起始的角度和结束角度,如果是0,360,就是整个椭圆在图片中间绘制半个椭圆。
img = np.zeros((512, 512, 3), dtype=np.uint8)
cv2.ellipse(img, (250, 250), (50, 30), 0, 0, 360, (255, 0, 0), 5)
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
plt.imshow(img)
plt.show()
画多边形:
画多边形,实际是在画一组线段。
要绘制多边形,首先需要顶点的坐标。
将这些点组成一个形状为ROWS×1×2的数组,其中ROWS是顶点的数量,类型必须为int32.
这里我们用黄色画了一个有四个顶点的小多边形。
# 生成一张黑色的图像
img = np.zeros((512, 512, 3), dtype=np.uint8)
pts = np.array([[100, 100], [300, 150], [400, 400], [50, 350]], np.int32)
# 如果这里的True改为False,将会得到连接点的折线,而不是封闭的图形。
cv2.polylines(img, [pts], True, (0, 255, 255), 10)
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
plt.imshow(img)
plt.show()
在图片上添加文字:
要在图片上绘制文字,你需要设置下列参数:
- 要绘制的文字
- 要绘制的位置
- 字体类型
- 字体大小
- 文字的一般属性如颜色、粗细、线条类型等
img = np.zeros((512, 512, 3), dtype=np.uint8)
font = cv2.FONT_HERSHEY_SIMPLEX
cv2.putText(img, 'Opencv', (10, 300), font,4, (255, 255, 255), 10)
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
plt.imshow(img)
plt.show()
案例(绘制一个opencv的logo):
img = np.full((512, 512, 3), fill_value=255, dtype=np.uint8)
cv2.ellipse(img, (269, 106), (100, 100), 0, 0, 360, (0, 0, 255), -1)
cv2.ellipse(img, (160, 300), (100, 100), 0, 0, 360, (0, 255, 0), -1)
cv2.ellipse(img, (269, 106), (40, 40), 0, 0, 360, (255, 255, 255), -1)
cv2.ellipse(img, (160, 300), (40, 40), 0, 0, 360, (255, 255, 255), -1)
pts = np.array([[269, 106], [160, 300], [390, 300]], np.int32)
cv2.polylines(img, [pts], True, (255, 255, 255), 1)
cv2.fillPoly(img, [pts], (255, 255, 255))
cv2.ellipse(img, (390, 300), (100, 100), 0, -60, 240, (255, 0, 0), -1)
cv2.ellipse(img, (390, 300), (40, 40), 0, 0, 360, (255, 255, 255), -1)
cv2.putText(img, "OpenCV", (100, 480), cv2.FONT_HERSHEY_SIMPLEX,3, (0, 0, 0), 5)
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
plt.imshow(img)
plt.show()
鼠标绘图与调色板
鼠标当画笔
学习使用OpenCV处理鼠标事件
主要函数:cv.setMouseCallback()
查看支持的鼠标操作
你可以通过执行下列代码查看所有被支持的鼠标事件
events = [i for i in dir(cv2) if 'EVENT' in i]
print(events)
fonts = [i for i in dir(cv2) if 'FONT' in i]
print(fonts)
双击鼠标画出一个圆
响应鼠标动作的程序模式差不多,只是函数不一样而已。
下面我们创建一个程序,可以每双击鼠标画出一个圆,按"esc"退出
# 响应鼠标操作的函数
def draw_circle(event, x, y, flags, param):
if event == cv2.EVENT_LBUTTONDBLCLK:
cv2.circle(img, (x, y), 100, (255, 0, 0), -1)
img = np.zeros((512, 512, 3), np.uint8)
cv2.namedWindow("image")
cv2.setMouseCallback("image", draw_circle)
while (1):
cv2.imshow("image", img)
if cv2.waitKey(1000) & 0xFF == 27:
break
cv2.destroyAllWindows()
拖动鼠标绘制矩形或圆圈
根据我们选择的模式在拖动鼠标时绘制矩形或者是曲线(就像画图程序中一样)
我们的回调函数包含两部分,一部分画矩形,一部分画曲线
这个例子可以帮助理解人机交互程序的原理,如物体跟踪,图像分割等
# 默认False,鼠标按下是为True
drawing = False
# if True,画出矩形,按'm'切换到曲线。
mode = True
ix, iy = -1, -1
# 响应鼠标的函数
def draw_circle(event, x, y, flags, param):
global ix, iy, drawing, mode
if event == cv2.EVENT_LBUTTONDOWN:
drawing = True
ix, iy = x, y
elif event == cv2.EVENT_MOUSEMOVE:
if drawing == True:
if mode == True:
cv2.rectangle(img, (ix, iy), (x, y), (0, 255, 0), -1)
else:
cv2.circle(img, (x, y), 5, (0, 0, 255), -1)
elif event == cv2.EVENT_LBUTTONUP:
drawing = False
if mode == True:
cv2.rectangle(img, (ix, iy), (x, y), (0, 255, 0), -1)
else:
cv2.circle(img, (x, y), 5, (0, 0, 255), -1)
img = np.zeros((512, 512, 3), np.uint8)
cv2.namedWindow("image")
cv2.setMouseCallback("image", draw_circle)
while (1):
cv2.imshow("image", img)
k = cv2.waitKey(1) & 0xFF
# 按下‘m'键切换模式
if k == ord('m'):
mode = not mode
elif k == 27:
break
cv2.destroyAllWindows()
案例:鼠标绘图,使用调色板调节颜色
def nothing(x):
pass
def draw(event, x, y, flags, param):
global ix, iy, drawing
if event == cv2.EVENT_LBUTTONDOWN:
ix = x
iy = y
elif event == cv2.EVENT_LBUTTONUP:
r = cv2.getTrackbarPos("R", "image")
g = cv2.getTrackbarPos("G", "image")
b = cv2.getTrackbarPos("B", "image")
cv2.rectangle(img, (ix, iy), (x, y), (r, g, b), -1)
img = np.full((512, 512, 3), 255, np.uint8)
cv2.namedWindow("image")
cv2.setMouseCallback("image", draw)
cv2.createTrackbar("R", "image", 0, 255, nothing)
cv2.createTrackbar("G", "image", 0, 255, nothing)
cv2.createTrackbar("B", "image", 0, 255, nothing)
while (1):
cv2.imshow("image", img)
k = cv2.waitKey(1) & 0xFF
if k == 27:
break
cv2.destroyAllWindows()