OpenCV绘图函数:cv2.line、cv2.circle、cv2.rectangle、cv2.ellipse、 cv2.putText()、cv2.setMouseCallback

​OpenCV是一个用于图像处理、分析、机器视觉方面的开源函数库。 不管你是做科学研究,还是商业应用,opencv都能够作为你理想的工具,它可以运行在Linux、Windows、Android和Mac OS操作系统上。OpenCV轻量级而且高效,它是由一系列 C 函数和少量 C++ 类构成,同时提供了Python、Ruby、MATLAB等语言的接口,实现了图像处理和计算机视觉方面的很多通用算法。OpenCV绘图函数:cv2.line、cv2.circle、cv2.rectangle、cv2.ellipse、 cv2.putText()、cv2.setMouseCallback_第1张图片

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 cv2import 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()

效果图如下所示:

OpenCV绘图函数:cv2.line、cv2.circle、cv2.rectangle、cv2.ellipse、 cv2.putText()、cv2.setMouseCallback_第2张图片

图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:

OpenCV绘图函数:cv2.line、cv2.circle、cv2.rectangle、cv2.ellipse、 cv2.putText()、cv2.setMouseCallback_第3张图片    

图2

OpenCV绘图函数:cv2.line、cv2.circle、cv2.rectangle、cv2.ellipse、 cv2.putText()、cv2.setMouseCallback_第4张图片

图3

3、画矩形

矩形函数为cv2.rectangle(),需要传入四个参数,分别为左上顶点和右下顶点,颜色,线条宽度。

#导入包import cv2import 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时的效果。

OpenCV绘图函数:cv2.line、cv2.circle、cv2.rectangle、cv2.ellipse、 cv2.putText()、cv2.setMouseCallback_第5张图片

      图4

  OpenCV绘图函数:cv2.line、cv2.circle、cv2.rectangle、cv2.ellipse、 cv2.putText()、cv2.setMouseCallback_第6张图片

图5

4、椭圆

椭圆函数是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 cv2import 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°时的效果图

OpenCV绘图函数:cv2.line、cv2.circle、cv2.rectangle、cv2.ellipse、 cv2.putText()、cv2.setMouseCallback_第7张图片  

图6

OpenCV绘图函数:cv2.line、cv2.circle、cv2.rectangle、cv2.ellipse、 cv2.putText()、cv2.setMouseCallback_第8张图片

 图7

5、多边形

多边形使用cv2.polylines(img,[pts],iscolse,color,thickness)函数,其中第二个参数是多边形顶点的集合,第三个参数是首尾点是否连接。需要注意的是,多边形的连接是与集点的顺序保持一致的。如我修改下第五行集点的顺序,会得到不一样的图。

import numpy as npimport cv2img=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顺序链接对应的多边形效果图:

   OpenCV绘图函数:cv2.line、cv2.circle、cv2.rectangle、cv2.ellipse、 cv2.putText()、cv2.setMouseCallback_第9张图片     

图8

OpenCV绘图函数:cv2.line、cv2.circle、cv2.rectangle、cv2.ellipse、 cv2.putText()、cv2.setMouseCallback_第10张图片

 图9

6、添加文字

使用cv2.putText(img,word,position,font,size,color,thickness)函数中,第二个参数是输入的文字,第三个参数是文字的位置,第四个参数是字体类型,第五个参数是字体大小。

import numpy as npimport cv2img=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_SIMPLEXcv2.putText(img,'opencv',(80,90), font, 2,(255,255,255),3)cv2.polylines(img,[pts],True,(0,255,0),2)

效果图如下:

OpenCV绘图函数:cv2.line、cv2.circle、cv2.rectangle、cv2.ellipse、 cv2.putText()、cv2.setMouseCallback_第11张图片

图10

7、用鼠标绘制图形

绘制图形使用的是cv2.setMouseCallback()函数,

使用时首先定义鼠标操作函数

def your_mouse_callback(event,x,y,flags,param):

定义完成后需要调用该函数

cv2.setMouseCallback(windowName,your_mouse_callback)

如下文所示代码为在背景图中通过双击鼠标左键画圆:

import cv2import numpy as npdef 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'):        breakcv2.destroyAllWindows()

效果图如下所示:

OpenCV绘图函数:cv2.line、cv2.circle、cv2.rectangle、cv2.ellipse、 cv2.putText()、cv2.setMouseCallback_第12张图片

图11


 

 

 

关注我们

我们的微信公众号是: Python机器学习和图像处理

 

 

 

 

你可能感兴趣的:(OpenCV绘图函数:cv2.line、cv2.circle、cv2.rectangle、cv2.ellipse、 cv2.putText()、cv2.setMouseCallback)