opencv基础学习 小知识--绘图函数+小实战训练
声明:这里是本人自学opencv时写下来的笔记。同时参考并感谢up主【致敬大神】。在她视频基础进行修改加上自己理解补充。目的是为了更好的进步与学习。如有更多学习经验和知识分享,欢迎评论,谢谢。
同时欢迎大家关注新博主github:https://github.com/Cqy-96 b站: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 learnlogo.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 learnlogo.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 learnlogo.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 learnlogo.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 learnlogo.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 learnlogo.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站【致敬大神】让偶学了不少!
【实践是检验真理的唯一标准】