Bootstrap

【python-opencv】绘图基础 line() rectangle() circle() ellipse() polylines() fillPoly() putText() 八千字详解~

目录

绘制直线: cv2.line()函数

 一般格式为:

代码示例 读取图像绘制直线:

代码示例 自定义画布: 

绘制矩形:cv2.rectangle()函数 

一般格式为:

代码示例 读取图像绘制矩形:

代码示例 自定义画布: 

绘制圆形:cv2.circle()函数 

一般格式为:

代码示例 读取图像随机绘制实心圆:

代码示例 自定义画布绘制同心圆 :

绘制椭圆:cv2.ellipse()函数:

一般格式:

代码示例 自定义画布生成随机椭圆:   

绘制多边形: cv2.polylines()函数:

一般格式:       

 代码示例 自定义画布生成多边形: 

绘制填充多边形: cv2.fillPoly()函数: 

一般格式:

代码示例 自定义画布生成填充多边形:  

绘制文本: putText()函数:

一般格式:

 代码示例 自定义画布生成镜像文字和手写文字: ​​​​​​​ 

结束


绘制直线: cv2.line()函数

 一般格式为:

        image = cv2.line(image,pt1,pt2,color[,thickness,[lineType,[shift]]])    # []表示可省略

参数: 

        ~image:要绘制的图像

        ~pt1:线段的起点, (x, y)格式的元组

        ~pt2:线段的终点,(x, y)格式的元组

        ~color:所绘制直线的颜色,(b, g, r)格式的元组,或者表示灰度值的标量

        ~thickness:直线的粗细,数字越大线越粗

        ~lineType:直线的类型,为-1,4,8,16,默认为8,(只有实线,数字越大线的锯齿状(毛刺)越不明显)

        ~shift:坐标的缩放比例,(一般不用,省略参数)

代码示例 读取图像绘制直线:

import cv2
import numpy as np


# 读取一张图片
img = cv2.imread(R"C:\Users\lyx15\Pictures\OIP-C.jpg")
# 获取图像的宽和高
rows,cols = img.shape[:2] # 高 宽
print(rows,cols) # 不要超过该数,否则直线会不显示
# 使用shape方法来获取图像的形状信息。
# 返回的形状信息是一个元组(rows, cols, channels),
# 其中rows表示图像的高度,cols表示图像的宽度,channels表示图像的通道数(例如,RGB图像具有3个通道)。
# 在给定的代码中,使用shape方法获取图像的形状信息,
# 并使用[:2]切片操作来获取元组的前两个元素,
# 即图像的高度(rows)和宽度(cols),赋值给变量rows,cols。

# 绘制三条线段
img = cv2.line(img,(0,0),(cols,rows),(0,0,255),3) # 请注意,在OpenCV中,坐标的排列方式是(x, y),其中x表示图像的宽度(沿水平方向),y表示图像的高度(沿垂直方向)。
img = cv2.line(img,(cols-150,0),(cols-150,rows),(255,255,255),5)
img = cv2.line(img,(0,rows-150),(cols,rows-150),(255,0,0),7)

cv2.imshow("img",img)

cv2.waitKey(0)
cv2.destroyWindow()

现象:

代码示例 自定义画布: 

import cv2
import numpy as np

n=300
# 创建一个纯黑图片
img2 = np.zeros((n,n,3),np.uint8) # 索引从0开始
img2 = cv2.line(img2,(0,0),(n,n),(0,0,255),3) # 请注意,在OpenCV中,坐标的排列方式是(x, y),其中x表示图像的宽度(沿水平方向),y表示图像的高度(沿垂直方向)。
img2 = cv2.line(img2,(150,0),(150,n),(255,255,255),5)
img2 = cv2.line(img2,(0,150),(n,150),(255,0,0),7)
cv2.imshow("img2",img2)

cv2.waitKey(0)
cv2.destroyWindow()

现象: 

绘制矩形:cv2.rectangle()函数 

一般格式为:

