OpenCV+python实现图形绘制_python opencv 画图-程序员宅基地

技术标签: python  图像处理  opencv  


简介

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


一、线段绘制

我们首先来了解一下简单的线段绘制:
在线段绘制中我们使用的是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图形绘制的全部内容。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_44051854/article/details/114297260

智能推荐

Cocos2d-x 窗口大小调整_cocos2dx设置窗口大小-程序员宅基地

文章浏览阅读4.2k次。打开src目录下的AppDelegate.cpp文件,若无修改则在第45行处找到全局声明的Size变量,修改`designResolutionSize`中的大小即可。_cocos2dx设置窗口大小

springboot接收枚举值的默认方式_springboot get请求怎么接收前端传递的枚举数字-程序员宅基地

文章浏览阅读1.6k次。测试代码:@PostMapping() public void test(@RequestBody Student student){ System.out.println(student.getLover().name()); }class Student{ private Lover lover; public Lover getLover() { return lover; } public void setLover_springboot get请求怎么接收前端传递的枚举数字

【数学建模笔记】【第七讲】多元线性回归分析(二):虚拟变量的设置以及交互项的解释,以及基于Stata的普通回归与标准化回归分析实例_stata两个虚拟变量的交互项-程序员宅基地

文章浏览阅读1.5w次,点赞24次,收藏120次。简单来说就是去量纲后的回归(因为你要比较不同变量之间的显著性的大小,那么带着量纲怎么比,所以先把量纲去掉,然后再比较)官话:为了更为精准的研究影响评价量的重要因素(去除量纲的影响),我们可考虑使用标准化回归系数。_stata两个虚拟变量的交互项

mysql-程序员宅基地

文章浏览阅读203次。有时候安装mysql后使用mysql命令时报错 Can't connect to MySQL server on localhost (10061),或者用net start mysql 时报服务名无效,一般是因为mysql服务没有启动。这时候可以用管理身份运行cmd.exe(注意必须是管理..._c:\program files\mysql\mysql server 5.6\bin>mysqld --install install/remove

亚信科技java笔试题答案_亚信笔试题卷以及答案.docx-程序员宅基地

文章浏览阅读6.2k次,点赞3次,收藏44次。亚信联创科技校园招聘B 卷考试时间60_分钟 _考试方式(闭)卷(本试卷满分 100 分,答案请写在答题卡上)请不要在问卷上答题或涂改,笔试结束后请务必交回试卷部分内容分值备注一、计算机基础40分C/C++语言基础40分技能部分二、二选一JAVA 语言基础40分三、数据库20分总分100 分第一部分——计算机基础一、选择题(每题 2 分,总分 40分)1.CPU 状态分为目态和管态两种..._亚信科技java实习笔试题

三线城市程序员的薪资待遇怎么样?我分享提高java技术水平的几个方法_三线城市学java-程序员宅基地

文章浏览阅读1.3k次。3年对一个程序员来说是非常重要的。像我自己本身就是做程序员的,目前的薪资待遇是13K左右,虽然在我所在的公司不是最高的,但在所在的这个城市的消费水平来说,除了日常的开支,包括房租、水电、伙食、人际交往等费用之外,还能留下一部分闲钱自己存起来。不同城市的薪资待遇是不一样的,这主要是由于当地的消费水平和经济发展水平不同,所以如果你想要更高的薪资待遇,就要考虑在一线城市或者经济发达的城市工作。一个有着丰富工作经验的程序员,他的技能水平、经验和能力都比没有经验的程序员更加出色,所以他们的薪资待遇也会更高一些。_三线城市学java

随便推点

恭迎万亿级营销(圈人)潇洒的迈入毫秒时代 - 万亿user_tags级实时推荐系统数据库设计...-程序员宅基地

文章浏览阅读418次。标签PostgreSQL , 标签 , 推荐系统 , 实时圈人 , 数组 , gin , gist , 索引 , rum , tsvector , tsquery , 万亿 , user , tag , 淘宝背景我们仅用了PostgreSQL的两个小特性,却解决了业务困扰已久的大问题。推荐系统是广告营销平台的奶牛,其核心是精准、实时、..._实时圈人

软件测试风险追踪表_软件测试风险管理表格-程序员宅基地

文章浏览阅读430次。软件测试风险追踪表风险追踪表 项目名称: 填制人: 编号 风险描述 影响 风险等级 发生的可能性 应对策略 状态 责任人 备注 ..._软件测试风险管理表格

AAC ADTS封装实现-程序员宅基地

文章浏览阅读1.2k次。一、AAC音频格式种类有哪些AAC音频格式是一种由MPEG-4标准定义的有损音频压缩格式。AAC包含两种格式 ADIF(Audio Data Interchange Format音频数据交换格式)和ADTS(Audio Data transport Stream音频数据传输流)。ADIF特点:可以确定的找到音视频数据的开始,不需要进行在音视频数据流中间开始的解码,它的解码必须在明确的定义开始。应用场景:常用在磁盘文件中。ADTS特点:具有同步字的比特流,解码可以在这个流中任何位置开始。类似于mp_aac adts

Unity基础概念_unity基本概念-程序员宅基地

文章浏览阅读213次。像要使用Resouce类,必须创建一个 Resouce 文件夹,然后把需要的资源放进去,才可以在代码中设置路径进行访问_unity基本概念

在gitlab中指定自定义 CI/CD 配置文件_gitlab配置cicd-程序员宅基地

文章浏览阅读2.4k次。指定自定义 CI/CD 配置文件,顾名思义就是在项目中指定文件来代替默认的.gitlab-ci.yml文件的方式来运行流水线。以往我们在使用流水线的时候,都是默认将.gitlab-ci.yml文件存在在项目的跟路径下,但是我们也可以指定备用文件名路径,或者不想在每个项目中来维护这个yml文件,那么通过自定义 CI/CD 配置文件便可以实现。_gitlab配置cicd

mysql出现#1063 - Incorrect column specifier for column 'id'的解决方法_sql 错误 [1063] [42000]: incorrect column specifier -程序员宅基地

文章浏览阅读1w次。出现这个表示如果设置了自动增长,字段类型应该设置为int整型。_sql 错误 [1063] [42000]: incorrect column specifier for column 'id' incorrec