OpenCv基础之绘图及几何变换实例

news2024/11/24 11:25:42

文章目录

  • OpenCv基础之绘图及几何变换实例
    • 创建背景图
    • 线段绘制
    • 矩形绘制
    • 圆绘制
    • 椭圆绘制
    • 绘制多边形
    • 添加文字
  • 几何变换
    • 图像平移
    • 图像缩放
    • 图像旋转
    • 仿射变换
    • 透视变化

OpenCv基础之绘图及几何变换实例

绘图在图像处理中,主要是在处理完图像后,将图像中的目标进行标注,以便于检验处理效果。

创建背景图

# 创建一张黑色的背景图
img = np.zeros((512,512,3),np.uint8)

线段绘制

cv.line(img, pt1, pt2, color, thickness=None, lineType=None, shift=None)

  • img:要绘制线条的图像,可以是灰度图像或彩色图像。
  • pt1:线条的起点坐标,为二元组(x1, y1)。
  • pt2:线条的终点坐标,为二元组(x2, y2)。
  • color:线条的颜色,可为标量、元组或列表。如果为标量,则表示使用灰度值(0255)进行绘制;如果为元组或列表,则表示使用BGR值(Blue, Green, Red,0255)进行绘制。
  • thickness:线条的宽度,为正整数。如果不指定,则默认为1。(-1为填充)
  • lineType:线条的类型,有8连通、4连通、抗锯齿等类型可选。如果不指定,则默认为8连通。
  • shift:坐标点小数位的位数。如果不指定,则默认为0,即坐标点为整数。
# 绘制一条,从图像坐标中[100,100]到[200,200]颜色为蓝色,限宽为5个像素的线段
res = cv2.line(img,(100,100),(200,200),(255,0,0),5)
cv2.imshow('res',res)
cv2.waitKey(0)

在这里插入图片描述

矩形绘制

cv.rectangle(img, pt1, pt2, color, thickness=None, lineType=None, shift=None)

  • pt1:矩形的左上角坐标,为二元组(x1, y1)。
  • pt2:矩形的右下角坐标,为二元组(x2, y2)。

其他参数,参考线段函数说明即可。

# 画一个长为200,宽为100的绿色边框的矩形
res = cv2.rectangle(img,(150,100),(250,300),(0,255,0),3)
cv2.imshow('res',res)
cv2.waitKey(0)

在这里插入图片描述

圆绘制

cv.circle(img, prets, radius, color, thickness=None, lineType=None, shift=None)

  • prets:圆心坐标
  • radius:半径

其他参数,参考线段函数说明即可。

# 画一个半径为100像素且填充红色的圆
res = cv2.circle(img,(200,200),100,(0,0,255),-1)
cv2.imshow('res',res)
cv2.waitKey(0)

在这里插入图片描述

椭圆绘制

cv.ellipse(img, center, axes, angle, startAngle, endAngle, color, thickness=None, lineType=None, shift=None)

  • center:椭圆形的中心点坐标
  • axes:椭圆形两条轴的长度
  • angle:椭圆形相对于水平方向的旋转角度(逆时针)
  • startAngle:起始角度(单位为度)
  • endAngle:结束角度(单位为度)

其他参数,参考线段函数说明即可。

# 在图中心画一个长轴为100,短轴半长为50且用蓝色填充的半椭圆,起始角度为0,结束角度为180
res = cv2.ellipse(img,(200,200),(100,50),0,0,180,(255,0,0),-1)
cv2.imshow('res',res)
cv2.waitKey(0)

在这里插入图片描述

绘制多边形

cv.polylines(img, pts, isClosed, color, thickness=None, lineType=None, shift=None)

  • pts:多边形的顶点坐标,需要以数组形式传入,如 np.array([[x1, y1], [x2, y2], [x3, y3], …], dtype=np.int32)。
  • isClosed:是否闭合多边形。如果为 True,则闭合多边形;如果为 False,则不闭合多边形。
# 定义三角形的顶点坐标
pts = np.array([[100, 300], [300, 300], [200, 100]], np.int32)
# 绘制一个蓝色的三角形
res = cv2.polylines(img, [pts], True, (255, 0, 0), 2)
cv2.imshow('res',res)
cv2.waitKey(0)

