CV2.findChessboardCorners的详细讲解

一、概述

cv2.findChessboardCorners()函数是OpenCV中的一个函数,用于找到棋盘格的所有内角点,返回所有检测到的内角点的2D坐标。通常用于摄像机校准和3D重建。

二、使用方法

1.函数定义

cv2.findChessboardCorners(image, patternSize[, corners[, flags]])
  • image:输入的单通道8位或32位浮点数图像。
  • patternSize:内角点的规模(x方向内角点数,y方向内角点数)。
  • corners:如果opencv能够找到内角点,则返回内角点坐标数组。
  • flags:用于指示应用哪些变换。通常使用DEFAULTS,这意味着使用适当的变换来提高查找结果的抗噪性。

2.示例代码

import cv2
import numpy as np

img = cv2.imread('chessboard.png')
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)

# 确定棋盘格内部角点的数量
patternSize = (9,6)

# 在图像中寻找棋盘格角点
ret, corners = cv2.findChessboardCorners(gray, patternSize)

# 如果找到了角点则绘制它们
if ret == True:
    corners2 = cv2.cornerSubPix(gray,corners,(11,11),(-1,-1),(cv2.TERM_CRITERIA_EPS+cv2.TERM_CRITERIA_MAX_ITER,30,0.001))
    img = cv2.drawChessboardCorners(img, patternSize, corners2,ret)
    cv2.imshow('img',img)
    cv2.waitKey(0)

cv2.destroyAllWindows()

三、函数详解

1.获取棋盘格

在使用cv2.findChessboardCorners()函数之前,需要先获取输入图像中的棋盘格标准图像。具体步骤如下:

import cv2
import numpy as np

img = cv2.imread('chessboard.png')
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
patternSize=(9,6)

# 使用findChessboardCorners()函数来找到内部角落
ret, corners = cv2.findChessboardCorners(gray, patternSize)

if ret == True:
    corners2 = cv2.cornerSubPix(gray,corners,(11,11),(-1,-1),(cv2.TERM_CRITERIA_EPS+cv2.TERM_CRITERIA_MAX_ITER,30,0.001))
    img = cv2.drawChessboardCorners(img, patternSize, corners2,ret)
    cv2.imshow('img',img)
    cv2.waitKey(0)

cv2.destroyAllWindows()

上述代码使用cv2.findChessboardCorners()函数查找棋盘格的内角点,并将其绘制在输入图像上。注意:在绘制之前,使用cv2.cornerSubPix()函数对内角点进行了修正,以提高精度。

2.寻找内角点

cv2.findChessboardCorners()函数的第一个参数是输入图像,第二个参数是棋盘格内部角点的数量。返回值是一个布尔值和一个坐标数组。

如果cv2.findChessboardCorners()能够找到所有的内部角点,则返回的布尔值为True,角点坐标存储在corners数组中。否则返回False。

例如,在我们的示例中,棋盘格有9个内角点是横向的,6个内角点是纵向的。

# 确定棋盘格内部角点的数量
patternSize = (9,6)

# 在图像中寻找棋盘格角点
ret, corners = cv2.findChessboardCorners(gray, patternSize)

3.细化检测结果

为了提高检测结果的精度,通常需要对cv2.findChessboardCorners()返回的角点坐标进行细化。可以使用cv2.cornerSubPix()函数进行修正,修正后的坐标存储在corners2数组中。以下是代码示例:

corners2 = cv2.cornerSubPix(gray,corners,(11,11),(-1,-1),(cv2.TERM_CRITERIA_EPS+cv2.TERM_CRITERIA_MAX_ITER,30,0.001))

其中,cv2.cornerSubPix()函数包含以下参数:

  • image:输入图像
  • corners:输入的角点
  • windownSize:搜索窗口大小
  • zeroZone:死区;在窗口中心和窗口边缘之间,要排除的区域。
  • criteria:找到每个角点的最大迭代次数和迭代停止条件的精度。这是一个元组,具有以下格式:(type, max_iter, epsilon),其中type是终止的类型(cv2.TERM_CRITERIA_EPS或cv2.TERM_CRITERIA_MAX_ITER)。

