opencv实战项目十七:透射变换仪表表盘校正

news2024/9/23 7:22:58

文章目录

  • 前言
  • 一、透射变换介绍:
  • 二、opencv实现
    • 2.1 cv2.getPerspectiveTransform()
    • 2.2 cv2.warpPerspective()
  • 三,代码实现:
  • 四,矫正效果:


前言

在这个信息化时代,图像处理技术在众多领域发挥着越来越重要的作用。无论是自动驾驶、工业检测,还是医疗影像分析,都离不开对图像的精确识别和处理。在众多图像处理技术中,透射变换(Perspective Transform)无疑是一种非常实用的方法,它能够帮助我们校正因视角、镜头畸变等因素导致的图像失真。今天,我将带领大家走进透射变换的世界,探讨如何利用这一技术对仪表表盘进行校正,以便更准确地读取数据。

一、透射变换介绍:

图像的透射变换(Perspective Transformation),也常被称为投影变换或透视变换,是一种在二维图像中模拟三维空间中物体视角变化的几何变换。这种变换能够改变图像中物体的视角,使得我们可以从一个特定的角度观察物体,就像我们在现实世界中改变观察位置一样。

透射变换的主要特点和用途如下:

特点:

视角改变:透射变换能够模拟从不同角度观察同一物体的效果。例如,将一个俯视图转换为正视视图。
形状扭曲:与简单的旋转、缩放和平移不同,透射变换可以改变图像中物体的形状,使其呈现出不同的视角效果。
四边形到四边形的映射:透射变换通常涉及将图像中的一个四边形区域映射到另一个四边形区域。

用途:

图像校正:校正由于拍摄角度不正确导致的图像失真,如将倾斜的图像校正为水平视角。
视角变换:在计算机视觉中,变换图像以模拟从不同视角观察物体,这在自动驾驶、机器人导航等领域尤为重要。
图像拼接:将多个视角的图像拼接成一个宽广视角的图像,这在创建全景图像时非常有用。
虚拟现实:在虚拟现实和增强现实技术中,透射变换用于创建更加逼真的视角效果。
变换过程:

透射变换通常需要以下步骤:

确定对应点:在源图像和目标图像上分别确定四个对应的点。这四个点在源图像上定义了一个四边形区域,而在目标图像上定义了变换后的四边形区域。
计算变换矩阵:使用这四个点对,可以计算出透射变换矩阵。在OpenCV中,这可以通过cv2.getPerspectiveTransform()函数实现。
应用变换:使用计算出的变换矩阵,通过cv2.warpPerspective()函数将源图像变换到目标图像。

二、opencv实现

在opencv中要实现图像的透射变换需要三个步骤,首先定义源点和目标点,也就是定义源图像上的四个点和目标图像上的对应点,这些点将用于计算透射变换矩阵然后使用 cv2.getPerspectiveTransform() 函数来计算透射变换矩阵,最后使用cv2.warpPerspective() 函数来应用透射变换。

2.1 cv2.getPerspectiveTransform()

函数介绍:cv2.getPerspectiveTransform() 是 OpenCV 库中的一个函数,它用于计算从一个平面到另一个平面的透视变换矩阵。这个矩阵可以用来将图像中的点从一个四边形映射到另一个四边形,这在处理图像校正、视角变换等任务时非常有用。
输入:

src: 源图像中四边形的四个点,这是一个 4x2 数组,其中每一行代表一个点的坐标 (x, y)。
dst: 目标图像中对应的四边形的四个点,这也是一个 4x2 数组,与 src 中的点一一对应。

返回值

M: 返回一个 3x3 的浮点型透视变换矩阵。

注意:在提供源点和目标点时,点的顺序非常重要。通常,这些点应该按照顺时针或逆时针顺序排列,以确保变换的正确性。

2.2 cv2.warpPerspective()

函数介绍:
cv2.warpPerspective 是 OpenCV 库中的一个函数,它用于对图像应用透视变换。透视变换是一种二维图像变换,它模拟了三维空间中物体在不同视角下的外观。这种变换可以用来校正由于视角引起的图像扭曲,例如将一个倾斜的图像变换为正视图像。
输入:

src: 输入图像,可以是灰度图像或彩色图像。
M: 3x3 透视变换矩阵。
dsize: 输出图像的尺寸,格式为 (width, height)。
dst: 可选参数,输出图像。
flags: 插值方法标志。常见的插值方法包括:
cv2.INTER_LINEAR: 双线性插值(默认值)。
cv2.INTER_NEAREST: 最近邻插值。
cv2.INTER_AREA: 使用像素区域关系进行重采样。
cv2.INTER_CUBIC: 4x4 像素邻域的双三次插值。
borderMode: 边界像素外推方法,默认值为 cv2.BORDER_CONSTANT。
borderValue: 当 borderMode 为 cv2.BORDER_CONSTANT 时,这个值用于填充边界像素,默认为 0。