在这里插入图片描述

添加文字

cv2.putText(img, text, org, fontFace, fontScale, color, thickness=None, lineType=None, bottomLeftOrigin=None)

  • text:要绘制的文本内容。
  • org:文本框左下角的坐标。
  • fontFace:字体类型,如 cv2.FONT_HERSHEY_SIMPLEX、cv2.FONT_HERSHEY_PLAIN、cv2.FONT_HERSHEY_DUPLEX 等。
  • fontScale:字体缩放比例。
  • bottomLeftOrigin:如果为 True,则文本框的原点为左下角;如果为 False,则文本框的原点为左上角。默认为 False。
font = cv2.FONT_HERSHEY_SIMPLEX# 字体类型
cv2.putText(img_zeros,'Hello OpenCv',(10,200),font,1,(255,255,255),2,cv2.LINE_AA)
cv2.imshow('res',img)
cv2.waitKey(0)

在这里插入图片描述
除此之外,读者也可以通过改变其中的数据,改变其线条类型、粗细以及其他性质,对其有更好的理解。

几何变换

图像平移

即将图像中所有的点按照指定的平移量水平或者垂直移动。
dst = cv2.warpAffine(src, M, dsize[], dst[], flags,borderMode, borderValue)

  • 参数src表示输入的源图像
  • 参数M表示仿射变换矩阵
  • 参数dsize表示输出图像的大小,可以使用src.shape[1], src.shape[0]表示输出图像的大小为输入图像的大小。
  • 参数dst表示输出的目标图像,如果没有指定,则函数会自动创建一个与输入图像大小相同的图像。
  • 参数flags表示插值算法的类型,可以指定为cv2.INTER_LINEAR(线性插值)、cv2.INTER_NEAREST(最近邻插值)、cv2.INTER_CUBIC(三次样条插值)、cv2.INTER_AREA(区域插值)、cv2.INTER_LANCZOS4(lanczos插值)等。
  • 参数borderMode表示边界模式的类型,可以指定为cv2.BORDER_CONSTANT、cv2.BORDER_REPLICATE、cv2.BORDER_REFLECT、cv2.BORDER_WRAP等。
  • 参数borderValue表示当使用cv2.BORDER_CONSTANT边界模式时,指定的填充值。
# 读取图像信息
img = cv2.imread('img/orange.png')
# 构造移动矩阵,在x轴方向移动50个像素距离,在y移动25个像素距离
M = np.float32([[1,0,50],[0,1,25]])
rows,cols = img.shape[:2]# 获得图像的行列像素
# 对图像进行仿射变换(线性变换),它可以用于对图像进行平移、旋转、缩放、翻转等操作
res = cv2.warpAffine(img,M,(cols+50,rows+50),borderMode=cv2.INTER_LANCZOS4)# 注意,这里rows和cols需要反置,即先列后行
cv2.imshow('origin-picture',img)
cv2.imshow('new-picture',res)
cv2.waitKey(0)
cv2.destroyAllWindows()

在这里插入图片描述

图像缩放

按照指定的比例进行放大或缩小,下采样:缩小,上采样:放大
cv.resize(src,dsize=None,fx,fy,interpolation),dsize输出图像尺寸,fx沿水平轴的比例因子,fy沿垂直轴的比例因子,interpolation插值方法
插值方法:默认cv2.INTER_NEAREST最近邻插值,INTER_LINEAR线性插值,INTER_CUBIC三次样条插值(44像素邻域),INTER_LANCZOS4(lanczos插值,88像素邻域),INTER_AREA区域插值

# 方式1:通过设置缩放比例,来对图像进行放大或缩小(放大2倍)
resl = cv2.resize(img,None,fx=2,fy =2,interpolation=cv2.INTER_LINEAR)
# 缩小
height ,width = img.shape[:2]
# 方式2:直接设置图像的大小,不需要缩放因子
res2 = cv2.resize(img,(int(0.8*width),int(0.8*height)),interpolation=cv2.INTER_AREA)
cv2.imshow('origin_picture',img)
cv2.imshow('res1',resl)
cv2.imshow('res2',res2)
cv2.waitKey(0)
cv2.destroyAllWindows()

