OpenCV是一个用于图像处理、分析、机器视觉方面的开源函数库。 不管你是做科学研究,还是商业应用,opencv都能够作为你理想的工具,它可以运行在Linux、Windows、Android和Mac OS操作系统上。OpenCV轻量级而且高效,它是由一系列 C 函数和少量 C++ 类构成,同时提供了Python、Ruby、MATLAB等语言的接口,实现了图像处理和计算机视觉方面的很多通用算法。
opencv绘图函数主要有cv2.line()画线函数,cv2.circle()画圆函数, cv2.rectangle()长方形函数,cv2.ellipse()椭圆函数, cv2.putText()文字绘制函数及鼠标交互图像绘制。
本文中编程语言使用python,用到的包为opencv-python,在终端安装命令为:
pip install opencv-python
或者
pip install opencv-contrib-python
1、画直线
画线函数是cv2.line(),需传入的参数是背景(图像),起点坐标,终点坐标,线条颜色和线条宽度五个参数。
#导入包
import cv2
import numpy as np
#创建一个图像,300×400大小,数据类型无符号8位
img=np.zeros((500,500,3),np.uint8)
cv2.line(img,(50,50),(100,400),(0,255,0),3)#绿色,3个像素宽度
#创建窗口,显示结果
cv2.namedWindow("image")
cv2.imshow('image', img)
cv2.waitKey (2000) # 显示 20000 ms 即 2s 后消失,改为0即手动关闭
cv2.destroyAllWindows()
效果图如下所示:
图1
2、画圆
cv2.circle(img,center = (width // 2, height // 2) , radius = int(min(height, width) / 3) , color = 0, thickness = -1)
画圆函需要传入5个参数分别为背景图像,圆心,半径,圆的颜色和线宽,当thickness=-1时,将圆填满。
#导入包
import cv2
import numpy as np
#创建一个图像,300×400大小,数据类型无符号8位
img = cv2.imread(r'D:/test.jpg',cv2.IMREAD_UNCHANGED)
height, width = img.shape[:2]
height = int(height)
width = int(width)
circleIn = cv2.circle(img,center = (width // 2, height // 2) , radius = int(min(height, width) / 3) , color = 0, thickness = 2)
cv2.imwrite(r'D:/test_out2.jpg',circleIn)
#创建窗口,显示结果
cv2.namedWindow("image")
cv2.imshow('image', img)
cv2.waitKey (0)
cv2.destroyAllWindows()
当函数的参数thickness=-1thickness=正数时,
效果图分别如下图2和图3:
图2
图3
矩形函数为cv2.rectangle(),需要传入四个参数,分别为左上顶点和右下顶点,颜色,线条宽度。
#导入包
import cv2
import numpy as np
#创建一个图像,300×400大小,数据类型无符号8位
img = cv2.imread(r'D:/test.jpg',cv2.IMREAD_UNCHANGED)
height, width = img.shape[:2]
height = int(height)
width = int(width)
img2 = cv2.rectangle(img,(100,100),(300,180),(134,2,34),-1)
#cv2.imwrite函数是保存图像到指定路径
cv2.imwrite(r'D:/test_out2.jpg',img2)
#创建窗口,显示结果
cv2.namedWindow("image")
cv2.imshow('image', img2)
cv2.waitKey (0)
cv2.destroyAllWindows()
图4、图5分别为cv2.rectangle()函数中,最后一个参数为10和-1时的效果。
图4
图5
椭圆函数是cv2.ellipse(img, center, axes, angle, startAngle, endAngle, color, thickness, lineType, shift)
其中参数的含义如下:
img:需要绘图的图像
center:椭圆中心点坐标
axes:椭圆尺寸(即长短轴)
angle:旋转角度(顺时针方向)
startAngle:绘制的起始角度(顺时针方向)
endAngle:绘制的终止角度(例如,绘制整个椭圆是0,360,绘制下半椭圆就是0,180)
color:线条颜色(BGR)
thickness:线条粗细(默认值=1)
lineType:线条类型(默认值=8)
shift:圆心坐标点和数轴的精度(默认值=0)
#导入包
import cv2
import numpy as np
#创建一个图像,300×400大小,数据类型无符号8位
img=np.zeros((500,500,3),np.uint8)
cv2.ellipse(img,(256,256),(100,50),0,0,180,(20,213,79),-1)
#创建窗口,显示结果
cv2.namedWindow("image")
cv2.imshow('image', img)
cv2.waitKey (0)
cv2.destroyAllWindows()
图6、图7分别为旋转角为180°和360°时的效果图
图6
图7
多边形使用cv2.polylines(img,[pts],iscolse,color,thickness)函数,其中第二个参数是多边形顶点的集合,第三个参数是首尾点是否连接。需要注意的是,多边形的连接是与集点的顺序保持一致的。如我修改下第五行集点的顺序,会得到不一样的图。
import numpy as np
import cv2
img=np.zeros((512,512,3), np.uint8)
#使用numpy生成一组点
pts1=np.array([[20,20],[350,40],[420,400],[60,420]], np.int32)
pts=pts1.reshape((-1,1,2))
cv2.polylines(img,[pts],True,(0,255,0),2)
cv2.imshow('opencv',img)
cv2.waitKey(0)
cv2.destroyAllWindows()
图8、图9分别是pts1和pts2顺序链接对应的多边形效果图:
图8
图9
使用cv2.putText(img,word,position,font,size,color,thickness)函数中,第二个参数是输入的文字,第三个参数是文字的位置,第四个参数是字体类型,第五个参数是字体大小。
import numpy as np
import cv2
img=np.zeros((512,512,3), np.uint8)
#使用numpy生成一组点
pts1=np.array([[20,20],[350,40],[420,400],[60,420]], np.int32)
pts=pts1.reshape((-1,1,2))
#使用特定字体,添加文字
font=cv2.FONT_HERSHEY_SIMPLEX
cv2.putText(img,'opencv',(80,90), font, 2,(255,255,255),3)
cv2.polylines(img,[pts],True,(0,255,0),2)
效果图如下:
图10
绘制图形使用的是cv2.setMouseCallback()函数,
使用时首先定义鼠标操作函数
def your_mouse_callback(event,x,y,flags,param):
定义完成后需要调用该函数
cv2.setMouseCallback(windowName,your_mouse_callback)
如下文所示代码为在背景图中通过双击鼠标左键画圆:
import cv2
import numpy as np
def CircleCallback(event,x,y,flags,param):
if event==cv2.EVENT_LBUTTONDBLCLK:
cv2.circle(img,(x,y),50,(76,201,255),1)
print('圆心坐标x=:{0},y=:{1}'.format(x,y))
img=cv2.imread('D:/tower.jpg',1)
print(img.dtype)
cv2.namedWindow('mouse_callback')
cv2.setMouseCallback('mouse_callback',CircleCallback)
while(True):
cv2.imshow('mouse_callback',img)
#这里注意cv2.waitKey()里面等待时间不要写0,否则画面不刷新。切记!!!
if cv2.waitKey(10)&0xFF==ord('q'):
break
cv2.destroyAllWindows()
效果图如下所示:
图11
关注我们
我们的微信公众号是: Python机器学习和图像处理