输出:

result: 变换后的图像。

注:透视变换通过cv2.getPerspectiveTransform函数计算得到矩阵M或手动指定,而输出图像尺寸由dsize参数决定,默认为(0, 0)时与变换后源图像尺寸一致。插值方法选择,如cv2.INTER_LINEAR,影响图像质量和计算效率。此外,borderMode和borderValue参数用于处理图像边界,确保变换后边界像素得到适当填充或外推。

三,代码实现:

一般情况下来说,表盘校正一般是跟在目标检测之后,目标检测标注时候只标注表盘区域如下图所示:
在这里插入图片描述
这样输入点即为目标检测输出的四个端点,我们的目的是让表盘尽可能为圆形,故校正的时候尝试将目标检测输出的矩形框校正为正方形即可,示例代码:

import cv2
import numpy as np

# 读取图像
image = cv2.imread(r'F:\traditional_vison\1691047616136.png')
height, width = image.shape[:2]

# 定义图像的四个端点坐标
top_left = [0, 0]
top_right = [width , 0]
bottom_right = [width , height ]
bottom_left = [0, height ]

h = max(height,width)
# 定义源图像中的四个点(透视变换前的点)
# 这里需要替换成你的实际坐标
pts1 = np.float32([top_left, top_right, bottom_right, bottom_left])
top_left2 = [0, 0]
top_right2 = [2*h , 0]
bottom_right2 = [2*h  , 2*h  ]
bottom_left2 = [0, 2*h ]

# 定义目标图像中的四个点(透视变换后的点)
# 这里需要替换成你的实际坐标
pts2 = np.float32([top_left2, top_right2, bottom_right2, bottom_left2])

# 计算透射变换矩阵
M = cv2.getPerspectiveTransform(pts1, pts2)

# 应用透射变换
transformed_image = cv2.warpPerspective(image, M, (2000, 2000))

# 显示原始图像和变换后的图像
cv2.imshow('Original Image', image)
cv2.imshow('Transformed Image', transformed_image)

# 保存变换后的图像
cv2.imwrite('transformed_image.jpg', transformed_image)

# 等待按键后关闭窗口
cv2.waitKey(0)
cv2.destroyAllWindows()

注:效果更好的方法可以尝试用二值化分割表盘,获取表盘的椭圆形蒙版,根据椭圆形的长轴和短轴来将表盘仿射为圆形表盘。

四,矫正效果:

在这里插入图片描述

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

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

相关文章

Python 利用rasterio库进行坐标转换

这是一篇必应上找的手册上的文章,特此记录 参考链接: 原文 参考链接2 影像中的RPC信息 目录 1、仿射变换矩阵转换2、使用控制点转换3、使用RPC进行坐标点转换 1、仿射变换矩阵转换 上面说的利用仿射转换矩阵进行转换,一些注意事项可以参考原文…

TQRFSOC开发板47DR LWIP自环测试

本例程基于RFSOC 47DR开发板实现LWIP自环通讯测试。使用开发板的网口与电脑或路由器等设备连接,使开发板与电脑在同一局域网内,使用telnet工具连接开发板,进行LWIP自环测试。 LWIP自环测试工程在Hello World项目上进行修改,首先打…

eclipse 配置 ABAP 连接操作手册

参考 GUI配置 按选择是否勾选single sign-on的方式,选择是否输入密码 点击NEXT 点击完成。

sqli-labs靶场通关攻略(46-50关)

