[OpenCV】相机标定之棋盘格角点检测与绘制

在OpenCV中,棋盘格角点检测与绘制是一个常见的任务,通常用于相机标定。
棋盘格自定义可参考: OpenCV: Create calibration pattern

摘自opencv官网

目录

  • 1. 棋盘格角点检测 findChessboardCorners()
  • 2. 棋盘格角点绘制 drawChessboardCorners()
  • 3. 代码示例
    • C++版本
    • python版本

1. 棋盘格角点检测 findChessboardCorners()

函数原型是

//C++使用时,包含头文件
#include <opencv2/calib3d.hpp>bool cv::findChessboardCorners	(InputArray image,
Size patternSize,
OutputArray corners,
int	flags = CALIB_CB_ADAPTIVE_THRESH+CALIB_CB_NORMALIZE_IMAGE)		
Python://opencv4.8.0
cv.findChessboardCorners(	image, patternSize[, corners[, flags]]	) ->	retval, corners

这里引用官方的文档内容–参数介绍
引用于opencv官方文档

参数成员
image 来源棋盘视图。它必须是8位灰度或彩色图像。
这里如果输入是彩色图像,最好先使用 cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) 转换为灰度图像。
patternSize 棋盘格的内部角点数量,格式为 (columns, rows)。必须是棋盘格内部的角点数量,而不是棋盘格的方块数量。例如,一个 10x7 的棋盘格方块,其内部角点数量是 9x6。
注意:这里的角点是指棋盘格内部的交叉点,而不是棋盘格的方块数量。
corners 检测到的角点的输出数组。
如果找到角点,corners 将是一个包含所有角点坐标的数组,形状为 (N, 1, 2),其中 N 是角点的数量。
flags 各种操作标志,可以为零或以下值的组合:
*CALIB_CB_ADAPTIVE_THRESH 使用自适应阈值将图像转换为黑白,而不是固定的阈值水平(根据平均图像亮度计算)。
*CALIB_CB_NORMALIZE_IMAGE 在应用固定或自适应阈值之前,用均衡器归一化图像灰度系数。
*CALIB_CB_FILTER_QUADS 使用附加标准(如轮廓面积、周长、类似正方形的形状)过滤掉在轮廓检索阶段提取的错误四边形。
*CALIB_CB_FAST_CHECK 在图像上运行快速检查,寻找棋盘角,如果没有找到,则快捷调用。当没有观察到棋盘时,这可以显著地加速退化条件下的调用。
返回值
ret
布尔值,表示是否成功找到棋盘格角点。如果找到角点,返回 True;否则返回 False。
corners
检测到的角点坐标,是一个形状为 (N, 1, 2) 的 NumPy 数组,其中 N 是角点的数量。每个角点的坐标是 (x, y),表示其在图像中的像素位置。

该函数试图确定输入图像是否是棋盘图案的视图,并定位棋盘的内部角。如果找到了所有的角,并按一定的顺序(逐行,每行从左到右)放置,则该函数返回一个非零值。否则,如果函数未能找到所有的角或对它们重新排序,它将返回0。例如,一个规则的棋盘有8×8个正方形和7×7个内角,即黑色正方形相互接触的点。检测到的坐标是近似的,为了更精确地确定它们的位置,该函数调用cornerSubPix。如果返回的坐标不够精确,也可以使用带有不同参数的cornerSubPix函数。

2. 棋盘格角点绘制 drawChessboardCorners()

函数原型是

//头文件包含
#include <opencv2/calib3d.hpp>void cv::drawChessboardCorners(InputOutputArray image,
Size patternSize,
InputArray corners,
bool patternWasFound )		
Python://opencv4.8.0
cv.drawChessboardCorners(image, patternSize, corners, patternWasFound)->image

参数介绍,引用于官方文档
引用于opencv官网

image ; 目标图像。它必须是8位彩色图像。
patternSize 棋盘行和列的内角数量(patternSize = cv::Size(points _ per _ row,points_per_column))。必须是棋盘格内部的角点数量,而不是棋盘格的方块数量。例如,一个 10x7 的棋盘格方块,其内部角点数量是 9x6。
corners: 检测到的角的数组,findChessboardCorners的输出。
patternWasFound: 这个参数表明是否找到了完整棋盘。此处应导入使用findChessboardCorners 函数时所获取到的返回值。
这个函数用于绘制单个棋盘角,如果没有找到棋盘,则显示为红色圆圈;如果找到了棋盘,则显示为用线条连接的彩色角。

