opencv实战项目十九:透射变换倾斜二维码校正

文章目录

  • 前言
  • 一、实现方法
  • 二、实现代码
  • 三,效果


前言

随着科技的飞速发展,二维码作为一种信息载体,已经广泛应用于我们的日常生活中。无论是支付、身份验证还是信息传播,二维码都发挥着不可替代的作用。然而,在实际应用中,我们常常会遇到一个问题:由于拍摄角度、设备性能等因素的影响,导致二维码出现倾斜,从而影响识别效率。为此,本文将为大家介绍一种基于透射变换的二维码倾斜校正方法,帮助大家解决这一难题。


一、实现方法

首先,通过对图像进行二值化操作,获取二值化背景,之后进行形态学变换处理二维码区域。接下来,借助轮廓分析方法,通过凸包逼近多边形以及四边形近似获取的四个角点。最后,依据这四个角点的位置,我们应用透视变换技术对二维码进行了矫正,以确保其准确性和可读性。

二、实现代码

import cv2
import numpy as npdef sort_vertices_clockwise(vertices):"""将四边形的四个顶点按照顺时针排序"""# 找到y坐标最小的点(即最低点),如果有多个最低点,则选择x坐标最小的点lowest_idx = np.argmin(vertices[:, 1])lowest_point = vertices[lowest_idx]# 将最低点移动到数组的起始位置vertices = np.roll(vertices, -lowest_idx, axis=0)# 计算其他三个点相对于最低点的极角other_points = vertices[1:]ref_point = vertices[0]angles = np.arctan2(other_points[:, 1] - ref_point[1], other_points[:, 0] - ref_point[0])# 根据极角对顶点进行排序sorted_indices = np.argsort(angles)sorted_vertices = np.vstack((ref_point, other_points[sorted_indices]))return sorted_vertices# 图片路径
path = r"F:\cv_traditional\1725413298229.png"# 读取图片,转换为灰度图
img = cv2.imread(path, 0)
print(img.shape)# 二值化处理,设置阈值50,将图片转换为二值图像
ret, thd = cv2.threshold(img, 50, 255, cv2.THRESH_BINARY_INV)# 定义结构元素,用于形态学操作
kernel1 = cv2.getStructuringElement(cv2.MORPH_RECT, (21, 21))# 对二值图像进行闭运算,填充轮廓内的孔洞
close = cv2.morphologyEx(thd, cv2.MORPH_CLOSE, kernel1)# 查找轮廓
contours, _ = cv2.findContours(close, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)# 找到面积最大的轮廓
max_contour = max(contours, key=cv2.contourArea)# 计算最大轮廓的凸包
hull = cv2.convexHull(max_contour)# 计算凸包的周长,并设置逼近多边形的精度
epsilon = 0.02 * cv2.arcLength(hull, True)# 使用approxPolyDP函数逼近多边形
approx = cv2.approxPolyDP(hull, epsilon, True)# 将轮廓点转换为1维数组
vertices_1d = np.array([np.squeeze(point) for point in approx])# 打印顺时针排序后的顶点
print(sort_vertices_clockwise(vertices_1d))# 绘制最大轮廓
cv2.drawContours(img, [approx], -1, (0, 255, 0), 3)# 获取图像的宽度和高度
h, w = img.shape# 定义变换后的目标点坐标
dst_point1 = [0, 0]
dst_point2 = [w, 0]
dst_point3 = [w, h]
dst_point4 = [0, h]# 将排序后的顶点转换为浮点数
ori = np.float32(sort_vertices_clockwise(vertices_1d))# 定义目标坐标点
dst = np.float32([dst_point1, dst_point2, dst_point3, dst_point4])# 计算透射变换矩阵
M = cv2.getPerspectiveTransform(ori, dst)# 应用透射变换
transformed_image = cv2.warpPerspective(img, M, (700, 700))# 显示原始图像和变换后的图像
cv2.imshow("原始图像", img)
cv2.imshow("变换后的图像", transformed_image)# 等待按键后关闭窗口
cv2.waitKey(0)

三,效果

倾斜图片:在这里插入图片描述
校正后图片:在这里插入图片描述

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

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

相关文章

TeamTalk消息服务器(群组相关)