第46关 (ORDER BY数字型注入) 输入?sort1 修改参数为2试一下 看到按照字母顺序进行了排序,所以它便是一个使用了order by语句进行排序的查询的一种查询输出方式 1出现报错,那么我们使用报错注入 查库 ?sort1 and updatexml(1,…

go.uber.org/ratelimit 源码分析

go.uber.org/ratelimit 源码分析 go 提供了一用来接口限流的包。其中"go.uber.org/ratelimit" 包正是基于漏桶算法实现的。 使用方式: 通过 ratelimit.New 创建限流器对象,参数为每秒允许的请求数(RPS)。使用 Take()…

8.29T2 国际象棋(构造:棋盘拆分成小方阵)

http://cplusoj.com/d/senior/p/NODSX2303B 暴力显然,因为肯定是从奇点到偶点,所以二分图匹配一下就好 首先我们手模一下,比如(11,11),我们可以手模出一个情况,也就是DInic跑出来的情况&#…

培训第三十九天(了解docker-compose,docker-compose编排容器,配置harbor服务)

一、回顾 1、拉取私有仓库镜像 # 配置dockerdocker pull 10.0.0.10:5000/centosnginx:v0 2、容器网络类型 brideg(net) default# docker启动之后会生成新的虚拟网卡,网卡的名称docker0# 网段默认是172.17.0.1# 所有的容器都桥接docker0,通过桥接共享网…

对物料分别评估

业务示例 在公司中,某些物料是同时在内部进行生产和在外部进行采购的。由于必须根据值区分内部零件和外部零件,因此应为这些物料设置分别评估。 有关工厂内的评估,可使用分别评估根据特定标准区分物料的部分库存,并且可以不同方…

Python画笔案例-019 绘制阴影丫字

1、绘制阴影丫字 通过 python 的turtle 库绘制一个阴影丫字的图案,如下图: 2、实现代码 绘制一个阴影丫字图,以下为实现代码: """阴影丫字.py """ import turtleturtle.delay(0) turtle.speed(0)d…

Linux —— 驱动——platform平台总线

platform平台总线是Linux内核中一个重要的概念,主要用于管理那些不通过传统物理总线(如USB、I2C、SPI等)连接的设备,特别是SoC(System on Chip,片上系统)内部集成的外设。以下是对platform平台总…

mysql8.0查询等级排名可使用窗口函数,那5.7的版本呢?

1、需求:查询用户详情的同时查询用户的排名 2、首先看下数据库表设计 分为会员用户表member_user和会员等级表member_level,升级的条件是根据经验值升级,表结构如下: 用户表 member_user CREATE TABLE member_user (id bigint(…

C#操作ms office实现office转pdf

前提 安装office 2019 安装vs 2022 新建项目 引入4个com包 编写代码 代码结构 代码如下 using Microsoft.Office.Interop.Excel;namespace UseMsOffice {internal class Program{static void Main(string[] args){WordToPdf();ExcelToPdf();PPTToPdf();}static void W…

SpringBoot3与AOP完美结合:轻松追踪用户操作,实现精准日志记录

程序员必备宝典https://tmxkj.top/#/ 1.pom文件 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-aop</artifactId></dependency><dependency><groupId>com.alibaba</groupId&g…

LlamaIndex 实现 Agent

RAG 是在数据层面为大模型提供更多、更新的外部知识&#xff0c;而 Agent &#xff08;智能体&#xff09;&#xff0c;为大模型扩展了推理业务的能力。数据是静态的&#xff0c;数据周期可能是天、小时甚至到秒&#xff0c;通过 RAG 实现时&#xff0c;需要调用对应系统的 API…

uni-app组件

一. 什么是组件,有什么好处? 在uni-app中&#xff0c;组件是构成应用的基本单位&#xff0c;它们是用来定义用户界面的一部分&#xff0c;并且通常包含了视图和逻辑。组件的设计使得开发者能够以声明式的方式构建应用界面&#xff0c;并且通过组件化的开发方式来提高代码的复…

vue-cli搭建项目过程

一.前言 传统的前端项目架构&#xff1a; 指的就是一个项目中有很多个HTML文件&#xff0c;每一个HTML文件都是相互独立的&#xff0c;如果需要在页面中导入一些外部依赖的css,js文件&#xff0c;就需要在每一个html文件中都导入就会显得特别麻烦&#xff0c;而且这些外部依赖…

详细git使用教程以及git base here命令行

0 下载 这个是官网下载特别慢 Git - Downloads (git-scm.com) 1 最基本操作与初始配置 1.1&#xff0c;linux的基本命令可用 下载安装后鼠标右键选git base here即可打开 1.2&#xff0c;git init /git clone初始化&#xff0c;创建本地仓库 出现.git隐藏文件 git clone “…

Big Model Weekly | 第34期

点击蓝字 关注我们 AI TIME欢迎每一位AI爱好者的加入&#xff01; 01 MiniCPM-V: A GPT-4V Level MLLM on Your Phone 近期多模态大型语言模型&#xff08;MLLMs&#xff09;的快速发展&#xff0c;从根本上改变了人工智能研究和产业的格局&#xff0c;为实现人工智能的下一个重…

Java去掉字符串中的特殊符号只保留中文数字和字母

今天在做一个导入功能发现用户导入的数据有特殊符号&#xff0c;于是想着给他去掉&#xff0c;搜了一下发现大多数方法都只保留了字母数字&#xff0c;连中文都去掉了&#xff0c;这很明显不符合我的需求 直接上代码 /*** author Sakura* date 2024/8/27 15:18*/ public clas…

Python(C++)自动微分导图

&#x1f3af;要点 反向传播矢量化计算方式前向传递和后向传递计算方式图节点拓扑排序一阶二阶前向和伴随模式计算二元分类中生成系数高斯噪声和特征二元二次方程有向无环计算图超平面搜索前向梯度下降算法快速傅里叶变换材料应力和切线算子GPU CUDA 神经网络算术微分 Pytho…