3. 代码示例

以下是一个简单的步骤和代码示例,展示如何使用OpenCV检测棋盘格的角点并绘制它们。

C++版本

#include <opencv2/opencv.hpp>
#include <iostream>int main() {// 读取图像cv::Mat image = cv::imread("chessboard.png");if (image.empty()) {std::cerr << "无法加载图像!" << std::endl;return -1;}// 转换为灰度图像cv::Mat gray;cv::cvtColor(image, gray, cv::COLOR_BGR2GRAY);// 定义棋盘格的内部角点数量cv::Size patternSize(9, 6); // 例如,9x6 的棋盘格// 存储角点的容器std::vector<cv::Point2f> corners;// 查找棋盘格角点bool found = cv::findChessboardCorners(gray, patternSize, corners);if (found) {std::cout << "找到 " << corners.size() << " 个角点" << std::endl;// 优化角点位置cv::TermCriteria criteria(cv::TermCriteria::EPS + cv::TermCriteria::MAX_ITER, 30, 0.001);cv::cornerSubPix(gray, corners, cv::Size(11, 11), cv::Size(-1, -1), criteria);// 绘制角点cv::drawChessboardCorners(image, patternSize, cv::Mat(corners), found);// 显示结果cv::imshow("Chessboard Corners", image);cv::waitKey(0);} else {std::cout << "未找到棋盘格角点" << std::endl;}cv::destroyAllWindows();return 0;
}

代码说明
1. 图像读取与灰度转换
使用 cv::imread 读取图像,并检查是否成功加载。
使用 cv::cvtColor 将彩色图像转换为灰度图像。
2. 定义棋盘格尺寸
使用 cv::Size 定义棋盘格的内部角点数量(例如 9x6)。
3. 查找角点
使用 cv::findChessboardCorners 查找棋盘格角点。如果找到角点,返回 true,并将角点坐标存储在 corners 中。
4. 优化角点位置
使用 cv::cornerSubPix 对角点位置进行亚像素优化,以提高精度。
5. 绘制角点
使用 cv::drawChessboardCorners 在图像上绘制检测到的角点。
6. 显示结果
使用 cv::imshow 显示带有角点的图像,并等待用户按键退出。

python版本

步骤

  1. 导入必要的库:导入OpenCV和NumPy库。
  2. 读取图像:读取包含棋盘格的图像。
  3. 查找角点:使用cv2.findChessboardCorners函数查找棋盘格的角点。
  4. 优化角点位置:使用cv2.cornerSubPix函数优化角点位置。
  5. 绘制角点:使用cv2.drawChessboardCorners函数绘制检测到的角点。
  6. 显示结果:显示带有角点的图像。

代码示例

import cv2
import numpy as np# 读取图像
image = cv2.imread('chessboard.png')
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)# 定义棋盘格的尺寸(内部角点的数量)
pattern_size = (9, 6)  # 例如,9x6的棋盘格# 查找棋盘格角点
ret, corners = cv2.findChessboardCorners(gray, pattern_size, None)if ret:print(f"找到 {len(corners)} 个角点")# 优化角点位置criteria = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 30, 0.001)corners = cv2.cornerSubPix(gray, corners, (11, 11), (-1, -1), criteria)# 绘制角点cv2.drawChessboardCorners(image, pattern_size, corners, ret)# 显示结果cv2.imshow('Chessboard Corners', image)cv2.waitKey(0)cv2.destroyAllWindows()
else:print("未找到棋盘格角点")

代码说明

  1. cv2.findChessboardCorners:这个函数用于查找棋盘格的角点。它需要输入灰度图像、棋盘格的尺寸(内部角点的数量),以及一些可选参数。如果找到角点,返回True和角点的坐标。
  2. cv2.cornerSubPix:这个函数用于优化角点的位置,使其更加精确。
  3. cv2.drawChessboardCorners:这个函数用于在图像上绘制检测到的角点。

注意事项

  • 棋盘格的尺寸(内部角点的数量)需要根据实际的棋盘格进行调整。
  • 如果图像中没有找到棋盘格角点,ret将为False,此时需要检查图像和棋盘格尺寸是否正确。

