opencv在图像上写字(opencv绘制图形)

作者:电脑培训网 2024-04-03 16:36:15 968

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在图像上写字(opencv绘制图形)

欢迎各位大佬来小九主页指导。欢迎大家学习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为半径长度

3.1绘制实现圆与空心圆

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()

3.2绘制同心圆

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()

代码效果如下

3.3绘制随机圆

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()绘制文字

5.1绘制文字

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()

5.2垂直镜像效果

将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()

5.3不同字体效果

设置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系列】

相关推荐

  • 日本艾回培训学校,日本艾回intersection

    日本艾回培训学校,日本艾回intersection

    大家好,今天小编关注到一个比较有意思的话题,就是关于日本艾回培训学校的问题,于是小编就整理了1个相关介绍日本艾回培训学校的解答,让我们一起看看吧。浙江省有什么明…

    日本艾回培训学校,日本艾回intersection 2024-08-25 01:42:06
  • word内核培训学校,windows内核培训

    word内核培训学校,windows内核培训

    大家好,今天小编关注到一个比较有意思的话题,就是关于word内核培训学校的问题,于是小编就整理了3个相关介绍word内核培训学校的解答,让我们一起看看吧。Win…

    word内核培训学校,windows内核培训 2024-05-31 14:39:34
  • win10删除蓝牙连接记录(windows删除蓝牙设备)

    win10删除蓝牙连接记录(windows删除蓝牙设备)

    win11中如何删除已连接的蓝牙设备?win11系统连接的蓝牙设备有很多。其中一些没有使用,我想删除它们。如何删除蓝牙?我们来看看Win11中如何删除蓝牙设备.…

    win10删除蓝牙连接记录(windows删除蓝牙设备) 2024-05-07 07:43:40
  • linux 交换文件(linux设置交换空间)

    linux 交换文件(linux设置交换空间)

    最近有朋友问我如何在Linux下设置交换文件。今天给大家带来Linux下设置交换文件的方法。希望对大家有所帮助。有需要的朋友可以去看一下.17-04-161.创…

    linux 交换文件(linux设置交换空间) 2024-05-07 04:56:39
  • linux pushd命令(linux pushed)

    linux pushd命令(linux pushed)

    本文主要介绍Linux中使用pushd和popd命令操作目录。这两个命令分别常用于切换目录和删除目录。有需要的朋友可以参考以下.16-02-01Pushd将目录…

    linux pushd命令(linux pushed) 2024-05-07 01:38:03