opencv 基础学习 小知识 -- 绘图函数 + 小实战训练
声明: 这里是本人自学 opencv 时写下来的笔记. 同时参考并感谢 up 主 [致敬大神] . 在她视频基础进行修改加上自己理解补充. 目的是为了更好的进步与学习. 如有更多学习经验和知识分享, 欢迎评论, 谢谢.
同时欢迎大家关注新博主 GitHub:https://github.com/Cqy-96b 站: https://space.bilibili.com/301389626[阳 ger 阳]
1, 学习目标
学习 opencv 画图直线, 圆, 椭圆, 矩形, 不规则图形.
函数: cv.line(),cv.circle(),cv.rectangle(),cv.ellipse(),cv.putText()
实战: 用 opencv 画 opencv logo 的标志
2, 用到的库
- python
- numpy
- matplotlib
下面呢我们就开始学这几个函数了......
(1) 画直线
函数: cv.line(img,pt1,pt2,thickness,lineType,shift)
img: 要绘制线段的图像.
pt1: 线段的起点.
pt2: 线段的终点.
color: 线段的颜色.
thickness: 线条的宽度.
lineType: 线段的类型. 可以取值 8, 4, 和 CV_AA, 分别代表 8 邻接连接线, 4 邻接连接线和反锯齿连接线. 默认值为 8 邻接. 为了获得更好地效果可以选用 CV_AA(采用了高斯滤波).
shift: 坐标点小数点位数.
实战:
- import cv2 as cv
- import numpy as np
- import matplotlib.pyplot as plt
- # 读取一张白底图片
- # 也可以自己用 numpy 绘制一个图片
- # img=np.ones((500,500,3),np.uint8)
- img=cv.imread("F:\opencv learn\logo.jpg")
- # 在图中画出一条直线
- cv.line(img,(0,0),(500,500),(0,255,0),5)
- cv.imshow("img",img)
- plt.show()
- cv.waitKey()
- cv.destroyAllWindows()
效果:
(2) 画方形
函数: cv2.rectangle(img, pt1, pt2, color[, thickness[, lineType[, shift]]])
例: cv2.rectangle(img, (x,y), (x+w,y+h), (0,255,0), 2) 参数解释第一个参数: img 是原图
第二个参数:(x,y) 是矩阵的左上点坐标
第三个参数:(x+w,y+h) 是矩阵的右下点坐标
第四个参数:(0,255,0) 是画线对应的 rgb 颜色
第五个参数: 2 是所画的线的宽度
实战:
- import cv2 as cv
- import numpy as np
- import matplotlib.pyplot as plt
- # 读取一张白底图片
- # 也可以自己用 numpy 绘制一个图片
- # img=np.ones((500,500,3),np.uint8)
- img=cv.imread("F:\opencv learn\logo.jpg")
- # 画一个方形
- cv.rectangle(img,(380,0),(500,250),(255,0,0),4)
- cv.imshow("img",img)
- cv.waitKey()
- cv.destroyAllWindows()
效果:
(3) 画圆
函数: cv2.circle(img, center, radius, color[, thickness[, lineType[, shift]]])
参数解释:
img: 要画的圆所在的矩形或图像
center: 圆心坐标, 如 (100, 100)
radius: 半径, 如 10
color: 圆边框颜色, 如 (0, 0, 255) 红色, BGR
thickness: 正值表示圆边框宽度. 负值表示画一个填充圆形
lineType: 圆边框线型, 可为 0,4,8
shift: 圆心坐标和半径的小数点位数
实战:
- import cv2 as cv
- import numpy as np
- import matplotlib.pyplot as plt
- # 读取一张白底图片
- # 也可以自己用 numpy 绘制一个图片
- # img=np.ones((500,500,3),np.uint8)
- img=cv.imread("F:\opencv learn\logo.jpg")
- # 画一个圆
- cv.circle(img,(200,200),50,(0,0,255),4)
- cv.imshow("img",img)
- cv.waitKey()
- cv.destroyAllWindows()
效果:
(4) 画椭圆
函数: cv2.ellipse(img, center, axes, angle, startAngle, endAngle, color, thickness, lineType, shift)
注意: cv.eclipse() 函数比较复杂一定要理解清楚每个参数
img: 需要绘图的图像
center: 椭圆中心点坐标
axes: 椭圆尺寸 (即长短轴)
angle: 旋转角度 (顺时针方向)
startAngle: 绘制的起始角度 (顺时针方向)
endAngle: 绘制的终止角度 (例如, 绘制整个椭圆是 0,360, 绘制下半椭圆就是 0,180)
color: 线条颜色 (BGR)
thickness: 线条粗细 (默认值 = 1)
lineType: 线条类型 (默认值 = 8)
shift: 圆心坐标点和数轴的精度 (默认值 = 0)
为了更好理解 angle,startangle,endtangle 这三个参数 我来分别演示, 先看总体的一张图
实战:
- import cv2 as cv
- import numpy as np
- import matplotlib.pyplot as plt
- # 读取一张白底图片
- # 也可以自己用 numpy 绘制一个图片
- # img=np.ones((500,500,3),np.uint8)
- img=cv.imread("F:\opencv learn\logo.jpg")
- # 画椭圆
- cv.ellipse(img,(200,100),(100,50),0,0,360,(0,255,0),4)
- cv.imshow("img",img)
- cv.waitKey()
- cv.destroyAllWindows()
效果:
关于 angle 参数: 代码中我默认的是 0, 为了效果我修改成 60
- img1=cv.ellipse(img,(200,100),(100,50),0,0,360,(0,255,0),4)
- img2=cv.ellipse(img,(200,100),(100,50),60,0,360,(255,0,0),4)
关于 startangle,endtangle 这两个参数, 同样通过实例来演示一下.
- img1=cv.ellipse(img,(200,100),(100,50),0,0,180,(0,255,0),4)
- img1=cv.ellipse(img,(200,300),(100,50),0,0,360,(255,0,0),4)
(5) 添加文字 (说白了就是在你输入的图片中添加你想添加的文字以表示说明)
函数: cv2.putText(img, str(i), (123,456)), font, 2, (0,255,0), 3)
各参数依次是: 图片, 添加的文字, 左上角坐标, 字体, 字体大小, 颜色, 字体粗细
实战:
- import cv2 as cv
- import numpy as np
- import matplotlib.pyplot as plt
- # 读取一张白底图片
- # 也可以自己用 numpy 绘制一个图片
- # img=np.ones((500,500,3),np.uint8)
- img=cv.imread("F:\opencv learn\logo.jpg")
- # 编辑文字
- font=cv.FONT_HERSHEY_SIMPLEX
- cv.putText(img,"image",(200,150),font,2,(0,255,255),4)
- cv.imshow("image",img)
- cv.waitKey()
- cv.destroyAllWindows()
效果:
以上呢就是本次学习的全部任务, 个人理解, 如有不足欢迎指正!
以为结束了??? 接下来就是展示真正技能的时候了, 哈哈哈!
绘制 opencv 的 logo
如下:
代码:
- import cv2 as cv
- import numpy as np
- import matplotlib.pyplot as plt
- import math
- # 设置基本参数 (如图所示)
- W=500
- Height=int(1.3*W)
- D=0.2*W
- O=(int(W/2),int(W/2))
- # 大圆的参数
- A=(int(W/2),int(W/2-D))
- B=(int(W/2-math.sqrt(3)/2*D),int(W/2+D/2))
- C=(int(W/2+math.sqrt(3)/2*D),int(W/2+D/2))
- R=int(2*math.sqrt(3)/5*D)# 大圆半径
- # 小圆参数
- # 同心圆 坐标一致
- r=int(math.sqrt(3)/5*D)
- # 扇形参数 角度
- ang=60
- # 读取一张白底图片
- src=cv.imread("F:\opencv learn\logo.jpg")
- # 画大圆
- cv.circle(src,A,R,(0,0,255),-1)
- cv.circle(src,B,R,(0,255,0),-1)
- cv.circle(src,C,R,(255,0,0),-1)
- # 画小圆
- cv.circle(src,A,r,(255,255,255),-1)
- cv.circle(src,B,r,(255,255,255),-1)
- cv.circle(src,C,r,(255,255,255),-1)
- # 画扇形
- cv.ellipse(src,A,(R,R),ang,0,ang,(255,255,255),-1)
- cv.ellipse(src,B,(R,R),360-ang,0,ang,(255,255,255),-1)
- cv.ellipse(src,C,(R,R),360-2*ang,0,ang,(255,255,255),-1)
- # 加文字
- font=cv.FONT_HERSHEY_SIMPLEX
- cv.putText(src,"opencv",(40,450),font,4,(0,0,0),10)
- # 显示
- cv.imshow("opencv-logo",src)
- cv.namedWindow("opencv-logo",cv.WINDOW_AUTOSIZE)
- cv.waitKey()
- cv.destroyAllWindows()
效果:
建议自己要把公式推明白, 在独自敲代码, 这样才有进步! 感谢 b 站 [致敬大神] 让偶学了不少!
[实践是检验真理的唯一标准]
来源: http://www.bubuko.com/infodetail-3474737.html