【1】引言
前序学习进程中,已经对如何绘制线段和矩形有一定的掌握,相关文章链接为:
python学opencv|读取图像(十八)使用cv2.line创造线段-CSDN博客
python学opencv|读取图像(十九)使用cv2.rectangle()绘制矩形-CSDN博客
现在,我们会很自然想到继续绘制圆形,这就是本次学习的目标。
【2】官网教程
点击下述链接,直达官网:
OpenCV: cv::gapi::wip::draw::Circle Struct Reference
在官网,会看到如下介绍:
图1
这里的几个参数意义为:
GAPI_WRAP cv::gapi::wip::draw::Circle::Circle ( const cv::Point & center_, #圆心坐标
int radius_, #半径
const cv::Scalar & color_, #颜色数列
int thick_ = 1, #圆弧宽度
int lt_ = 8, #圆弧线存储类型
int shift_ = 0 ) #圆心坐标和弧长对应数据的小数位数,暂无需关注
【3】代码测试
从这里,我们开始测试代码。
代码可以在绘制矩形的基础上稍作修改,这里先给出完整段落:
import numpy as np # 引入numpy模块
import cv2 as cv # 引入cv模块
canvas = np.ones((580, 580, 3), np.uint8)*158 # 绘制一个580*580大小的画布,3代表有3个通道,unit8为图像存储格式
# 第一个通道值
for i in range(0, 580, 1):
for j in range(0, 580, 1):
canvas[i, j, 0] = 255 # 第一个通道值
# 第二个通道值
#for i in range(0, 580, 1):
#for j in range(0, 580, 1):
#canvas[i, j, 1] = 50 * np.cos(i ^ j) + 55 * np.sin(j ^ i) + 150 * np.sin(j - i) # 第二个通道值
# 第三个通道值
#for i in range(0, 580, 1):
#for j in range(0, 580, 1):
#canvas[i, j, 2] = 255 * np.tanh(i + j) +255 * np.tanh(i - j) # 第三个通道值
canvas=cv.circle(canvas,(285,285),80,(0,0,255),3) #第一个圆形
canvas=cv.circle(canvas,(100,285),80,(0,255,255),-1) #第二个圆形
canvas=cv.circle(canvas,(470,285),80,(255,0,0),-1) #第三个圆形
#canvas = cv.rectangle(canvas, (50, 30), (530, 550), (155, 120, 60), 5) # 矩形
#canvas = cv.rectangle(canvas, (80, 80), (500, 500), (55, 160, 230), 10) # 矩形
#canvas = cv.rectangle(canvas, (150, 150), (430, 430), (50, 120, 90), -1) # 矩形
#canvas = cv.line(canvas, (50, 550), (550, 550), (58, 50, 150), 15) # 线段
#canvas = cv.line(canvas, (300, 50), (300, 550), (120, 150, 25), 20) # 线段
cv.imshow('rectangle', canvas) # 在屏幕展示绘制圆形的效果
cv.imwrite('circle50.png', canvas) # 保存图像
cv.waitKey() # 图像不会自动关闭
cv.destroyAllWindows() # 释放所有窗口
运行代码后的效果为:
图2
这里的核心3行代码的意义是:
canvas=cv.circle(canvas,(285,285),80,(0,0,255),3) #第一个圆形的圆心为(285,285),半径为80,圆弧的颜色为(0,0,255),圆弧宽度为3;
canvas=cv.circle(canvas,(100,285),80,(0,255,255),-1) #第二个圆形的圆心为(100,285),半径为80,圆弧的颜色为(0,255,255),实心圆;
canvas=cv.circle(canvas,(470,285),80,(255,0,0),-1) #第三个圆形的圆心为(470,285),半径为80,圆弧的颜色为(255,0,0),实心圆。
【4】代码修改
同样的,假如想把背景画布变成渐变颜色,可以继续增添一些代码:
# 第一个通道值
for i in range(0, 580, 1):
for j in range(0, 580, 1):
canvas[i, j, 0] = 0.2*(i+j) # 第一个通道值
# 第二个通道值
for i in range(0, 580, 1):
for j in range(0, 580, 1):
canvas[i, j, 1] = 50 * np.cos(i ^ j) + 55 * np.sin(j ^ i) + 150 * np.sin(j - i) # 第二个通道值
# 第三个通道值
for i in range(0, 580, 1):
for j in range(0, 580, 1):
canvas[i, j, 2] = 100 * np.tanh(i+j ) +100 * np.tanh(i-j)+50 * np.cos(j - i) # 第三个通道值
运行后的图像为:
图3
此时的完整代码为:
import numpy as np # 引入numpy模块
import cv2 as cv # 引入cv模块
canvas = np.ones((580, 580, 3), np.uint8)*158 # 绘制一个580*580大小的画布,3代表有3个通道,unit8为图像存储格式
# 第一个通道值
for i in range(0, 580, 1):
for j in range(0, 580, 1):
canvas[i, j, 0] = 0.2*(i+j) # 第一个通道值
# 第二个通道值
for i in range(0, 580, 1):
for j in range(0, 580, 1):
canvas[i, j, 1] = 50 * np.cos(i ^ j) + 55 * np.sin(j ^ i) + 150 * np.sin(j - i) # 第二个通道值
# 第三个通道值
for i in range(0, 580, 1):
for j in range(0, 580, 1):
canvas[i, j, 2] = 100 * np.tanh(i+j ) +100 * np.tanh(i-j)+50 * np.cos(j - i) # 第三个通道值
canvas=cv.circle(canvas,(285,285),80,(0,0,255),3) #第一个圆形
canvas=cv.circle(canvas,(100,285),80,(0,255,255),-1) #第二个圆形
canvas=cv.circle(canvas,(470,285),80,(255,0,0),-1) #第三个圆形
#canvas = cv.rectangle(canvas, (50, 30), (530, 550), (155, 120, 60), 5) # 矩形
#canvas = cv.rectangle(canvas, (80, 80), (500, 500), (55, 160, 230), 10) # 矩形
#canvas = cv.rectangle(canvas, (150, 150), (430, 430), (50, 120, 90), -1) # 矩形
#canvas = cv.line(canvas, (50, 550), (550, 550), (58, 50, 150), 15) # 线段
#canvas = cv.line(canvas, (300, 50), (300, 550), (120, 150, 25), 20) # 线段
cv.imshow('rectangle', canvas) # 在屏幕展示绘制圆形的效果
cv.imwrite('circle50.png', canvas) # 保存图像
cv.waitKey() # 图像不会自动关闭
cv.destroyAllWindows() # 释放所有窗口
【5】总结
掌握了使用cv2.circle()函数绘制圆形的基本技巧。