由于缩放图像需要通过cv进行展示,通过matplotlib展示不能够观察到缩放的效果。在这里插入图片描述

图像旋转

即以图像的中心为原点,旋转一定的角度,即就是将图像上的所有像素都旋转一个相同的角度。
问题:旋转后图像的大小一般会改变,即可以把转出显示区域的图像截去,或者扩大图像范围来显示所有的图像。
解决方法:①旋转前通过坐标平移,避免信息的丢失,②图像旋转后进行填充处理

# 参数1:旋转中心,参数2:旋转角度,参数3:缩放因子(正为逆时针,负为正时针)
M = cv2.getRotationMatrix2D((cols/2,rows/2),45,0.5)
dst = cv2.warpAffine(img,M,(cols,rows),borderValue=(255,255,255))
cv2.imshow('origin-picture',img)
cv2.imshow('rotation',dst)
cv2.waitKey(0)
cv2.destroyAllWindows()

在这里插入图片描述

仿射变换

通过对图片进行旋转,平移,缩放,剪切,反射等操作已达到数据增强的效果。
cv.getAffineTransform(pos1,pos2)
pos1变换前位置,pos2变换后位置,用于获取从三个点的原始坐标到三个点的目标坐标的仿射变换矩阵。它接受三个源点和三个目标点,并返回一个2x3的仿射变换矩阵。

rows,cols = img.shape[:2]
pos1 = np.float32([[50,50],[200,50],[50,200]])
pos2 = np.float32([[10,100],[200,50],[100,250]])
M = cv2.getAffineTransform(pos1,pos2)
result = cv2.warpAffine(img,M,(cols,rows))
cv2.imshow('origin-picture',img)
cv2.imshow('affine',result)
cv2.waitKey(0)
cv2.destroyAllWindows()

在这里插入图片描述

透视变化

对图像进行投影变换、透视变换、视角变换等操作

  • cv2.getPerspectiveTransform(src, dst)函数,可以根据输入图像和输出图像中的四个点计算出透视变换矩阵;参数src表示输入图像中的四个顶点的坐标,参数dst表示输出图像中的四个顶点的坐标。函数会返回一个透视变换矩阵M。
  • cv2.warpPerspective(src, M, dsize[], dst, flags, borderMode, borderValue)根据透视变换矩阵对图像进行变换。
    参数src表示输入的源图像,参数M表示透视变换矩阵,参数dsize表示输出图像的大小,可以使用src.shape[1], src.shape[0]表示输出图像的大小为输入图像的大小。
    参数dst表示输出的目标图像,如果没有指定,则函数会自动创建一个与输入图像大小相同的图像。
  • 参数flags表示插值算法的类型,可以指定为cv2.INTER_LINEAR、cv2.INTER_NEAREST、cv2.INTER_CUBIC、cv2.INTER_AREA、cv2.INTER_LANCZOS4等。
  • 参数borderMode表示边界模式的类型,可以指定为cv2.BORDER_CONSTANT、cv2.BORDER_REPLICATE、cv2.BORDER_REFLECT、cv2.BORDER_WRAP等。
    参数borderValue表示当使用cv2.BORDER_CONSTANT边界模式时,指定的填充值。
rows,cols = img.shape[:2]
# 定义输入图像中的四个顶点
src_points = np.float32([[0, 0], [cols - 1, 0], [cols - 1, rows - 1], [0, rows - 1]])
# 定义输出图像中的四个顶点
dst_points = np.float32([[0, 0], [cols - 1, 0], [int(0.6 * cols), rows - 1], [int(0.4 * cols), rows - 1]])
# 根据输入图像和输出图像中的四个点计算出透视变换矩阵
M = cv2.getPerspectiveTransform(src_points,dst_points)
# 根据透视变换矩阵对图像进行变换
result = cv2.warpPerspective(img,M,(cols-1,rows-1),flags=cv2.INTER_LINEAR,borderMode=cv2.BORDER_CONSTANT,borderValue=(255,255,0))
cv2.imshow('origin-picture',img)
cv2.imshow('perspective',result)
cv2.waitKey(0)
cv2.destroyAllWindows()

