利用 OpenCV 进行棋盘检测与透视变换
利用 OpenCV 进行棋盘检测与透视变换
1. 引言
在计算机视觉领域,棋盘检测与透视变换是一个常见的任务,广泛应用于 摄像机标定、文档扫描、增强现实(AR) 等场景。本篇文章将详细介绍如何使用 OpenCV 进行 棋盘检测,并通过 透视变换 将棋盘区域转换为一个标准的矩形图像。
我们将基于一段 Python 代码 进行分析,代码的主要任务包括:
- 读取图像并进行预处理(灰度转换、自适应直方图均衡化、去噪)
- 检测边缘并提取棋盘区域
- 计算透视变换矩阵并进行变换
- 展示和保存结果
2. 代码解析
完整代码如下:
import cv2
import numpy as npdef detect_and_transform_chessboard(image_path):# 读取图像img = cv2.imread(image_path)if img is None:print("无法读取图像文件")return# 保存原始图像尺寸original_img = img.copy()# 图像预处理scale_percent = 50width = int(img.shape[1] * scale_percent / 100)height = int(img.shape[0] * scale_percent / 100)img = cv2.resize(img, (width, height))gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)# 自适应直方图均衡化clahe = cv2.createCLAHE(clipLimit=2.0, tileGridSize=(8,8))gray = clahe.apply(gray)# 使用双边滤波减少噪声gray = cv2.bilateralFilter(gray, 11, 17, 17)found = Falseedges = cv2.Canny(gray, 50, 150)contours, _ = cv2.findContours(edges, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)if len(contours) > 0:contours = sorted(contours, key=cv2.contourArea, reverse=True)[:5]for contour in contours:epsilon = 0.02 * cv2.arcLength(contour, True)approx = cv2.approxPolyDP(contour, epsilon, True)if len(approx) == 4 and cv2.contourArea(approx) > 1000:cv2.drawContours(img, [approx], -1, (0, 0, 255), 2)corners_pts = approx.reshape(4, 2).astype(np.float32)corners_pts = order_points(corners_pts)found = Truebreakif found and corners_pts is not None:target_size = (400, 400)target_pts = np.array([[0, 0],[target_size[0], 0],[target_size[0], target_size[1]],[0, target_size[1]]], dtype=np.float32)matrix = cv2.getPerspectiveTransform(corners_pts, target_pts)warped = cv2.warpPerspective(img, matrix, target_size)cv2.namedWindow('yuantu', cv2.WINDOW_NORMAL)cv2.imshow('yuantu', img)cv2.namedWindow('zhentu', cv2.WINDOW_NORMAL)cv2.imshow('zhentu', warped)cv2.imwrite('detected_chessboard.png', img)cv2.imwrite('transformed_chessboard.png', warped)else:print("无法进行透视变换:未检测到有效的棋盘角点")cv2.waitKey(0)cv2.destroyAllWindows()def order_points(pts):rect = np.zeros((4, 2), dtype=np.float32)s = pts.sum(axis=1)rect[0] = pts[np.argmin(s)] # 左上rect[2] = pts[np.argmax(s)] # 右下diff = np.diff(pts, axis=1)rect[1] = pts[np.argmin(diff)] # 右上rect[3] = pts[np.argmax(diff)] # 左下return rectif __name__ == "__main__":image_path = "1.jpg"detect_and_transform_chessboard(image_path)
原图

代码运行结果图


