OpenCV+python实现图形绘制


简介

我们把图形绘制分为形状、文字、图片三种,其中形状绘制诸如线段、三角形、圆形等等。


一、线段绘制

我们首先来了解一下简单的线段绘制:
在线段绘制中我们使用的是line函数,我们首先只使用它的前四个参数(第一个参数表示目标图片数据,
二表示线段起始位置,三表示终止位置,四表示线段的颜色):

import cv2
import numpy as np

newImageInfo=(500,500,3) #定义图片的宽高信息
dst=np.zeros(newImageInfo,np.uint8)
#绘制线段
cv2.line(dst,(100,100),(400,400),(0,0,255))
'''line函数说明:第一个参数表示目标图片数据,
二表示线段起始位置,三表示终止位置,四表示线段的颜色'''
cv2.imshow('dst',dst)#展示绘制结果
cv2.waitKey(0)

运行程序,得到如下结果:
在这里插入图片描述
现在来看看line的第五个参数,它表示线段的宽度,我们修改上面代码的line函数:

cv2.line(dst,(100,100),(300,200),(0,255,255),10)

再次运行后得到如下结果:
在这里插入图片描述
下面我们介绍line的第六个参数的使用,它表示线段的类型,比如我们将类型设置为LINE_AA:

cv2.line(dst,(100,200),(300,300),(0,255,255),10,cv2.LINE_AA)

将上两条线段绘制在一起来比较:
在这里插入图片描述
可以看到下面的LINE_AA类型的曲线更光滑。
对于一些由线段构成的图形其实都是可以用line函数来绘制的。
那么我们如何使用cv2.line()来绘制三角形呢?
三角形实际上就是三条线段组成的图形。
所以只用绘制三条线段:

import cv2
import numpy as np

newImageInfo=(500,500,3) #定义图片的宽高信息
dst=np.zeros(newImageInfo,np.uint8)
#绘制三角形
cv2.line(dst,(200,150),(50,250),(25,100,255))
cv2.line(dst,(50,250),(400,300),(25,100,255))
cv2.line(dst,(400,300),(200,150),(25,100,255))
cv2.imshow('dst',dst)
cv2.waitKey(0)

运行上述代码得到的结果:
在这里插入图片描述
我们就得到了三条线段组成的三角形,正方形等图形也可用一样的方法。

二、圆形矩形和多边形的绘制

首先来看看矩形的绘制,矩形的绘制我们使用cv2中的**rectangle()**函数,它有五个参数:
1目标图片;2左上角;3右下角;4颜色;
5表示是否填充,用-1表示填充,如果是一个>0的值,则表示线条宽度。

import cv2
import numpy as np

newImageInfo=(500,500,3) #定义图片的宽高信息
dst=np.zeros(newImageInfo,np.uint8)
cv2.rectangle(dst,(50,100),(200,300),(255,0,0),-1)
cv2.imshow('dst',dst)
cv2.waitKey(0)

运行结果如下:
在这里插入图片描述
然后是关于圆形的绘制,我们调用circle()函数,先介绍它的参数:
1表示目标图片;2表示圆点坐标;3表示半径;4表示颜色;5表示填充(-1填充,>0线段宽度)

import cv2
import numpy as np

newImageInfo=(500,500,3) #定义图片的宽高信息
dst=np.zeros(newImageInfo,np.uint8)
cv2.circle(dst,(250,250),(100),(0,255,0),20)
cv2.imshow('dst',dst)
cv2.waitKey(0)

运行结果如下:

在这里插入图片描述
再然后是关于圆弧(或是椭圆)的绘制,使用ellipse()函数,它的参数分别是:1目标图片;2圆心;3轴的长度(长轴,短轴);4偏转角度;5圆弧的起始角度;6终止角度;7颜色;8内容是否填充。

import cv2
import numpy as np

newImageInfo=(500,500,3) #定义图片的宽高信息
dst=np.zeros(newImageInfo,np.uint8)
cv2.ellipse(dst,(256,256),(150,100),0,0,180,(255,255,0),-1)
cv2.imshow('dst',dst)
cv2.waitKey(0)

运行结果如下:
在这里插入图片描述
接下来是任意多边形的绘制,首先我们定义多边形各点的坐标,用一个矩阵来存储:

points=np.array([[150,50],[100,100],[230,370],[300,500],[50,30]],np.int32)

然后我们需要对该矩阵实现一个维度转换,把它从(5,2)转变为(5,1,2)的维度:

points=points.reshape((-1,1,2))

最后使用polylines()函数来绘制任意多边形:

cv2.polylines(dst,[points],True,(255,255,255))

完整代码如下:

import cv2
import numpy as np