4.绘制棋盘格内角点

一旦所有内角点被找到并细化了,便可以使用cv2.drawChessboardCorners()函数将它们绘制在输入图像上。

img = cv2.drawChessboardCorners(img, patternSize, corners2,ret)
cv2.imshow('img',img)
cv2.waitKey(0)

四、注意事项

使用cv2.findChessboardCorners()函数时,请注意以下几点:

  • 人工制作的棋盘格必须保持完美的水平/垂直状态。
  • 找到的角点必须按照预期的方式排序
  • 如果内部角点不能被精确地识别,那么结果将不准确

五、总结

本文对OpenCV中的cv2.findChessboardCorners()函数进行了详细解释。这是一个有效的函数,可用于校准相机、在线重建等应用。只要按照正确的步骤进行操作,你就可以轻松地找到棋盘格中的内角点。

原创文章,作者:IGVW,如若转载,请注明出处:https://www.506064.com/n/145153.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
IGVWIGVW
上一篇 2024-10-26 11:55
下一篇 2024-10-26 11:55

相关推荐

  • index.html怎么打开 – 详细解析

    一、index.html怎么打开看 1、如果你已经拥有了index.html文件,那么你可以直接使用任何一个现代浏览器打开index.html文件,比如Google Chrome、…

    编程 2025-04-25
  • Resetful API的详细阐述

    一、Resetful API简介 Resetful(REpresentational State Transfer)是一种基于HTTP协议的Web API设计风格,它是一种轻量级的…

    编程 2025-04-25
  • neo4j菜鸟教程详细阐述

    一、neo4j介绍 neo4j是一种图形数据库,以实现高效的图操作为设计目标。neo4j使用图形模型来存储数据,数据的表述方式类似于实际世界中的网络。neo4j具有高效的读和写操作…

    编程 2025-04-25
  • AXI DMA的详细阐述

    一、AXI DMA概述 AXI DMA是指Advanced eXtensible Interface Direct Memory Access,是Xilinx公司提供的基于AMBA…

    编程 2025-04-25
  • 关键路径的详细阐述

    关键路径是项目管理中非常重要的一个概念,它通常指的是项目中最长的一条路径,它决定了整个项目的完成时间。在这篇文章中,我们将从多个方面对关键路径做详细的阐述。 一、概念 关键路径是指…

    编程 2025-04-25
  • c++ explicit的详细阐述

    一、explicit的作用 在C++中,explicit关键字可以在构造函数声明前加上,防止编译器进行自动类型转换,强制要求调用者必须强制类型转换才能调用该函数,避免了将一个参数类…

    编程 2025-04-25
  • HTMLButton属性及其详细阐述

    一、button属性介绍 button属性是HTML5新增的属性,表示指定文本框拥有可供点击的按钮。该属性包括以下几个取值: 按钮文本 提交 重置 其中,type属性表示按钮类型,…

    编程 2025-04-25
  • Vim使用教程详细指南

    一、Vim使用教程 Vim是一个高度可定制的文本编辑器,可以在Linux,Mac和Windows等不同的平台上运行。它具有快速移动,复制,粘贴,查找和替换等强大功能,尤其在面对大型…

    编程 2025-04-25
  • crontab测试的详细阐述

    一、crontab的概念 1、crontab是什么:crontab是linux操作系统中实现定时任务的程序,它能够定时执行与系统预设时间相符的指定任务。 2、crontab的使用场…

    编程 2025-04-25
  • forof遍历对象的详细阐述

    forof是一种ES6的语法糖,用于遍历可迭代对象。相较于传统的for循环和forEach方法,forof更加简洁、易读,并且可以遍历各种类型的数据。 一、基本语法 forof的基…

    编程 2025-04-25

发表回复

登录后才能评论