绘图及交互
目标
- 绘制多种几何图形
- 使用鼠标与图像交互
- 使用滚动条进行交互
1. 绘画基础
绘制图形名称 | 绘制图形函数 |
---|---|
直线 | cv2.line() |
矩阵 | cv2.rectangle() |
圆形 | cv2.circle() |
椭圆形 | cv2.ellipse() |
多边形 | cv2.polylines() |
添加文字 | cv2.putText() |
1.1 绘制直线
img = cv2.line(img, pt1, pt2, color[, thickness[, lineType]])
程序中参数介绍:
- img:在其绘制的图形载体图像(也称画布,画板)
- color:绘制颜色
- thickness:线条的粗细
- lineType: 线条的类型,默认是8连线类型
- pt1: 线段的第一个点(起点)
- pt2: 线段的第二个点(终点)
要求:在一个黑色背景图像内绘制三条直线
import cv2
import numpy as np
n = 300
img = np.zeros((n+1,n+1,3),np.uint8) # 黑色背景
img = cv2.line(img, (0,0),(n,n),(255,0,0),3) # 蓝色直线
img = cv2.line(img, (0,100),(n,100),(0,255,0),1) # 绿色直线
img = cv2.line(img, (100,0),(100,n),(0,0,255),6) # 红色直线
winname = 'Demo19.1'
cv2.namedWindow(winname)
cv2.imshow(winname, img)
cv2.waitKey(0)
cv2.destroyAllWindows()
1.2 绘制矩阵
img = cv2.rectangle(img, pt1, pt2, color[, thickness[, lineType]])
程序中参数介绍:
- img:在其绘制的图形载体图像(也称画布,画板)
- color:绘制颜色
- thickness:线条的粗细
- lineType: 线条的类型,默认是8连线类型
- pt1: 矩阵顶点
- pt2: 矩阵pt1对角顶点
要求:在一个白色背景图像内绘制实心矩阵
import cv2
import numpy as np
n = 300
img = np.ones((n,n,3),np.uint8) * 255 # 白色背景
img = cv2.rectangle(img, (50,50),(n-100,n-100),(0,0,255),-1) # 红色矩阵
winname = 'Demo19.2'
cv2.namedWindow(winname)
cv2.imshow(winname, img)
cv2.waitKey(0)
cv2.destroyAllWindows()
1.3 绘制圆形
img = cv2.rectangle(img, pt1, pt2, color[, thickness[, lineType]])
程序中参数介绍:
- img:在其绘制的图形载体图像(也称画布,画板)
- color:绘制颜色
- thickness:线条的粗细
- lineType: 线条的类型,默认是8连线类型
- center为圆心
- radius为半径
要求1:在一个白色背景图像内绘制一组同心圆
import cv2
import numpy as np
d = 400
img = np.ones((d,d,3),np.uint8) * 255 # 白色背景
(centerX,centerY) = (round(img.shape[1] / 2),round(img.shape[0] / 2)) #设置圆点
red = (0,0,255)
for r in range(5, round(d/2), 12):
cv2.circle(img, (centerX, centerY), r, red, 3) # r 为半径
winname = 'Demo19.3'
cv2.namedWindow(winname)
cv2.imshow(winname, img)
cv2.waitKey(0)
cv2.destroyAllWindows()
要求2:在一个白色背景图像内绘制一组位置和大小随机的实心圆
import cv2
import numpy as np
d = 400
img = np.ones((d,d,3),np.uint8) * 255 # 白色背景
(centerX,centerY) = (round(img.shape[1] / 2),round(img.shape[0] / 2)) #设置圆点
red = (0,0,255)
for r in range(5, round(d/2), 12):
cv2.circle(img, (centerX, centerY), r, red, 3) # r 为半径
winname = 'Demo19.3'
cv2.namedWindow(winname)
cv2.imshow(winname, img)
cv2.waitKey(0)
cv2.destroyAllWindows()