opencv-python 实现角点检测和棋盘角点检测

作者:RayChiu_Labloy
版权声明:著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处


目录

利用goodFeaturesToTrack()角点检测:

利用findChessboardCorners()检测棋盘板内角点,cornerSubPix()亚像素精细化检测结果:

 goodFeaturesToTrack()和findChessboardCorners()区别:


利用goodFeaturesToTrack()角点检测:

函数的参数说明:

def goodFeaturesToTrack(image: Any【输入图像,是八位的或者32位浮点型,单通道图像,所以有时候用灰度图】,
                        maxCorners: Any【返回最大的角点数,是最有可能的角点数,如果这个参数不大于0,那么表示没有角点数的限制】,
                        qualityLevel: Any【图像角点的最小可接受参数,质量测量值乘以这个参数就是最小特征值,小于这个数的会被抛弃】,
                        minDistance: Any【返回的角点之间最小的欧式距离】,
                        corners: Any = None,
                        mask: Any = None【检测区域。如果图像不是空的(它需要具有CV_8UC1类型和与图像相同的大小),它指定检测角的区域】,
                        blockSize: Any = None【用于计算每个像素邻域上的导数协变矩阵的平均块的大小】,
                        useHarrisDetector: Any = None【选择是否采用Harris角点检测,默认是false. k: Harris检测的自由参数】,
                        k: Any = None) -> None

实验图片:

 实验结果:

测试代码: 

import cv2
import numpy as np
"""
角点检测 goodFeaturesToTrack()
"""
img = cv2.imread("E:/Users/raychiu/Desktop/825.bmp")
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

corners = cv2.goodFeaturesToTrack(gray, 150, 0.3, 50)
corners = np.int0(corners)

for corner in corners:
    x, y = corner.ravel()
    cv2.circle(img, (x, y), 5, (0, 0, 255), -1)

# 缩小图像
height, width = img.shape[:2]
size = (int(width * 0.4), int(height * 0.4))
img = cv2.resize(img, size, interpolation=cv2.INTER_AREA)

cv2.imshow("img", img)
cv2.waitKey(0)
cv2.destroyAllWindows()

利用findChessboardCorners()检测棋盘板内角点,cornerSubPix()亚像素精细化检测结果:

findChessboardCorners(image: Any,patternSize: Any,corners: Any = None,flags: Any = None) 三个参数:

image:输入原始的棋盘板图像。该图像必须是一张8位的灰度图或色彩图。
patternSize:(w,h),棋盘上每一排和每一列的内角数。w=棋盘板一行上黑白块的数量-1,h=棋盘板一列上黑白块的数量-1,例如:10x6的棋盘板,则(w,h)=(9,5)
corners:array,检测到的角点的输出数组。
flags:int,不同的操作标记,能够为0或者下述值的组合:

  •     CALIB_CB_ADAPTIVE_THRESH 使用自适应阈值法把图像转换为黑白图,而不是使用一个固定的阈值。
  •     CALIB_CB_NORMALIZE_IMAGE 在利用固定阈值或自适应阈值法二值化图像之前,利用直方图均衡化图像。
  •     CALIB_CB_FILTER_QUADS 使用额外的标准(如轮廓面积,周长,正方形形状)来过滤掉在轮廓检索阶段提取的假四边形。
  •     CALIB_CB_FAST_CHECK 对图像运行一个快速检查机制以查找棋盘板的角点,如果没有找到角点则返回一个快捷提醒。当没有观察到棋盘时,可以极大地加快在退化条件下的调用。

cornerSubPix(image: Any,corners: Any,winSize: Any,zeroZone: Any,criteria: Any)五个参数:

第一个参数 是输入图像,灰度左图
第二个参数是检测到的角点,即是输入也是输出。
第三个参数是计算亚像素角点时考虑的区域的大小,大小为NXN; N=(winSize*2+1)。
第四个参数作用类似于winSize,但是总是具有较小的范围,通常忽略(即Size(-1, -1))。
第五个参数用于表示计算亚像素时停止迭代的标准

测试图片:

测试结果:

 测试代码:

# -*- coding: utf-8 -*-
import cv2

# 查找棋盘格 角点
criteria = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 30, 0.1)

# 棋盘格参数
corners_vertical = 6    # 纵向角点个数;
corners_horizontal = 7  # 横向角点个数;
pattern_size = (corners_vertical, corners_horizontal)


def find_corners_sb(img):
    """
    查找棋盘格角点函数 SB升级款
    :param img: 处理原图
    """
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    # 查找棋盘格角点;
    ret, corners = cv2.findChessboardCornersSB(gray, pattern_size, cv2.CALIB_CB_EXHAUSTIVE + cv2.CALIB_CB_ACCURACY)
    if ret:
        # 精细查找角点
        corners2 = cv2.cornerSubPix(gray, corners, (11, 11), (-1, -1), criteria)
        # 显示角点
        cv2.drawChessboardCorners(img, pattern_size, corners2, ret)


def find_corners(img):
    """
    查找棋盘格角点函数
    :param img: 处理原图
    """
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

    # 查找棋盘格角点;
    ret, corners = cv2.findChessboardCorners(gray, pattern_size, cv2.CALIB_CB_ADAPTIVE_THRESH +
                                             cv2.CALIB_CB_FAST_CHECK +
                                             cv2.CALIB_CB_FILTER_QUADS)
    if ret:
        # 精细查找角点
        corners2 = cv2.cornerSubPix(gray, corners, (11, 11), (-1, -1), criteria)
        # 显示角点
        cv2.drawChessboardCorners(img, pattern_size, corners2, ret)


def main():
    # 1.创建显示窗口
    cv2.namedWindow("img", 0)
    cv2.resizeWindow("img", 1075, 900)

    file_path = ('./1.jpg')
    img_src = cv2.imread(file_path)

    if img_src is not None:
        # 执行查找角点算法
        find_corners_sb(img_src)
        # find_corners(img_src)

        # 显示图片
        cv2.imshow("img", img_src)
        cv2.waitKey(0)

    cv2.destroyAllWindows()


if __name__ == '__main__':
    main()

 goodFeaturesToTrack()和findChessboardCorners()区别:

 goodFeaturesToTrack()是针对全幅图像找角点的,findChessboardCorners()是专门检测棋盘板内角点的函数

【如果对您有帮助,交个朋友给个一键三连吧,您的肯定是我博客高质量维护的动力!!!】  

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值