1.介绍
OpenCV为开发者还提供了绘图功能,我们可以通过函数来实现在图片上作图。
2. line()
画线
cv2.line(img,开始点,结束点,颜色,线宽,线型,shift)
参数:img:在选中的图片上画;
开始点/结束点:开始坐标和结束坐标(x,y);
颜色:(b,g,r),作为元组输入,如果是灰度图像,直接填数字。
线宽:线或圆等的粗细。如果对闭合图形(如圆)传递-1 ,它将填充形状。默认厚度= 1
线型:线的类型,是否为8连接线,抗锯齿线等。默认情况下,为8连接线。cv.LINE_AA给出了抗锯齿的线条,看起来非常适合曲线
3.rectangle()
画矩形
cv2.rectangle(img,起始坐标,中止坐标,颜色,线宽,线型)
img:在选中的图片上画;
起始坐标,中止坐标:从左上角坐标开始,到右下角结束。
颜色:(b,g,r),作为元组输入,如果是灰度图像,直接填数字。
线宽:线或圆等的粗细。如果对闭合图形(如圆)传递-1 ,它将填充形状。默认厚度= 1
线型:线的类型,是否为8连接线,抗锯齿线等。默认情况下,为8连接线。cv.LINE_AA给出了抗锯齿的线条,看起来非常适合曲线。
4.circle()
画圆
cv2.circle(img,中心坐标,半径,颜色,线宽,线型)
img:在选中的图片上画;
中心坐标和半径:圆的中心坐标,半径。
颜色:(b,g,r),作为元组输入,如果是灰度图像,直接填数字。
线宽:线或圆等的粗细。如果对闭合图形(如圆)传递-1 ,它将填充形状。默认厚度= 1
线型:线的类型,是否为8连接线,抗锯齿线等。默认情况下,为8连接线。cv.LINE_AA给出了抗锯齿的线条,看起来非常适合曲线。
5. ellipse()
画椭圆
cv2.ellipse(img,中心位置,(长轴长,短轴长),angle,stratAngle,endAngle,颜色,线宽,线型)
img:在选中的图片上画;
中心位置:中心坐标
(长轴长,短轴长):元组的形式输入轴的长度。
angle:椭圆沿顺时针方向旋转的角度。
startAngle和endAngle:从主轴沿顺时针方向测量的椭圆弧的开始和结束。即给出0和360给出完整的椭圆。
6.polylines()
画多边形
cv2.polylines(img,点集,是否闭环,颜色)
img:在选中的图片上画;
点集:点的集合,如:[[10,5],[20,30],[70,20],[50,10]],并且点集的数据格式必须为np.int32
是否闭环:True\false
颜色:(b,g,r),作为元组输入,如果是灰度图像,直接填数字
7.fillPoly()
画实心的多边形
cv2.fillPoly(img,点集,颜色)
8. putText()
将文本放入图像中
cv2.putText(img,放入文字,起始坐标,font,字体大小,颜色,线宽,线型)
img:在选中的图片上画
放入文字:是一个字符串
起始坐标:放入位置的左下角坐标
font:文字类型,什么字体
字体大小:填数字
颜色:(b,g,r),作为元组输入,如果是灰度图像,直接填数字。
线宽:线或圆等的粗细。如果对闭合图形(如圆)传递-1 ,它将填充形状。默认厚度= 1
线型:线的类型,是否为8连接线,抗锯齿线等。默认情况下,为8连接线。cv2.LINE_AA给出了抗锯齿的线条,看起来非常适合曲线,也适合文字。
字体的标志:
代码示例
import cv2 import numpy as np # 创建一个黑色图片 img = np.zeros((480, 640, 3), np.uint8) # 画直线 cv2.line(img, (10, 10), (300, 300), (255, 255, 255)) # 画一个矩形,填上-1,是画实心矩形 cv2.rectangle(img, (10, 10), (100, 40),(255, 255, 0), -1) # 画一个实心圆 cv2.circle(img, (200, 200), 60, (0, 255, 255), -1, cv2.LINE_AA) # 画一个椭圆 cv2.ellipse(img, (300, 200), (50, 20), 30, 0, 180, (255, 255, 255), -1) # 画一个多边形 # 列表的形式创建一个数组 # 将数组以列表的形式传进去 arr = np.array([[100, 100], [100, 200], [300, 20], [400, 100]], np.int32) arr.reshape((-1, 1, 2)) cv2.polylines(img, [arr], False, (255, 255, 255)) # 填充多边形 cv2.fillPoly(img, [arr], (255, 0, 255)) # 加入字体 cv2.putText(img, "OpenCV", (50, 350), cv2.FONT_HERSHEY_SIMPLEX, 3, (255, 255, 255),lineType = cv2.LINE_AA) cv2.imshow('draw', img) cv2.waitKey(0) cv2.destroyAllWindows()
9.用鼠标在图片上作图
""" 用鼠标在图片上直接作图 按住键盘L,拖动鼠标画直线 按住键盘r,拖动鼠标画矩形 按住键盘c,拖动鼠标画圆 """ import cv2 import numpy as np curshape = 0 startpos = [0, 0] def mouse_callback(event, x, y, flags,userdata): global startpos, curshape if cv2.EVENT_LBUTTONDOWN == event: # 鼠标左键按下,获取起始坐标 startpos = [x, y] elif event == cv2.EVENT_LBUTTONUP: # 鼠标左键抬起, 获得终点坐标 if curshape == 0: # drawline cv2.line(img, startpos, (x, y), (255, 255, 255)) elif curshape == 1: # drawrectangle cv2.rectangle(img, startpos, (x, y), (255, 255, 255)) elif curshape == 2: # drawcircle a = (x - startpos[0]) b = (y - startpos[1]) r = int(((a**2)+(b**2))**0.5) #结果要强转一下 cv2.circle(img, startpos, r, (255, 255, 255)) # 创建窗口大小 cv2.namedWindow('drawing', cv2.WINDOW_NORMAL) cv2.resizeWindow('drawing', 640, 480) # 让该函数一直监听drawing界面,为了调用函数 cv2.setMouseCallback('drawing', mouse_callback) # 创建全黑图片 img = np.zeros((480, 640, 3), np.uint8) while True: cv2.imshow('drawing', img) key = cv2.waitKey(0)&0xff if key == ord('q'): print("退出成功") break elif key == ord('l'): # 线 curshape = 0 elif key == ord('r'): # 矩形 curshape = 1 elif key == ord('c'): # 圆 curshape = 2 else: print("输入错误,请重新输入") cv2.destroyAllWindows()
鼠标的回调函数,一定要传五个参数!第五个参数可以随便用一个参数来占位!