7. 进一步优化与拓展
7.1 多尺度图像处理
在实际应用中,棋盘大小可能存在变形和比例不一致的情况。可以使用图像金字塔(Image Pyramid)来对不同尺度的图像进行分析,提高算法的适应性。
7.2 使用深度学习改进检测
传统的边缘检测和轮廓提取方法对于复杂背景或光照变化较大的情况可能表现不佳。可以尝试使用**深度学习模型(如YOLO或OpenCV DNN模块)**来替代传统的边缘检测方法。
7.3 自动化角点提取优化
目前的角点提取方法依赖 cv2.approxPolyDP(),可以引入更精确的 Harris 角点检测 或 Shi-Tomasi 角点检测,提高精度。
7.4 进一步增强抗噪性
可以引入 cv2.GaussianBlur() 或 cv2.medianBlur() 进一步去除噪声,以便更清晰地检测边缘。
8. 结论
本篇文章介绍了基于 OpenCV 进行棋盘检测与透视变换的方法,详细分析了 图像预处理、边缘检测、透视变换 关键技术,并提供了优化建议。希望对你有所帮助!在实际应用中,可以结合深度学习和图像处理优化,提高检测的精度和鲁棒性。
相关文章:
利用 OpenCV 进行棋盘检测与透视变换
利用 OpenCV 进行棋盘检测与透视变换 1. 引言 在计算机视觉领域,棋盘检测与透视变换是一个常见的任务,广泛应用于 摄像机标定、文档扫描、增强现实(AR) 等场景。本篇文章将详细介绍如何使用 OpenCV 进行 棋盘检测,并…...
DeepMind发布Matryoshka(套娃)量化:利用嵌套表示实现多精度LLM的低比特深度学习
本文将介绍 Google DeepMind 提出的 Matryoshka 量化技术,该技术通过从单个大型语言模型 (LLM) 实现多精度模型部署,从而革新深度学习。我们将深入研究这项创新技术如何提高 LLM 的效率和准确性。 随着深度学习模型在规模和复杂度上持续增长,…...
DeepSeek01-本地部署大模型
一、ollama简介: 什么是 Ollama? Ollama 是一个用于本地部署和管理大模型的工具。它提供了一个简单的命令行界面, 使得用户可以轻松地下载、运行和管理各种大模型。Ollama 支持多种模型格式, 并且可以与现有的深度学习框架&#x…...
Java-数据结构-(HashMap HashSet)
一、Tree和Hash的区别 在上一篇文章中,我们讲到了"TreeMap"和"TreeSet",但当我们刷题的时候却会发现,实际应用Map和Set时,却常常都只会用"HashMap"和"HashSet",这是为什么呢…...
举个栗子:浅显易懂的理解Transformer 模型
用一个简单的比喻来解释 Transformer 模型,让你轻松理解它的工作原理。 Transformer 的比喻:一个高效的翻译团队 想象一下,Transformer 模型就像一个高效的翻译团队,它的任务是把一段英文翻译成中文。这个团队由两部分组成&#…...
el-table 结合 slot 具名插槽遍历封装列表模板
基础效果 要实现以上效果,可对 el-table 进行封装,将列配置视为数组,循环 el-table-column 标签模板组件 <div class"tableSlot"><el-table :data"dataList" border><el-table-columnv-for"(item, …...
游戏引擎学习第108天
仓库:https://gitee.com/mrxiao_com/2d_game_2 看一下我们现在的进展 今天的工作重点是处理游戏中的Z轴问题,特别是如何在不同的层级之间进行移动,并确保Z轴的处理方式与真实世界中的透视效果一致。当前,游戏中的Z轴运动存在问题࿰…...
遵循规则:利用大语言模型进行视频异常检测的推理
文章目录 速览摘要01 引言02 相关工作视频异常检测大语言模型 03 归纳3.1 视觉感知3.2 规则生成Normal and Anomaly (正常与异常)Abstract and Concrete (抽象与具体)Human and Environment (人类与环境) 3…...
网页制作01-html,css,javascript初认识のhtml的基本标记
一、 Html简介 英文全称是 hyper text markup language,超文本标记语言,是全球广域网上描述网页内容和外观的标准. Html作为一款标记语言,本身不能显示在浏览器中.标记语言经过浏览器的解释和编译,才能正确地反映html标记语言的内容. 1.html 的基本标记 1)头部标…...
vue 判断字符串开头是http或者https
在 Vue 中判断字符串是否以 http 或 https 开头,可以通过以下步骤实现: 方法一:使用 startsWith() 方法 // 在 Vue 组件的方法或计算属性中 isExternalLink(url) {return url?.startsWith(http://) || url?.startsWith(https://); }方法二…...
linux常用命令大全(包括抓包、网络检测、路由等,做项目一点点总结而来!)
文章目录 常用命令**apt相关****ls**:**cd****cp****ls -l | grep ssh**:会列出当前目录中包含 “ssh” 的文件或目录的详细信息。**系统资源**linux路由相关抓包工具和命令tcpdumpwiresharktshark iperf 常用命令 通过上下方向键 ↑ ↓ 来调取过往执行过…...
HarmonyOS组件之Tabs
Tabs 1.1概念 Tabs 视图切换容器,通过相适应的页签进行视图页面的切换的容器组件每一个页签对应一个内容视图Tabs拥有一种唯一的子集元素TabContent 1.2子组件 不支持自定义组件为子组件,仅可包含子组件TabContent,以及渲染控制类型 if/e…...
Linux学习笔记之虚拟地址空间
1.示例引入 运行如下代码那么运行结果如下图。 #include<stdio.h> #include<unistd.h>int main() {pid_t id fork();if(id-1){printf("创建进程错误!\n");return 1;}int size0;if(id0){//子进程while(1){printf("我是子进程,…...
前端高级面试题
以下是一些前端高级面试可能涉及到的内容: 一、前端工程化 如何构建一个适合大型团队的前端代码规范和构建流程? 答案: 代码规范方面: 使用ESLint结合Prettier来统一JavaScript和CSS(包括预处理器如Sass或Less)的语法风格。例如,规定变量命名采用驼峰命名法,函数名要有…...
MySQL判空函数--IFNULL函数的使用
文章目录 IFNULL函数介绍IFNULL函数的语法举例相关扩展 IFNULL函数介绍 在MySQL中,IFNULL函数用于判断给定的表达式是否为NULL。如果表达式为NULL,则IFNULL函数返回指定的替代值;如果表达式不为NULL,则返回表达式本身的值。 IFN…...
HTTP的“对话”逻辑:请求与响应如何构建数据桥梁?
一、前言 作为现代互联网通信的基石,HTTP协议定义了客户端与服务器之间的“对话规则”。每一次网页加载、API调用或文件传输的背后,都离不开精心构造的HTTP请求与响应。请求中封装了用户的意图——从请求方法、资源路径到提交的数据;响应则承…...
二〇二四年终总结
写在前面 简单总结一下告诉自己,曾经活着 不必太纠结于当下,也不必太忧虑未来,当你经历过一些事情的时候,眼前的风景已经和从前不一样了。——村上春树 原本应该 24 年年中的时候写 23 年年终的总结,但是一直拖着&…...
[论文阅读] SeeSR: Towards Semantics-Aware Real-World Image Super-Resolution
文章目录 一、前言二、主要贡献三、Introduction四、Methodology4.1 Motivation :4.2Framework Overview.** 一、前言 通信作者是香港理工大学 & OPPO研究所的张磊教授,也是图像超分ISR的一个大牛了。 论文如下 SeeSR: Towards Semantics-Aware Rea…...
全面了解HTTP(一)
全面了解HTTP(二)-CSDN博客 web及网络基础 使用HTTP协议访问web: HTTP: 网络基础TCP/IP 与HTTP关系密切的协议:IP,TCP,DNS 负责域名解析的DNS服务 各种协议与HTTP协议的关系 URI和URL 简单的HTTP协议 HTTP协议用于客户端和服…...
LM Studio笔记
一、什么是 LM Studio? LM Studio 是一款功能强大、易于使用的桌面应用程序,用于在本地机器上实验和评估大型语言模型(LLMs)。它允许用户轻松地比较不同的模型,并支持使用 NVIDIA/AMD GPU 加速计算。 功能集࿱…...
SoftwareCluster中如何配置VendorSignature
How to create VendorSignature...
Linux CentOS 7部署Vulhub靶场
漏洞复现环境: 1、Linux操作系统中通过Docker部署的Vulhub靶场: docker docker-compose 2、Nmap扫描工具 一、部署靶场 1、安装Docker 1、下载docker yum install docker 安装完成,如下图: 2、开启docker服务 [rootlocalhost…...
Golang GORM系列:GORM分页和排序
高效的数据检索和表示是应用程序开发的关键方面。GORM是健壮的Go对象关系映射库,它为开发人员提供了强大的工具来实现这一点。无论你是在构建动态web应用程序还是数据密集型服务,掌握GORM中的分页和排序使您能够提供无缝且高效的用户体验。本文我们将深入…...
【怎么使用Redis实现一个延时队列?】
怎么使用Redis实现一个延时队列? 详细说明Java代码示例解释注意事项使用Redis实现延时队列通常通过有序集合(Sorted Set)来实现,利用Redis的ZSET类型及其相关命令可以很方便地实现这一功能。 有序集合中的每个元素都有一个分数(score),我们可以利用这个分数来存储消息需…...
HarmonyNext上传用户相册图片到服务器
图片选择就不用说了,直接用 无须申请权限 。 上传图片,步骤和android对比稍微有点复杂,可能是为了安全性考虑,需要将图片先拷贝到缓存目录下面,然后再上传,当然你也可以转成Base64,然后和服务…...
宝塔docker 安装oracle11G
1、拉取镜像 sudo docker pull iatebes/oracle_11g #iatebes为用户名2、查看镜像 sudo docker images3、创建并运行容器 docker run -d --privileged --name oralce11g -p 1521:1521 iatebes/oracle_11g4、登录到容器 5、进入容器并修改system用户密码 docker exec -it orac…...
计算机视觉-OpenCV图像处理
1.Matplotlib数据可视化(绘制图像直方图、可视化矩阵) # Matplotlib 数据可视化(绘制图像直方图、可视化矩阵) # 本节主要讲解如何使用 Matplotlib 绘制图像直方图和可视化矩阵。 # 1. 绘制图像直方图 # 2. 可视化矩阵# 1. 绘制图…...
【论文笔记】Transformer^2: 自适应大型语言模型
Code repo: https://github.com/SakanaAI/self-adaptive-llms 摘要 自适应大型语言模型(LLMs)旨在解决传统微调方法的挑战,这些方法通常计算密集且难以处理多样化的任务。本文介绍了Transformer(Transformer-Squared)…...
【医学影像AI】50个眼科影像数据集(1)分类任务
【医学影像】50个眼科影像数据集(1)分类任务 【医学影像】50个眼科影像数据集(2)分割任务 【医学影像】50个眼科影像数据集(3)其它任务 【医学影像AI】50 个眼科影像数据集(1)分类任…...
2025年-G4--lc75--Best Time to Buy and Sell Stock(java版)
1.题目描述 2.思路 思路1: 3.java代码实现 class Solution {public int maxProfit(int[] prices) {// //初始化最小价格为最大值,最大利润为0// int minPriceInteger.MAX_VALUE;// int maxProfit0;// //遍历价格数组// for (int price : prices)// …...
