OpenCV+python实现图形绘制

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)

运行程序,得到如下结果:
OpenCV+python实现图形绘制_第1张图片
现在来看看line的第五个参数,它表示线段的宽度,我们修改上面代码的line函数:

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

再次运行后得到如下结果:
OpenCV+python实现图形绘制_第2张图片
下面我们介绍line的第六个参数的使用,它表示线段的类型,比如我们将类型设置为LINE_AA:

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

将上两条线段绘制在一起来比较:
OpenCV+python实现图形绘制_第3张图片
可以看到下面的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)

运行上述代码得到的结果:
OpenCV+python实现图形绘制_第4张图片
我们就得到了三条线段组成的三角形,正方形等图形也可用一样的方法。

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

首先来看看矩形的绘制,矩形的绘制我们使用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)

运行结果如下:
OpenCV+python实现图形绘制_第5张图片
然后是关于圆形的绘制,我们调用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)

运行结果如下:

OpenCV+python实现图形绘制_第6张图片
再然后是关于圆弧(或是椭圆)的绘制,使用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)

运行结果如下:
OpenCV+python实现图形绘制_第7张图片
接下来是任意多边形的绘制,首先我们定义多边形各点的坐标,用一个矩阵来存储:

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)

运行结果如下:
OpenCV+python实现图形绘制_第8张图片

三、文字和图片绘制

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

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)

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

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+python实现图形绘制_第10张图片
终于写完了~以上就是我们opencv图形绘制的全部内容。

你可能感兴趣的:(opencv,python,图像处理)