newImageInfo=(500,500,3) #定义图片的宽高信息
dst=np.zeros(newImageInfo,np.uint8)
points=np.array([[150,50],[100,100],[230,370],[300,500],[50,30]],np.int32)
points=points.reshape((5,1,2))
cv2.polylines(dst,[points],True,(255,255,255))
cv2.imshow('dst',dst)
cv2.waitKey(0)

运行结果如下:
在这里插入图片描述

三、文字和图片绘制

首先来看看如何在图片中绘制文字:
首先读入图片:

img=cv2.imread('image00.png',1)

然后定义字体,opencv中提高了很多字体,这里我们随意选取一种即可:

font=cv2.FONT_HERSHEY_SIMPLEX

然后开始绘制文字,使用putText方法:

cv2.putText(img,'this is LF',(100,300),font,1,(255,0,0),2,cv2.LINE_AA)

字体后面的参数表示字体大小,颜色后面的参数表示粗细,最后一个参数表示线条的类型。
完整代码:

import cv2

img=cv2.imread('ziliao/image00.png',1)
font=cv2.FONT_HERSHEY_SIMPLEX
cv2.putText(img,'This is LF',(100,300),font,1,(255,0,0),2,cv2.LINE_AA)
cv2.imshow('IMG',img)
cv2.waitKey(0)

运行结果如下:
在这里插入图片描述
接下来完成图片的绘制,其实图片绘制就是把一张图放在另一张图上,实际上就是完成像素的装载或者是像素的叠加。
首先我们读入两张图片,我们的目标是把第二张图片绘制到第一张上:

img1=cv2.imread('ziliao/img.png',1)
img2=cv2.imread('ziliao/image00.png',1)

然后把要绘制的图片缩放一下,使用的是opencv中的resize方法:

height=int(img2.shape[0]*0.2)
width=int(img2.shape[1]*0.2)
img2Resize=cv2.resize(img2,(width,height))

最后使用for循环,把图片1中对应的位置替换成图片2的像素,就实现了把图片2绘制在图片1的效果:

for i in range(0,height):
    for j in range(0,width):
        img1[i+200,j+20]=img2Resize[i,j]

完整代码如下:

import cv2

img1=cv2.imread('ziliao/img.png',1)
img2=cv2.imread('ziliao/image00.png',1)
height=int(img2.shape[0]*0.2)
width=int(img2.shape[1]*0.2)
img2Resize=cv2.resize(img2,(width,height))
for i in range(0,height):
    for j in range(0,width):
        img1[i+200,j+20]=img2Resize[i,j]
cv2.imshow('dst',img1)
cv2.waitKey(0)

运行结果如下:
在这里插入图片描述
终于写完了~以上就是我们opencv图形绘制的全部内容。

  • 7
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
可以使用OpenCV和Turtle库来进行Python编程。OpenCV是一个强大的计算机视觉库,用于图像和视频处理,而Turtle库则用于绘制图形和动画。结合使用这两个库,你可以创建有趣的图像处理图形绘制的程序。 首先,确保你已经安装了OpenCV和Turtle库。你可以使用pip命令来安装它们: ``` pip install opencv-python pip install PythonTurtle ``` 接下来,你可以编写一个Python程序来使用OpenCV处理图像,并使用Turtle库绘制图形。下面是一个简单的示例程序: ```python import cv2 import numpy as np import turtle # 打开图像文件 image = cv2.imread('image.jpg') # 使用OpenCV处理图像 # 这里只是一个示例,你可以根据需要进行图像处理操作 gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) edges = cv2.Canny(gray_image, 100, 200) # 创建一个Turtle窗口 screen = turtle.Screen() screen.setup(image.shape[1], image.shape[0]) # 创建一个Turtle对象 pen = turtle.Turtle() # 使用Turtle绘制图形 pen.speed(0) pen.penup() pen.goto(-image.shape[1] // 2, -image.shape[0] // 2) pen.pendown() for y in range(image.shape[0]): for x in range(image.shape[1]): if edges[y, x] > 0: pen.goto(x - image.shape[1] // 2, image.shape[0] // 2 - y) # 关闭Turtle窗口 screen.exitonclick() # 释放OpenCV图像 cv2.destroyAllWindows() ``` 在这个示例程序中,我们首先使用OpenCV读取一张图像,并对图像进行处理以获得边缘信息。然后,我们创建一个Turtle窗口,并使用Turtle库创建一个Turtle对象。通过在循环中根据边缘像素的位置绘制图形,我们可以实现在图像上绘制边缘线条的效果。 你可以将上面的示例代码保存为Python文件,然后运行它以查看效果。记得将`image.jpg`替换为你自己的图像文件路径。 希望这个示例能帮助到你开始使用OpenCV和Turtle库进行图像处理图形绘制的编程。如果你有其他问题,请随时提问!
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值