当前位置: 首页 > news >正文

OpenCV 寻找棋盘格角点及绘制

目录

一、概念

二、代码

2.1实现步骤

2.2完整代码

三、实现效果


一、概念

        寻找棋盘格角点(Checkerboard Corners)是计算机视觉中相机标定(Camera Calibration)过程的重要步骤。

        OpenCV 提供了函数 cv2.findChessboardCorners 来检测棋盘格图像中的角点,该函数会从图像的左上角开始扫描,以一定的步长(步长由棋盘格的大小和图像分辨率决定)逐行或逐列地寻找具有棋盘格特征的区域。在找到棋盘格特征后,函数会进一步处理这些区域,确定精确的角点位置,并按照从左到右、从上到下的顺序排列这些角点。这些角点用于标定相机内参和畸变系数。

二、代码

2.1实现步骤

1.图像预处理:

  • 将图像转换为灰度图像,因为角点检测在灰度图像上更有效。
  • 如果图像有噪声,可以使用滤波器进行平滑处理。

2.角点检测:

  • 使用 Harris 角点检测或其他基于梯度的检测方法,找到图像中的所有角点。
  • 通过几何约束(如角点之间的固定间距)筛选出棋盘格的角点。

3.亚像素级精度优化:

  • 使用 cv2.cornerSubPix 对检测到的角点进行优化,提高角点位置的精度。

2.2完整代码

import cv2
import numpy as np
import glob# 定义棋盘格的大小(内角点的个数)
chessboard_size = (11, 8)  # 11x8的棋盘格# 图像文件路径
image_files = glob.glob('file_path/*.png')  # 替换为实际图像文件路径模式# 检测并绘制棋盘格角点
for image_file in image_files:# 读取图像image = cv2.imread(image_file)if image is None:print(f"Image at {image_file} not found or failed to read")continue# 将图像转换为灰度图像gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)# 寻找棋盘格的角点ret, corners = cv2.findChessboardCorners(gray_image, chessboard_size, None)# 如果找到角点,则绘制它们if ret:# 优化角点位置criteria = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 30, 0.001)corners2 = cv2.cornerSubPix(gray_image, corners, (11, 11), (-1, -1), criteria)# 绘制角点cv2.drawChessboardCorners(image, chessboard_size, corners2, ret)# 为每个角点添加数字标签for i, corner in enumerate(corners2):corner = tuple(map(int, corner.ravel()))  # 确保corner是一个包含两个整数值的元组cv2.putText(image, str(i+1), corner, cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 255, 0), 1, cv2.LINE_AA)# 显示结果cv2.imshow('Chessboard Corners', image)# 等待用户按下 ESC 键(ASCII 码 27)关闭窗口while True:if cv2.waitKey(100) == 27:  # 每 0.1 秒检查一次break# cv2.waitKey(500)  # 等待500毫秒,显示下一张图像else:print(f"Chessboard corners not found in image {image_file}")cv2.destroyAllWindows()

三、实现效果

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 构建GitLab代码私有仓库
  • Python数据分析案例51——基于K均值的客户聚类分析可视化
  • virtualbox的ubuntu默认ipv4地址为10.0.2.15的修改以及xshell和xftp的连接
  • (实测可用)(3)Git的使用——RT Thread Stdio添加的软件包,github与gitee冲突造成无法上传文件到gitee
  • 深层神经网络示例
  • centos环境启动/重启java服务脚本优化
  • 神经网络以及简单的神经网络模型实现
  • Matplotlib库学习之mpl_toolkits.mplot3d.Axes3D函数
  • javafx场景切换,网络编程踩坑
  • 力扣题解( 让字符串成为回文串的最少插入次数)
  • C++知识要点总结笔记
  • 关于Qt Creator 使用Qt Quick的Design模式设置
  • 【运维】docker批量删除临时镜像(两种方式)
  • Postman下载及使用说明
  • 人工智能算法工程师(中级)课程9-PyTorch神经网络之全连接神经网络实战与代码详解
  • 【MySQL经典案例分析】 Waiting for table metadata lock
  • 【跃迁之路】【477天】刻意练习系列236(2018.05.28)
  • Bootstrap JS插件Alert源码分析
  • Git 使用集
  • markdown编辑器简评
  • ng6--错误信息小结(持续更新)
  • unity如何实现一个固定宽度的orthagraphic相机
  • Vue ES6 Jade Scss Webpack Gulp
  • 对话 CTO〡听神策数据 CTO 曹犟描绘数据分析行业的无限可能
  • 好的网址,关于.net 4.0 ,vs 2010
  • 入手阿里云新服务器的部署NODE
  • 使用 Node.js 的 nodemailer 模块发送邮件(支持 QQ、163 等、支持附件)
  • 视频flv转mp4最快的几种方法(就是不用格式工厂)
  • 网页视频流m3u8/ts视频下载
  • 问题之ssh中Host key verification failed的解决
  • 项目管理碎碎念系列之一:干系人管理
  • 用Canvas画一棵二叉树
  • 06-01 点餐小程序前台界面搭建
  • 整理一些计算机基础知识!
  • ​2021半年盘点,不想你错过的重磅新书
  • ​Linux·i2c驱动架构​
  • ​一文看懂数据清洗:缺失值、异常值和重复值的处理
  • #if和#ifdef区别
  • (回溯) LeetCode 77. 组合
  • (十二)Flink Table API
  • (中等) HDU 4370 0 or 1,建模+Dijkstra。
  • (转)memcache、redis缓存
  • (转)Mysql的优化设置
  • (转)重识new
  • ***linux下安装xampp,XAMPP目录结构(阿里云安装xampp)
  • **python多态
  • .net 4.0发布后不能正常显示图片问题
  • .Net 基于MiniExcel的导入功能接口示例
  • .net 设置默认首页
  • .NET 中什么样的类是可使用 await 异步等待的?
  • .NET(C#、VB)APP开发——Smobiler平台控件介绍:Bluetooth组件
  • .net6 当连接用户的shell断掉后,dotnet会自动关闭,达不到长期运行的效果。.NET 进程守护
  • /dev/sda2 is mounted; will not make a filesystem here!
  • [145] 二叉树的后序遍历 js
  • [15] 使用Opencv_CUDA 模块实现基本计算机视觉程序