具体的流程如下介绍,后续需要着重研究数据库相关表的结构设计。 群组信令和协议设计 enum GroupCmdID {CID_GROUP_NORMAL_LIST_REQUEST 1025,CID_GROUP_NORMAL_LIST_RESPONSE 1026,CID_GROUP_INFO_REQUEST 1027,CID_GROUP_INFO_RESPONSE 1028,// ...... 暂时省…

【Python】一文详细向您介绍 bisect_left 函数

【Python】一文详细向您介绍 bisect_left 函数 下滑即可查看博客内容 🌈 欢迎莅临我的个人主页 👈这里是我静心耕耘深度学习领域、真诚分享知识与智慧的小天地!🎇 🎓 博主简介:985高校的普通本硕&#x…

项目管理:项目经理如何才能做好时间管理?

在项目管理中,时间管理是至关重要的环节。作为项目经理,有效的时间管理不仅关乎个人工作效率,更直接影响到项目的整体进度、成本控制和质量保证。 以下是一些建议,帮助项目经理更好地进行时间管理: 一、明确项目目标…

做Ozon的挣钱逻辑,选择高客单高利润的4点原因

以下是选择高客单高利润产品在 Ozon 上销售的四点原因: 一、利润空间更可观 高客单价产品单个利润高:比如销售一件高客单价的高端电子产品,其利润可能是低客单价产品的数倍甚至更多。假设一件低客单价的普通日用品利润为 5 元,而…

2024年9月7日(星期六)骑行滑草场

2024年9月7日 (星期六) 骑行滑草场,早8:30到9:00, 郊野公园西门集合,9:00准时出发【因迟到者,骑行速度快者,可自行追赶偶遇。】 偶遇地点:郊野公园西门集合 ,家住东,南,北的骑友在…

护眼灯真的可以保护眼睛吗?曝光劣质护眼台灯常见的三个特征

护眼灯真的可以保护眼睛吗?随着时代的发展,我们注意到越来越多的孩子开始佩戴眼镜。这一趋势引起了许多细心家长的关注,他们认识到这不仅是个别情况,而是现代生活方式和环境对孩子视力健康的挑战。自然而然地,“儿童是…

springboot名著阅读网站

基于 springbootvue实现的名著阅读网站(源码L文ppt)4-035 4 系统设计 4.1 系统概述 名著阅读网站的设计与开发是指对该系统的各个功能模块进行详细设计,力求每个模块都能够满足用户的要求,系统开发完成后还需对系统进行单元…

C语言 ——— #define 定义宏

目录 何为宏 宏的声明及其使用方式 宏中的括号是否多余 何为宏 #define 机制包括了一个规定,允许把参数替换到文本中,这种实现通常称宏 宏的声明及其使用方式 声明代码演示: #define MAX(x,y) ((x)>(y)?(x):(y)) 使用代码演示&a…

第66期 | GPTSecurity周报

GPTSecurity是一个涵盖了前沿学术研究和实践经验分享的社区,集成了生成预训练Transformer(GPT)、人工智能生成内容(AIGC)以及大语言模型(LLM)等安全领域应用的知识。在这里,您可以找…

xxe漏洞靶场实战通过

1、用nmap扫描C段,找到靶场 2、打开网址,查看robots.txt文件 3、发现有两个目录,分别查看发现一个登录页面 4、使用BP抓包,发现是xml类型 5、尝试查看/etc/passwd 文件,在尝试查看xxe.php文件,发现是编码后…

VXLAN 为何采用UDP

VXLAN 简介 VXLAN是一种网络虚拟化技术,它通过在UDP数据包中封装MAC地址和IP信息,使得二层网络(如以太网)能够跨越三层网络(如IP网络)进行扩展。这种封装方式不仅支持TCP流量的传输,还能有效处…

合宙LuatOS开发板Core_Air780EP使用说明

Core-Air780EP 开发板是合宙通信推出的基于 Air780EP 模组所开发的, 包含电源,SIM卡,USB,天线,音频等必要功能的最小硬件系统。 以方便用户在设计前期对 Air780EP模块进行性能评估,功能调试,软…

辞职一年赚了50w才知道:上班真的不赚钱。

不知不觉就进入九月了,一年一度的苹果秋季发布会又准备开始了。 听说今年iPhone系列有重磅升级,会搭载苹果智能 「Apple Intelligence」,搓搓手等着以旧换新了! 此前iPhone15 pro max系列用户已经可以享受部分AI功能,…

【C++模板初阶】

文章目录 一、泛型编程二、函数模板1.函数模板概念2.函数模板格式3.函数模板的原理4 函数模板的实例化1. 隐式实例化2. 显式实例化不同类型形参传参时的处理 5.模板参数的匹配原则 三、类模板1 类模板的定义格式2 类模板的实例化 一、泛型编程 首先大家先思考一个问题&#xff…

文字转视频软件哪个好用?揭秘创意新工具

最近,我在筹备一个小型的个人项目,需要制作一系列的教学视频,但我对视频编辑一窍不通。就在我快要放弃的时候,我发现了一些神奇的工具,它们能自动把文字变成视频! 想知道自动生成视频的软件有哪些吗&#…

nginx配置白名单服务

http { # 其他配置… # 定义一个名为 whitelist 的共享内存区域 limit_zone whitelist $binary_remote_addr 10m;server {listen 80;server_name example.com;# 白名单配置location / {# 设置只允许特定 IP 访问allow 192.168.1.100; # 允许的 IPallow 192.168.1.10…

【嵌入式学习笔记】---- OLED屏幕工作原理

1 驱动芯片SSD1603简介 1.1 SSD1603芯片图 SSD1603是一款点阵显示屏控制器,可嵌入在屏幕中,用于执行接收数据、显示存储、扫描刷新等任务驱动接口:128个SEG引脚和64个COM引脚,对应 128 64 128\times 64 12864像素点阵显示屏内置…

Gartner发布安全威胁情报产品和服务市场指南:威胁情报产品和服务需具备的8项核心能力和21项可选能力

安全和风险管理领导者很难知道哪些威胁会真正影响到他们的组织。他们应该利用这项研究来选择正确的安全威胁情报产品和服务,并更有效地了解和应对威胁形势。 主要发现 各种规模和垂直行业的企业对威胁情报 (TI) 产品和服务的需求持续增加,但许多组织仍然…

解锁Python编程的无限可能:《奇妙的Python》带你漫游代码世界!

随着编程语言的不断演进,Python已经成为开发者们心目中的“瑞士军刀”。它的简洁易用、强大的库支持、广泛的应用领域,让它在人工智能、数据分析、网络爬虫、自动化办公等领域展现了无与伦比的优势。那么,如何深入掌握Python这门语言并用它解…

电脑技巧:如何在Win11电脑上调整设置,让屏幕更加护眼?

目录 一、调整屏幕亮度 二、启用夜间模式 三、调整色彩设置 四、使用第三方护眼软件 五、保持良好的用眼习惯 总结 随着长时间使用电脑的人越来越多,护眼问题也变得越来越重要。Win11作为更新的操作系统,提供了更多的设置选项来帮助我们保护眼睛。本文将详细介绍如何在…