image = cv2.rectangle(image,pt1,pt2,color[,thickness,[lineType,[shift]]])    # []表示可省略

参数: 

        ~image:要绘制的图像

        ~pt1:线段的起点,(x, y)格式的元组

        ~pt2:线段的终点,(x, y)格式的元组

        ~color:所绘制直线的颜色,(b, g, r)格式的元组,或者表示灰度值的标量

        ~thickness:直线的粗细,数字越大线越粗

        ~lineType:直线的类型,为-1,4,8,16,默认为8,(只有实线,数字越大线的锯齿状(毛刺)越不明显)

        ~shift:坐标的缩放比例,(一般不用,省略参数)

代码示例 读取图像绘制矩形:

import cv2
import numpy as np


# 读取一张图片
img = cv2.imread(R"C:\Users\lyx15\Pictures\lyf.jpg")
# 获取图像的宽和高
rows,cols = img.shape[:2] # 高 宽
print(rows,cols)

# 绘制矩形
img = cv2.rectangle(img,(80,80),(cols-80,rows-120),(0,0,255),3)
# 请注意,起始和结束坐标为矩形主对角线

cv2.imshow("img",img)


cv2.waitKey(0)
cv2.destroyWindow()

现象:  

代码示例 自定义画布: 

import cv2
import numpy as np


n=500
img2 = np.ones((n,n,3),np.uint8)*255 # np.ones函数用于创建一个全部元素为1的数组,*255后变为全白画布
img2 = cv2.rectangle(img2,(20,20),(n-300,n-300),(0,0,255),3) # 请注意,在OpenCV中,坐标的排列方式是(x, y),其中x表示图像的宽度(沿水平方向),y表示图像的高度(沿垂直方向)。
img2 = cv2.rectangle(img2,(70,70),(n-100,n-150),(0,255,0),5)
img2 = cv2.rectangle(img2,(100,150),(n-100,n-150),(255,0,0),7)
cv2.imshow("img2",img2)

cv2.waitKey(0)
cv2.destroyWindow()

 现象:   

绘制圆形:cv2.circle()函数 

一般格式为:

image = cv2.circle(image,center,radius,color [,thickness[,lineType[,shift]]]) 

参数: 

        ~image:要绘制的图像

        ~center:圆心

        ~radius:半径

        ~color:所绘制直线的颜色,(b, g, r)格式的元组,或者表示灰度值的标量

        ~thickness:粗细,数字越大线越粗

        ~lineType:类型,为-1,4,8,16,默认为8,(只有实线,数字越大线的锯齿状(毛刺)越不明显)

        ~shift:坐标的缩放比例,(一般不用,省略参数)

代码示例 读取图像随机绘制实心圆:

import cv2
import numpy as np

# 读取一张图片
img = cv2.imread(R"C:\Users\lyx15\Pictures\OIP-C.jpg")
# 获取图像的宽和高
rows,cols = img.shape[:2] # 高 宽
# 生成绘制圆的随机参数
for i in range(1,50):
    cx = np.random.randint(0,cols) # x-->cols
    cy = np.random.randint(0,rows) # y-->rows
    radius = np.random.randint(10,int(rows/20))
    
    # 生成一个在0到255之间的随机整数。high参数指定了最大值(不包括),
    # size参数用于指定返回的随机整数的形状。这里使用(3,)表示生成一个包含3个元素的一维数组。
    color = np.random.randint(0,high=256,size=(3,)).tolist() # 这里注意一定先把color转换成列表,再转换为元组或不转换(color是一个Python列表,可以用作元组的一部分,因为元组是不可变的。)
                                                            # 若不把color转换成列表color是一个NumPy数组。在使用tuple()函数转换时,会尝试将数组视为一个标量值,而不是一个可迭代对象。由于标量值不是数字,因此会引发报错。
    color = tuple(color)

    # 生成一个在0到255之间的随机整数。high参数指定了最大值(不包括),
    # size参数用于指定返回的随机整数的形状。这里使用(3,)表示生成一个包含3个元素的一维数组。
    cv2.circle(img,(cx,cy),radius,color,-1)