运行结果
运行代码后,你将看到图像上绘制了检测到的棋盘格角点。这些角点可以用于进一步的相机标定或其他计算机视觉任务。

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

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

相关文章

redis的典型应用 --缓存

Redis最主要的用途&#xff0c;分为三个方面&#xff1a; 1.存储数据&#xff08;内存数据库&#xff09; 2.缓存&#xff08;最常用&#xff09; 3.消息队列 缓存 (cache) 是计算机中的⼀个经典的概念。核⼼思路就是把⼀些常⽤的数据放到触⼿可及(访问速度更快)的地⽅&…

本地基于Ollama部署的DeepSeek详细接口文档说明

前文&#xff0c;我们已经在本地基于Ollama部署好了DeepSeek大模型&#xff0c;并且已经告知过如何查看本地的API。为了避免网络安全问题&#xff0c;我们希望已经在本地调优的模型&#xff0c;能够嵌入到在本地的其他应用程序中&#xff0c;发挥本地DeepSeek的作用。因此需要知…

基于ArcGIS和ETOPO-2022 DEM数据分层绘制全球海陆分布

第〇部分 前言 一幅带有地理空间参考、且包含海陆分布的DEM图像在研究区的绘制中非常常见&#xff0c;本文将实现以下图像的绘制 关键步骤&#xff1a; &#xff08;1&#xff09;NOAA-NCEI官方下载最新的ETOPO-2022 DEM数据 &#xff08;2&#xff09;在ArcGIS&#xff08;…

自动化测试框架pytest+requests+allure

Pytest requests Allure 这个框架基于python的的 Pytest 进行测试执行&#xff0c;并结合 Allure插件 生成测试报告的测试框架。采用 关键字驱动 方式&#xff0c;使测试用例更加清晰、模块化&#xff0c;同时支持 YAML 文件来管理测试用例&#xff0c;方便维护和扩展。 测试…

Retrofit中scalars转换html为字符串

简介 在Retrofit中&#xff0c;如果你想直接获取HTML或其他文本格式的响应内容而不是将其映射到一个模型类&#xff0c;ScalarsConverterFactory 就派上用场了。ScalarsConverterFactory 是一个转换器工厂&#xff0c;它能够将响应体转换为Java基本类型如String、Integer或Byte…

Powershell WSL Windows系统复制数据到ubuntu子系统系统

从本地D盘下拷贝数据到ubuntu子系统下 Powershell 管理员打开执行 /mnt/d 此处是本地Windows系统的路径表示/opt ubutu 子系统目录 wsl -d Ubuntu-22.04 -u root -- bash -c cp -rf /mnt/d/nginx.conf /opt/从ubuntu子系统中拷贝数据到本地D盘下 Powershell 管理员打开执行…

【多线程】线程安全集合类,ConcurrentHashMap实现原理

文章目录 线程安全集合类解决方案多线程环境使用顺序表多线程环境使用队列多线程环境使用哈希表ConcurrentHashMap1. 缩小锁的粒度2. 充分使用 CAS3. 针对扩容操作 线程安全集合类 ArrayList、Queue、HsahMap… 都是线程不安全的 Vector、Stack、Hashtable 都是线程安全的&am…

spring-tx笔记

编程式事务与声明式事务的理解 补充&#xff1a;什么是事务&#xff1f; 事务是一个重要概念&#xff0c;尤其在数据库管理系统中。事务是指一组操作。&#xff0c;这些操作要么全部成功执行&#xff0c;要么全部不执行&#xff0c;确保数据的一致性和完整性 编程式事务 编…

Android第四次面试(Java基础篇)

一、Java 中的 DCL 单例模式 单例模式是设计模式中最常用的模式之一&#xff0c;其核心目标是确保一个类在程序中仅有一个实例&#xff0c;并提供全局访问点。在 Java 中&#xff0c;实现单例模式需要兼顾线程安全和性能优化。DCL&#xff08;Double-Checked Locking&#xff0…

Java-SpringBootWeb入门、Spring官方脚手架连接不上解决方法

