OpenCV绘制图像和文本Open_CV系列
1.cv2.line()绘制线段2.cv2.rectangle()绘制矩形3.cv2.circle()绘制圆3.1绘制实现的圆和空心圆3.2绘制同心圆3.3绘制随机圆4.cv2.polylines()绘制多边形5.cv2.putText()绘制文本5.1绘制文本5.2垂直镜像效果5.3不同字体效果6.绘制动态图形??
欢迎各位大佬来小九主页指导。欢迎大家学习OpenCV绘制图像和文字——Open_CV系列的第四篇文章。我是博主侯小九。
本博客可以作为日常抄写的脚手架代码。
博客主页:Skylark编程巢
如果本博文内容对您有帮助,请点赞+关注+收藏
如果有任何疑问,欢迎在评论区交流。
关于这个博客,有一个值得注意的细节:
上一篇文章修改单个像素值时,我们可以直接从像素数组中取出某个像素,比如
图像[300,200]=[255,255,255]
即以左上角为画布坐标原点,将垂直方向第301个像素和水平方向第201个像素变为白色。
但在本文中,为了更加快速高效地操作像素,我们将使用OpenCV提供的一系列操作像素的方法。下面的方法中,通常会传入坐标点,这里传入的坐标点与上面手动操作像素时的坐标点不同。这里通常会传入(a,b)这样的数组来表示坐标。左上角仍然是画布的坐标原点,但是a的位置是水平方向,b的位置是数字方向。这与手动操作相反。在学习过程中要注意这个细节。
1.cv2.line()绘制线段
语法
CV2.line()
线
img表示表示画布的数组pt1指的是起点的坐标,元组格式pt2指的是终点的坐标,元组格式color表示颜色的元组,如BGR中的颜色空间中,(255,0,0)代表蓝色,(0,255,0)代表绿色,(0,0,255)代表红色。width线宽lineType线生成的算法类型,可以是4或8,默认为8。两种算法绘制的线在视觉上没有差异。绘制首尾相连的四条不同颜色和粗细的线段。
importnumpyasnpimportcv2#创建画布canvas=np.zeros((300,300,3),np.uint8)#canvas=np.ones((300,300,3),np.uint8)*255#如果创建白色画布canvas=cv2.line(canvas,(50,50),(50,250),(255,0,0),5)canvas=cv2.line(画布,(50,250),(250,250),(0,255,0),10)canvas=cv2.line(画布,(250,250),(250,50),(0,0,255)),15)canvas=cv2.line(canvas,(250,50),(50,50),(0,255,255),20)cv2.imshow('线条',canvas)cv2.waitKey()cv2.destroyAllWindows()
程序执行结果如图:
2.cv2.rectangle()绘制矩形
语法
cv2.rectangle(img,pt1,pt2,颜色,厚度=无,lineType=无,移位=无)
pt1表示矩形左上角的坐标,pt2表示矩形右下角的坐标。其他参数的语法与上面相同。
如果设置了厚度,则表示绘制的形状是实心形状,并且内部填充了颜色。
以白色作为画布的背景色为例。
将numpy导入为npimportcv2canvas=np.ones((500,600,3),np.uint8)*255canvas=cv2.rectangle(canvas,(150,200),(400,350),(255,255,0),20)cv2.imshow('矩形',canvas)cv2.waitKey()cv2.destroyAllWindows()
3.cv2.circle()绘制圆形
圆
center为圆心坐标,radius为半径长度
importnumpyasnp#Python中导入numpy模块importcv2canvas=np.ones((500,500,3),np.uint8)*255#画三个实心圆和一个空心圆canvas=cv2.circle(canvas,(100,100),80,(0,0,255),-1)canvas=cv2.circle(canvas,(250,250),80,(0,255,255),-1)canvas=cv2.circle(canvas,(400,400),80,(0,255,0),-1)canvas=cv2.circle(canvas,(400,100),80,(0,0,0),5)cv2.imshow('TrafficLights',canvas)#显示画布cv2.waitKey()cv2.destroyAllWindows()
importnumpyasnpimportcv2canvas=np.zeros((600,600,3),np.uint8)center_X=int(canvas.shape[1]/2)center_Y=int(canvas.shape[0]/2)forrinrange(0,300,30):cv2.circle(canvas,(center_X,center_Y),r,(0,255,0),5)cv2.imshow('Circles',canvas)cv2.waitKey()cv2.destroyAllWindows()
代码效果如下
importnumpyasnpimportcv2canvas=np.zeros((600,600,3),np.uint8)fornumberinrange(0,100):center_X=np.random.randint(0,high=600)center_Y=np.random.randint(0,高=600)半径=np.random.randint(10,高=150)颜色=np.random.randint(0,高=256,大小=(3,)).tolist()cv2.circle(canvas,(center_X,center_Y),radius,color,-1)cv2.imshow('Circles',canvas)cv2.waitKey()cv2.destroyAllWindows()
效果如下:
4.cv2.polylines()绘制多边形
语法
折线
imgcanvas/imagearraypts是一个列表,该列表是一个形状为(n,2)的numpy数组:形状为[[a,b],[c,d],[e,f],[g,h],…],存储多边形每个顶点的坐标。isClosed是否关闭。没有默认值,必须手动传入。如果为True,则表示是闭合多边形;如果为False,则表示未关闭。将numpy导入为npimportcv2canvas=np.ones((500,500,3),np.uint8)*255pts=np.array([[100,50],[250,50],[350,250],[100,300],[50,100]],np.int32)#注意,pts是一个列表,必须在数组外面添加一组括号才能正常运行。canvas=cv2.polylines(canvas,[pts],True,(0,255,255),5)cv2.imshow('Polylines',canvas)cv2.waitKey()cv2.destroyAllWindows()
5.cv2.putText()绘制文字
putText
img~text要绘制的文本内容,字符串格式。putText()方法不支持绘制汉字,否则会出现乱码。org文本fontFace字体样式的起始坐标,参考字体样式表。fontScale字体大小color颜色粗细线条宽度lineType用于线条生成的算法类型,可以是4或8,默认为8.bottomLeft绘制文本时的原点方向,默认为Falseimportnumpyasnpimportcv2canvas=np.ones((500,1000,3),np.uint8)*255cv2.putText(canvas,'侯小九',(250,250),cv2.FONT_HERSHEY_TRIPLEX,2,(0,255,255),5)cv2.imshow('文本',画布)cv2.waitKey()cv2.destroyAllWindows()
将bottomLeftOrigin设置为True
图像将显示如下效果:
importnumpyasnpimportcv2canvas=np.ones((500,1000,3),np.uint8)*255cv2.putText(canvas,'侯小九',(250,250),cv2.FONT_HERSHEY_TRIPLEX,2,(0,255,255),5,BottomLeftOrigin=True)cv2.imshow('文本',canvas)cv2.waitKey()cv2.destroyAllWindows()
设置fontFace参数以呈现不同的字体效果:
importnumpyasnpimportcv2canvas=np.ones((1000,1000,3),np.uint8)*255cv2.putText(canvas,'我爱你',(300,100),cv2.FONT_HERSHEY_TRIPLEX,2,(0,255,255),5)cv2.putText(canvas,'我爱你',(300,200),cv2.FONT_HERSHEY_PLAIN,2,(0,255,255),5)cv2.putText(canvas,'我爱你',(300,300),cv2.FONT_HERSHEY_DUPLEX,2,(0,255,255),5)cv2.putText(canvas,'我爱你',(300,400),cv2.FONT_HERSHEY_COMPLEX,2,(0,255,255),5)cv2.putText(canvas,'我爱你',(300,500),cv2.FONT_HERSHEY_TRIPLEX,2,(0,255,255),5)cv2.putText(canvas,'我爱你',(300,600),cv2.FONT_HERSHEY_COMPLEX_SMALL,2,(0,255,255),5)cv2.putText(canvas,'我爱你',(300,700),cv2.FONT_HERSHEY_SCRIPT_SIMPLEX,2,(0,255,255),5)cv2.putText(canvas,'我爱你',(300,800),cv2.FONT_HERSHEY_SCRIPT_COMPLEX,2,(0,255,255),5)cv2.putText(canvas,'我爱你',(300,900),cv2.FONT_ITALIC,2,(0,255,255),5)cv2.imshow('文本',canvas)cv2.waitKey()cv2.destroyAllWindows()
6.绘制动态图形
绘制动态图形,即在图像的显示过程中,像素数组中的值的大小时刻变化,给人一种动态的效果。
以画圆为例。当您在画布中移动时,圆的中心位置不断变化,但圆的半径保持不变。
这个过程可以通过while循环结合time.sleep()来完成。使用time.sleep()来控制while循环执行的时间间隔,即动态图像的帧数。
每个循环赋予圆心不同的位置;每次运动接触边界时,运动方向都会改变。
另外,为了获得更酷的效果,我们还可以为每一帧中的球设置随机不同的颜色。
importcv2importtimeimportnumpyasnpwidth,height=500,500r=40x=40y=250#水平和垂直方向每次移动的距离x_offer=y_offer=8whilecv2.waitKey(1)==-1:ifxwidth-r或xr:x_offer*=-1如果y高度-r或yr:y_offer*=-1x+=x_offery+=y_offerimg=np.ones((width,height,3),np.uint8)*255cv2.circle(img,(x,y),r,tuple(np.random.randint(0,high=256,size=(3,)).tolist()),-1)cv2.imshow('img',img)time.sleep(1/60)#休眠1/60秒,即每秒60帧cv2.destroyAllWindows()
执行效果片段展示:
本系列博客传送门:
^
OpenCV图像处理的基本操作【Python-Open_CV系列】
^
OpenCV像素处理的基本操作【Python-Open_CV系列】
^
OpenCV的BGR、GRAY、HSV颜色空间颜色通道专题【Python-Open_CV系列】
^
OpenCV绘制图像和文本【Python-Open_CV系列】
^
OpenCV图像几何变换专题【python-Open_CV系列】
^
基于梵高的图像阈值处理专题《向日葵》【Python-Open_CV系列】
^
OpenCV基本技能:图像遮蔽、运算与合并专题-小九大学【Python-Open_CV系列】
^
《三英战吕布》-图像模板匹配【Python-Open_CV系列】
^
OpenCV滤波器龙门石窟【Python-Open_CV系列】
^
Open_CV形态学运算专题【Python-Open_CV系列】
^
看不懂霍夫变换?小九带你过一遍这个系列:OpenCV图形检测专题。这是最简单的学习方法【Python-Open_CV系列】
^
小九帮你开眼界开启py-OpenCV摄像头及视频处理【Python-Open_CV系列】
^
小九带你开眼界人脸检测与识别【Python-Open_CV系列】
大家好,今天小编关注到一个比较有意思的话题,就是关于日本艾回培训学校的问题,于是小编就整理了1个相关介绍日本艾回培训学校的解答,让我们一起看看吧。浙江省有什么明…
大家好,今天小编关注到一个比较有意思的话题,就是关于word内核培训学校的问题,于是小编就整理了3个相关介绍word内核培训学校的解答,让我们一起看看吧。Win…
win11中如何删除已连接的蓝牙设备?win11系统连接的蓝牙设备有很多。其中一些没有使用,我想删除它们。如何删除蓝牙?我们来看看Win11中如何删除蓝牙设备.…
最近有朋友问我如何在Linux下设置交换文件。今天给大家带来Linux下设置交换文件的方法。希望对大家有所帮助。有需要的朋友可以去看一下.17-04-161.创…
本文主要介绍Linux中使用pushd和popd命令操作目录。这两个命令分别常用于切换目录和删除目录。有需要的朋友可以参考以下.16-02-01Pushd将目录…
2024-10-30 06:40:09
2024-10-30 04:45:43
2024-10-30 03:12:04
2024-10-30 00:51:08
2024-10-29 22:30:06
大家好,今天小编关注到一个比较有意思的话题,就是关于南京培训机构暂停多久开学的问…
大家好,今天小编关注到一个比较有意思的话题,就是关于电脑培训班开班典礼策划的问题…