Opencv python 相机标定--查找棋盘格角点

Opencv python 相机标定–查找棋盘格角点

相机标定前提: 查找标定板角点
目前使用两种标定方法:
在这里插入图片描述
在这里插入图片描述

处理图片下载路径:
链接:https://pan.baidu.com/s/1spm-Qa6B4IWadtWbP-1h0A
提取码:5i3y

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

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

# 棋盘格参数
corners_vertical = 8    # 纵向角点个数;
corners_horizontal = 11  # 纵向角点个数;
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:
        # 显示角点
        cv2.drawChessboardCorners(img, pattern_size, corners, 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)

    # 2.循环读取标定图片
    for i in range(0, 14):
        file_path = ('./image/left%02d.jpg' % i)
        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(500)

    cv2.destroyAllWindows()


if __name__ == '__main__':
    main()

在这里插入图片描述

  • 4
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
相机标定是指确定相机的内部参数和外部参数的过程,以便在图像中进行准确的测量。下面是使用OpenCV Python进行相机标定的步骤: 1.拍摄棋盘图。首先需要打印一张棋盘图,并将其固定在一个平面上。然后使用相机从不同的角度和位置拍摄这张棋盘图,并将这些图像保存下来。 2.提取角点。使用OpenCV中的`findChessboardCorners()`函数来检测每个图像中的角点。如果检测到了足够数量的角点,则将其保存下来。 3.计算相机的内部参数。使用`calibrateCamera()`函数来计算相机的内部参数,包括相机的焦距、主点和畸变系数。 4.计算相机的外部参数。使用`calibrateCamera()`函数来计算相机的外部参数,包括相机的旋转和平移向量。 5.评估标定结果。使用`getOptimalNewCameraMatrix()`函数来计算新的相机矩阵,并使用`undistort()`函数来校正图像。最后,使用`reprojectionError()`函数来评估标定结果的准确性。 下面是一个示例代码,用于演示如何使用OpenCV Python进行相机标定: ```python import numpy as np import cv2 # 棋盘尺寸 CHESSBOARD_SIZE = (9, 6) # 准备棋盘格角点 objp = np.zeros((CHESSBOARD_SIZE[0] * CHESSBOARD_SIZE[1], 3), np.float32) objp[:, :2] = np.mgrid[0:CHESSBOARD_SIZE[0], 0:CHESSBOARD_SIZE[1]].T.reshape(-1, 2) # 存储棋盘格角点的世界坐标和图像坐标 objpoints = [] # 世界坐标 imgpoints = [] # 图像坐标 # 加载棋盘图像 images = ['image1.jpg', 'image2.jpg', 'image3.jpg'] for fname in images: img = cv2.imread(fname) gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 查找棋盘格角点 ret, corners = cv2.findChessboardCorners(gray, CHESSBOARD_SIZE, None) # 如果找到足够数量的角点,则将其保存下来 if ret == True: objpoints.append(objp) imgpoints.append(corners) # 在图像上绘制角点 cv2.drawChessboardCorners(img, CHESSBOARD_SIZE, corners, ret) cv2.imshow('img', img) cv2.waitKey(500) cv2.destroyAllWindows() # 标定相机 ret, mtx, dist, rvecs, tvecs = cv2.calibrateCamera(objpoints, imgpoints, gray.shape[::-1], None, None) # 评估标定结果 mean_error = 0 for i in range(len(objpoints)): imgpoints2, _ = cv2.projectPoints(objpoints[i], rvecs[i], tvecs[i], mtx, dist) error = cv2.norm(imgpoints[i], imgpoints2, cv2.NORM_L2) / len(imgpoints2) mean_error += error print("total error: ", mean_error / len(objpoints)) # 校正图像 img = cv2.imread('image1.jpg') h, w = img.shape[:2] newcameramtx, roi = cv2.getOptimalNewCameraMatrix(mtx, dist, (w, h), 1, (w, h)) dst = cv2.undistort(img, mtx, dist, None, newcameramtx) # 显示校正前后的图像 cv2.imshow('original', img) cv2.imshow('corrected', dst) cv2.waitKey(0) cv2.destroyAllWindows() ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

廷益--飞鸟

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值