cv2.line(),cv2.rectangle(),cv2.circle(),cv2.ellipse(),cv2.polylines()
目标
·学会使用open cv绘制几何形状学会使用函数
·cv2.line(),cv2.circle(),cv2.rectangle,cv2.ellipse()等代码在以上的所有函数中,你将会看到一些相同的参数:
·img:就是绘制的形状所在的图像
·color:就是绘制形状所用的颜色,对于BGR通道,传递一个元组(B,G,R)。对于灰度图。只要传递一个灰度值
·thickness:线条或者圆圈的厚度。如果封闭的图形并且该值是-1的话,形状的内部会被填充。default thickness=1
·lineType:线条的形状,八连通直线,反走样直线(比像素点直线平滑)等。默认值是八连通直线,cv2.LINE_AA给出的是反走样直线,因为反走样直线的算法,使得它不是单纯使用像素值绘制,因而显得平滑。有两篇文章解答了我对八连接直线和反走样直线的问题:
https://blog.csdn.net/jssyy123/article/details/42007565(反走样直线)
https://blog.csdn.net/Young__Fan/article/details/82696276(八连通直线)
绘制直线
给定初始和结尾的坐标值。
import numpy as np
import cv2
img = np.zeros((512,512,3), np.uint8)
#img为一个纯黑色的背景
img = cv2.line(img,(0,0),(511,511),(255,0,0),5)
画一个矩形
给出左上角和右下角的坐标值。
img = cv2.rectangle(img,(384,0),(510,128),(0,255,0),3)
画圆
圆心坐标和半径
img = cv2.circle(img,(447,63), 63, (0,0,255), -1)
画椭圆
要绘制一个椭圆,我们需要传递几个参数,一个是椭圆的中心点坐标。下一个是轴长度(第一主轴和第二主轴),angle是绘制椭圆的完整程度,从startangle开始逆时针旋转到endangle。例如给startangle赋值0,endangle赋值360就是一整个椭圆。下面是函数的参数:
def ellipse(img, center, axes, angle, startAngle, endAngle, color, thickness=None, lineType=None, shift=None).
· @param img Image.
. @param center Center of the ellipse.
. @param axes Half of the size of the ellipse main axes.
. @param angle Ellipse rotation angle in degrees.
. @param startAngle Starting angle of the elliptic arc in degrees.
. @param endAngle Ending angle of the elliptic arc in degrees.
. @param color Ellipse color.
. @param thickness Thickness of the ellipse arc outline, if positive. Otherwise, this indicates that . a filled ellipse sector is to be drawn.
. @param lineType Type of the ellipse boundary. See #LineTypes
. @param shift Number of fractional bits in the coordinates of the center and values of axes.
分别是:第一个是中心点的坐标,一个元组;第二个两条半主轴的长度,也就是椭圆方程里面的长半轴与短半轴,也是一个元组。第三个是椭圆相对于水平旋转的角度,逆时针方向旋转。第四个参数和第五个参数一起使用,第四个参数是椭圆开始的角度(与水平的夹角),第五个是椭圆结束的角度(与水平的角度)。两个参数表示了能显示的椭圆的部分;比如0,180代表显示一半的椭圆,因为整个椭圆的角度是360。第六个是线条的颜色,可以是长为三的元组,代表BGR颜色,也可以是一个数字,代表颜色的深度(在这个数字为255的时候是纯蓝色,为0的时候是黑色)。第七个参数是线条的宽度,如果是负数就代表要完全填充所画的图形。第八个参数是线条类型,有八连通线条,反走样线条(其他的我就不知道了)。第九个是浮点数的精度,就是中心点的坐标和主轴长度的精度。
绘制多边形
首先要全部给出点的坐标,但是这些点的坐标又必须转化为一个RAWSx1x2的数组,也就是行数可以改变,但是其他两个维度必须是1和2的三维数组,并且是numpy中的有符号的32位数。
def polylines(img, pts, isClosed, color, thickness=None, lineType=None, shift=None)
. @param img Image.
. @param pts Array of polygonal curves.
. @param isClosed Flag indicating whether the drawn polylines are closed or not. If they are closed,
. the function draws a line from the last vertex of each curve to its first vertex.
. @param color Polyline color.
. @param thickness Thickness of the polyline edges.
. @param lineType Type of the line segments. See #LineTypes
. @param shift Number of fractional bits in the vertex coordinates.
pts = np.array([[10,5],[20,30],[70,20],[50,10]], np.int32)
pts = pts.reshape((-1,1,2))
#因为数组的转化是相对应的,元素的个数不会减少,因此使用-1来代表第一个维度是不确定的,numpy会自动计算一维的值
img = cv2.polylines(img,[pts],True,(0,255,255))
画多边形除了注意坐标点转化为一个三维矩阵之外还需要注意个布尔参数i是isClosed。决定了多边形是否闭合