在这里插入图片描述
以上只是罗列了一些基本属性,实际应用中,还需要我们进一步查询API或者资料,进行深入学习,以上实例仅供学习。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/448918.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Python算法设计 - 哈夫曼编码

目录 一、哈夫曼树二、哈夫曼编码三、Python算法实现四、作者Info 一、哈夫曼树 上图是根据“this is an example of a huffman tree”中得到的字母频率来建构的哈夫曼树 二、哈夫曼编码 多年来,哈夫曼编码在统计数据压缩方面是非常先进的,应当指出&am…

C# 类库打包推送到nuget

步骤1:注册nuget 账号,可以使用outlook邮箱进行注册 步骤2:建立 apikey 名字自己起,Glob Pattern 填入“*” 步骤3:把程序打包,打包很简单右键vs2022 打包就好 但是注意*.csproj 文件修改,修改目的是为了…

IGS 产品长文件命名方式简介

文章目录 Part.I IntroductionPart.II 文件命名方式Chap.I 官方说明Chap.II 实例 Reference Part.I Introduction 2022 年 11 月 30 日(DOY 331, GPSWD 22380)及以后,IGS 的参考框架从 IGS-14 切换为 用 IGS-20,最新的卫星和地…

vue3中<script setup> 和 setup函数的区别

<script setup> 是在单文件组件 (SFC) 中使用组合式 API 的编译时语法糖。当同时使用 SFC 与组合式 API 时该语法是默认推荐。相比于普通的 <script> 语法&#xff0c;它具有更多优势&#xff1a; 更少的样板内容&#xff0c;更简洁的代码。能够使用纯 TypeScript…

拿下模板进阶

模板进阶 1. 非类型模板参数 模板参数分类类型形参与非类型形参。 类型形参即&#xff1a;出现在模板参数列表中&#xff0c;跟在class或者typename之类的参数类型名称。 非类型形参&#xff0c;就是用一个常量作为类(函数)模板的一个参数&#xff0c;在类(函数)模板中可将…

代码随想录训练营day53|1143、最长公共子序列;1035、不相交的线;53、最大子序和动态规划

1143、最长公共子序列 给定两个字符串 text1 和 text2&#xff0c;返回这两个字符串的最长公共子序列的长度。 一个字符串的 子序列 是指这样一个新的字符串&#xff1a;它是由原字符串在不改变字符的相对顺序的情况下删除某些字符&#xff08;也可以不删除任何字符&#xff…

如何在一个中文大模型上,加入招投标字段标注的数据,搭建一个招投标字段解析的Transformer模型?

ChatGPT方案1 在一个中文大模型上加入招投标字段标注的数据&#xff0c;并搭建招投标字段解析的Transformer模型可以通过以下步骤实现&#xff1a; 收集并标注招投标相关的数据。可以使用现有的数据集&#xff0c;也可以通过爬虫技术获取相关数据&#xff0c;然后进行人工标注。…

Linux应用编程(进程)

一、进程与程序 注册进程终止处理函数 atexit() #include <stdlib.h> int atexit(void (*function)(void));使用该函数需要包含头文件<stdlib.h>。 函数参数和返回值含义如下&#xff1a; function&#xff1a;函数指针&#xff0c;指向注册的函数&#xff0c;此…

使用S3协议通过dfs实现Spring的SPI机制和spring.factories

目录 参考一、SPI机制1、什么是SPI2、使用场景&#xff1f;3、使用介绍4、代码演示新建工程edevp-dfs-api的spi接口新建阿里云oss实现类新建minio实现类新建测试工程edevp-demo测试 5、总结优点&#xff1a;解耦缺点&#xff1a; 二、Spring Boot的扩展机制之Spring Factories1…

MathType7最新版本下载安装与使用,注册表文件分享,添加为Word公式插件

wx供重浩&#xff1a;创享日记 对话框发送&#xff1a;mathtype 免费获取MathType7安装包注册表文件 MathType是强大的数学公式编辑器&#xff0c;与常见的文字处理软件和演示程序配合使用&#xff0c;能够在各种文档中加入复杂的数学公式和符号&#xff0c;可用在编辑数学试卷…

