目录
代码示例 自定义画布生成镜像文字和手写文字:
绘制直线: 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()
现象:
结束
以上便是对于几个函数的介绍,如有疏漏欢迎指正!!!!