一. Spring 官网&#xff1a;Spring | Home Spring发展到今天已经形成了一种开发生态圈&#xff0c;Spring提供了若干个子项目&#xff0c;每个项目用于完成特定的功能(Spring全家桶) Spring Boot可以帮助我们非常快速的构建应用程序、简化开发、提高效率 。 二. Spring Boot入…

1.7 无穷小的比较

1.定义 2.性质 3.无穷小的比较 3.1等价无穷小的性质 3.2 常见等价无穷小

StarRocks 升级注意事项

前段时间升级了生产环境的 StarRocks&#xff0c;从 3.3.3 升级到了 3.3.9&#xff0c;期间还是踩了不少坑所以在这里记录下。 因为我们的集群使用的是存算分离的版本&#xff0c;也是使用官方提供的 operator 部署在 kubernetes 里的&#xff0c;所以没法按照官方的流程进入虚…

深入探究 JVM 堆的垃圾回收机制(一)— 判活

垃圾回收分为两步&#xff1a;1&#xff09;判定对象是否存活。2&#xff09;将“消亡”的对象进行内存回收。 1 判定对象存活 可达性分析算法&#xff1a;通过一系列“GC Roots”对象作为起始节点集&#xff0c;从这些节点开始&#xff0c;根据引用关系向下搜索&#xff0c;…

国产开发板—米尔全志T113-i如何实现ARM+RISC-V+DSP协同计算?

近年来&#xff0c;随着半导体产业的快速发展和技术的不断迭代&#xff0c;物联网设备种类繁多&#xff08;如智能家居、工业传感器&#xff09;&#xff0c;对算力、功耗、实时性要求差异大&#xff0c;单一架构无法满足所有需求。因此米尔推出MYD-YT113i开发板&#xff08;基…

Tomcat虚拟主机配置详解:Centos环境下多域名部署(详细教程!)

&#x1f3e1;作者主页&#xff1a;点击&#xff01; Tomcat服务器&#x1f4dd;专栏&#xff1a;点击&#xff01; &#x1f427;Linux高级管理防护和群集专栏&#xff1a;点击&#xff01; ⏰️创作时间&#xff1a;2025年3月18日14点14分 最近在折腾 Tomcat 的时候&…

鸿蒙开发工程师简历项目撰写全攻略

一、项目结构的黄金法则 建议采用「41」结构&#xff1a; 项目背景&#xff08;业务价值&#xff09;技术架构&#xff08;鸿蒙特性&#xff09;核心实现&#xff08;技术难点&#xff09;个人贡献&#xff08;量化成果&#xff09;附加价值&#xff08;延伸影响&#xff09; …

dfs刷题排列问题 + 子集问题 + 组和问题总结

文章目录 一、排列问题全排列II题解代码 优美的排列题解代码 二、子集问题字母大小写全排列题解代码 找出所有子集的异或总和再求和题解代码 三、组合问题电话号码的字母组合题解代码 括号生成题解代码 组合题解代码 目标和题解代码 组合总和题解代码 总结 一、排列问题 全排列…

【Linux】VMware17 安装 Ubuntu24.04 虚拟机

目录 安装教程 一、下载 Ubuntu 桌面版iso映像 二、安装 VMware 三、安装 Ubuntu 桌面版 VMware 创建虚拟机 挂载 Ubuntu ISO 安装 Ubuntu 系统 安装教程 一、下载 Ubuntu 桌面版iso映像 链接来自 清华大学开源软件镜像站 ISO文件地址&#xff1a;ubuntu-24.04.2-des…

CVPR2025 | 对抗样本智能安全方向论文汇总 | 持续更新中~

汇总结果来源&#xff1a;CVPR 2025 Accepted Papers 若文中出现的 论文链接 和 GitHub链接 点不开&#xff0c;则说明还未公布&#xff0c;在公布后笔者会及时添加. 若笔者未及时添加&#xff0c;欢迎读者告知. 文章根据题目关键词搜索&#xff0c;可能会有遗漏. 若笔者出现…

PostgreSQL_数据回退,数据库导出、导入

目录 前置&#xff1a; 1 数据回退 1.1 代码 1.2 pgAdmin4 中查看 1&#xff09;t_daily 2) t_stock_daily 2 数据库导出、导入 前置&#xff1a; 本博文是一个系列。在本人“数据库专栏”-》“PostgreSQL_”开头的博文。 1 数据回退 上一节“PostgreSQL_数据下载并…