【回忆 总结】我的大学四年

大学四年关键词速览 如果穿越回大一&#xff0c;你想对大一的你提什么最重要的建议&#xff1f;同样是上网课&#xff0c;我为何能比大多数同学学的更好&#xff1f;回到学校&#xff0c;我的大二似乎一帆风顺&#xff1f;在不断的迷茫和徘徊中&#xff0c;大三的我做出的决定&…

Vue开发过程中那些易混淆的知识点

vue & vue cli Vue CLI Vue 一堆的js插件Vue CLI是基于 Node.js 开发出来的工具&#xff0c;它是一个官方发布 vue.js 项目脚手架&#xff0c;可以快速搭建 Vue 开发环境以及对应的 webpack 配置&#xff0c;单独编译&#xff0c;单独部署。可以再集成各种第三方插件&am…

偏好强化学习概述

文章目录 为什么需要了解偏好强化学习什么是偏好强化学习基于偏好的马尔科夫决策过程&#xff08;Markov decision processes with preferences&#xff0c;MDPP&#xff09; 反馈类型分类学习算法分类近似策略分布(Approximating the Policy Distribution)比较和排序策略(Comp…

STATS 782 - R Basic Concepts

文章目录 前言一、R basic1. R Operator2. 变量赋值3. c() - combine 函数4. 对向量的操作5. Special Numerical Values 二、 Built-in Functions1. min, max and range2. sum and prod3. Cumulative Summaries4. paste5. list&#xff08;&#xff09;6. seq&#xff08;&…

【Unity VR开发】结合VRTK4.0:添加遮蔽追踪器

语录&#xff1a; 恋爱应该是双方扶持对方共同完成自己的目标&#xff0c;而不是虚幻的思想、肤浅的物质、和纸醉金迷的生活。 前言&#xff1a; 遮蔽追踪器&#xff08;Trackers.ObscuranceTracker&#xff09;是基于游戏对象存在或不可见之间切换对象的状态&#xff0c;从而遮…

SpringBoot 通过AOP + Redis 防止表单重复提交

Spring Boot是一个用于构建Web应用程序的框架&#xff0c;通过AOP可以实现防止表单重复提交。在这篇博客中&#xff0c;我将介绍如何使用AOP来防止表单重复提交。 配置Redis 1. 添加Redis依赖 <dependency><groupId>org.springframework.boot</groupId>&…

【Python爬虫项目实战二】Chatgpt还原验证算法-解密某宝伪知网数据接口

目录 🐱背景🐱工具🐱分析流程🐔登陆分析🐔检索分析🐔模拟HTML代码请求🐔 解析HTML🐔 再次分析🐟分析js算法🐟 拿下furl🐟拿下sfname🐟拿下sfname🐔 构造请求🐔再次瓶颈🐔分析cookie🐟 成功演示🐱总结

【历史上的今天】3 月 24 日:苹果推出 Mac OS X;微软前任 CEO 出生;Spring 1.0 正式发布

整理 | 王启隆 透过「历史上的今天」&#xff0c;从过去看未来&#xff0c;从现在亦可以改变未来。 今天是 2023 年 3 月 24 日&#xff0c;在 2016 年的今天&#xff0c;暴雪娱乐公司发布了第一人称射击多人游戏《守望先锋》。根据评分汇总网站 Metacritic 的统计&#xff0c…

新形势新政策下建企分包分供管理模式优化探索

通过建筑工程分包的模式&#xff0c;总包商可以有效地扬长避短&#xff0c;选择最有优势的分包企业&#xff0c;提高资源的使用效率&#xff0c;有利于在激烈的市场竞争中取得一席之地。当前&#xff0c;国内建筑市场工程分包总体运行情况良好&#xff0c;但还是存在着诸多阻碍…

Postcat 如何生成接口文档,2 分钟学会

Postcat 是一个强大的开源、跨平台&#xff08;Windows、Mac、Linux、Browsers...&#xff09;的 API 开发测试工具&#xff0c;支持 REST、Websocket 等协议&#xff08;即将支持 GraphQL、gRPC、TCP、UDP&#xff09;&#xff0c;帮助你加速完成 API 开发和测试工作。 作为代…