cv2.imshow("img",img)
cv2.waitKey(0)
cv2.destroyWindow()

现象:  

代码示例 自定义画布绘制同心圆 :

import cv2
import numpy as np
n = 400
img = np.ones((n,n,3),np.uint8)*255 # 创建白色画布
    # round()是一个Python内置函数,用于执行四舍五入操作
    # img.shape[1]表示图像的宽度,img.shape[0]表示图像的高度。
(x,y) = (round(img.shape[1]/2),round(img.shape[0]/2))  # 定义圆心
ver = (0,0,255) # 颜色
# 生成同心圆
for v in range(5,round(n/2),12):
    cv2.circle(img,(x,y),v,ver,3)
cv2.imshow("img",img)
cv2.waitKey(0)
cv2.destroyWindow()

现象: 

绘制椭圆:cv2.ellipse()函数:

一般格式:

image = cv2.ellipse(img,center,axes, angle,startAngle,endAngle,color[,thickness[,lineType[,shift]]])

参数:  

        ~image:要绘制的图像

        ~center:中心点

        ~axes(axis的复数):长轴的一半和短轴的一半(元组)

        ~angle:偏转角度(椭圆整体,顺时针转动)

        ~startAngle:圆弧起始角度

        ~endAngle:圆弧结束角度

        ~color:所绘制直线的颜色,(b, g, r)格式的元组,或者表示灰度值的标量

        ~thickness:粗细,数字越大线越粗

        ~lineType:类型,为-1,4,8,16,默认为8,(只有实线,数字越大线的锯齿状(毛刺)越不明显)

        ~shift:坐标的缩放比例,(一般不用,省略参数)

代码示例 自定义画布生成随机椭圆:   

import cv2
import numpy as np

n = 512
img = np.ones((n,n,3),np.uint8)*255 # 创建白色画布
# 设置随机参数
for i in range(0,10):
    x = np.random.randint(50,n-50)
    y = np.random.randint(50,n-50)
    center = (round(x),round(y)) # 椭圆的中心点

    a = np.random.randint(10,100)
    b = np.random.randint(50,200)
    axes = (a,b) # 椭圆的轴长

    angle = np.random.randint(0,361) # 椭圆的角度
    color = np.random.randint(0,high=256,size=(3,)).tolist()
    thickness = np.random.randint(1,5) # 粗细
    cv2.ellipse(img,center,axes,angle,0,360,color,thickness)
cv2.imshow("img", img)
cv2.waitKey(0)
cv2.destroyWindow()

现象: 

绘制多边形: cv2.polylines()函数:

一般格式:       

image = cv2.polylines(image,pts,isClosed, color[,thickness[,lineType[,shift]]])

参数:  

        ~pts:多边形各顶点(各点的坐标用元组表示,总体可用集合,列表进行表示 )pts多边形的点集,必须是int32位及以上(uint32也不行),整体注意坐标点必须都是int

        ~isClosed:多边形是否闭合,通常为True

         注意:同时画多个独立的多边形,一个或多个多边形的坐标点放在一个或多个numpy的数组中,而这个数组需要放入一维list中,但即使只有一个numpy的坐标点数组也必须有一个list框[ ].

cv2.polylines(img,[pt1],2,(0,0,255))
cv2.polylines(img,[pt1,pt2],2,(0,0,255))

 代码示例 自定义画布生成多边形: 

import cv2
import numpy as np

n = 512
img = np.ones((n,n,3),np.uint8)*255 # 创建白色画布
# reshape()方法用于修改数组的形状,即改变数组的维度。
# reshape((-1, 1, 2))的作用是将数组从原始形状重新调整为(num_points, 1, 2)的形状。
# pts = np.array([(300,10),(150,100),(450,400)], np.int32).reshape((-1, 1, 2))
pts = np.array([(300,10),(150,100),(450,400)], np.int32)
cv2.polylines(img,[pts],True,(0,0,255),5) # 注意出现error:p.checkVector(2, CV_32S)字样表示维度不够,多半要把pts增加维度
cv2.imshow("img", img)
cv2.waitKey(0)
cv2.destroyWindow()

现象: 

绘制填充多边形: cv2.fillPoly()函数: 

一般格式:

image = cv2.fillPoly(image,pts,color[, lineType[, shift[, offset]]])

(参数同上polylines()函数几乎相同),但是没有 isClosed(多边形是否闭合),也没有thickness

代码示例 自定义画布生成填充多边形:  

import cv2
import numpy as np

n = 512
img = np.ones((n,n,3),np.uint8)*255 # 创建白色画布

pts = np.array([(300,10),(150,100),(450,400)], np.int32)
cv2.fillPoly(img,[pts],(0,0,255))
cv2.imshow("img", img)
cv2.waitKey(0)
cv2.destroyWindow()

现象:

绘制文本: putText()函数:

一般格式:

image = cv2.putText(image,text,org,fontFace,fontScale,color[, thickness[,lineType[,bottomLeftOrigin]]])

参数:  

        ~img: 表示输入图像,允许单通道灰度图像或多通道彩色图像。
        ~text:表示添加的文本字符串。(不支持中文)
        ~org:表示文本字符串左下角坐标,(x, y)格式的元组。
        ~fontFace:表示字体类型。
        ~fontScale:表示字体大小。
        ~color:表示绘制直线的颜色,(b, g, r)格式的元组,或者表示灰度值的标量。
        ~thickness:表示绘制直线的粗细,默认值1px, -1表示内部填充
        ~lineType:表示绘制直线的线性,默认值为LINE_8。
        ~bottomLeftOrigin:表示为可选参数,默认值True表示数据原点位于左下角,False表示位于左上角。

fontFace值详解:

描述
cv.FONT_HERSHEY_SIMPLEX 表示正常大小无衬线字体
cv.FONT_HERSHEY_PLAIN 表示小号无衬线字体
cv.FONT_HERSHEY_DUPLEX表示正常大小无衬线字体,比FONT_HERSHEY_SIMPLEX更复杂
cv.FONT_HERSHEY_COMPLEX表示正常大小有衬线字体
cv.FONT_HERSHEY_TRIPLEX表示正常大小有衬线字体,比FONT_HERSHEY_COMPLEX更复杂
cv.FONT_HERSHEY_COMPLEX_SMALL表示FONT_HERSHEY_COMPLEX的小译本
cv.FONT_HERSHEY_SCRIPT_SIMPLEX  表示手写风格字体
cv.FONT_HERSHEY_SCRIPT_COMPLEX 表示手写风格字体,比FONT_HERSHEY_SCRIPT_SIMPLEX更复杂
cv.FONT_ITALIC表示相应字体的斜体字


lineType值详解

描述
cv.LINE_4表示 4 邻接线型
cv.LINE_8表示 8 邻接线型
cv.LINE_AA 表示抗锯齿线型,图像更平滑

 代码示例 自定义画布生成镜像文字和手写文字: ​​​​​​​ 

import cv2
import numpy as np

n = 700
image = np.ones((n,n,3),np.uint8)*255
# 绘制镜像文字
cv2.putText(image,'Hello OpenCV',(10,200),
            cv2.FONT_HERSHEY_COMPLEX,3,(0,0,255),5,bottomLeftOrigin=True)
# 非镜像
cv2.putText(image,'Hello OpenCV',(10,400),
            cv2.FONT_HERSHEY_COMPLEX,3,(0,0,255),5,bottomLeftOrigin=False)
# 绘制手写文字
cv2.putText(image,'Hello OpenCV',(10,600),
            cv2.FONT_HERSHEY_SCRIPT_SIMPLEX,3,(0,0,255),5)
cv2.imshow("img", image)
cv2.waitKey(0)
cv2.destroyWindow()

现象:
   

结束

以上便是对于几个函数的介绍,如有疏漏欢迎指正!!!!

;