基于python的相机标定(采用黑白棋盘格图片)

系列文章目录

[第一章 基于python的相机标定(采用黑白棋盘格图片)](https://blog.csdn.net/HWHXXX/article/details/119905200)


文章目录

  • 基于python的相机标定(采用黑白棋盘格图片)
  • 系列文章目录
  • 前言
  • 一、准备标定用的图片
  • 二、提取照片中棋盘格的角点
    • 1.载入需要用的库
    • 2.读取图片并提取角点
    • 3.标定相机

前言

工业相机在正常使用前需要进行相机标定,得出相机的内参矩阵与畸变系数。


一、准备标定用的图片

在标定之前,需要用待标定的相机拍摄用于标定相机的图片。
拍摄照片的质量一定程度上影响相机标定的效果,所以拍摄时一定要注意拍摄角度与环境光亮度。
1:在确定好标定板与相机之间的距离之后,对相机进行调焦,使得相机可以看清标定板。在调好焦之后就不能再次对相机进行调焦了。若再次调焦,则需重新进行相机标定。
2:环境光的补充,要使标定板尽量亮起来,如果太过灰暗,会影响拍摄照片的质量。
3:拍摄照片的角度,尽量让标定板出现在照片的每个区域(个人将图片区域划分为5个,如图1所示),然后在每个区域内标定板也可以垂直于相机拍摄,前倾,后倾,左倾,右倾等角度都可以拍摄,但需注意在每个区域内拍摄角度应保持均匀(不均匀的话个人认为会略微影响标定结果)。

图1 个人划分的5个区域
4:拍摄照片需尽量清晰,即拍摄过程中如果为手持标定板拍摄,拿稳了,别抖。
5:拍摄照片总数量,在保证每个拍摄角度拍摄数量均匀的情况下,总数量应该为5的倍数,可以是15,20,25张等等。总量多少没关系的。

二、提取照片中棋盘格的角点

1.载入需要用的库

import cv2 as cv
import numpy as np
import time
import os

2.读取图片并提取角点

    w = 12  # 棋盘格角点每行数量h = 9  # 棋盘格角点每列数量# 生成棋盘格三维坐标obj_points = np.zeros(((w*h), 3), np.float32)obj_points[:, :2] = np.mgrid[0:w, 0:h].T.reshape(-1, 2)  # 将纯0数组进行编码,编码代表每一个角点的位置信息,例如[0., 0., 0.],[1., 0., 0.]obj_points = np.reshape(obj_points, (w*h, 1, 3))  # 将位置信息矩阵变为w*h个1行三列的矩阵# 计算棋盘格内角点的三维坐标及其在图像中的二维坐标all_obj_points = [] # 这两个空数组很关键,如果是一张图片进行标定代码测试,这个也需要创建,如果没有,会一直报错all_points = []file_path = './0820-A3-resize'  # 存图片的文件夹,但是这个读取方式有一个缺点,文件夹内只能有图片,不能有别的类型的文件,否则会报错for file_name in os.listdir(file_path):img = cv.imread(file_path + '/' + file_name)img_gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY)  # 转为灰度图begin = time.time()ret, corners1 = cv.findChessboardCorners(img_gray, (w, h))  # 寻找内角点if ret == True:  # 如果寻找到足够数量的内焦点_, corners2 = cv.find4QuadCornerSubpix(img_gray, corners1, (5, 5))  # 细化内角点end = time.time()print((end-begin)/60)img_h, img_w = img.shape[:2]  # 获取图像尺寸all_obj_points.append(obj_points)  # 计算三维坐标all_points.append(corners2)  # 计算二维坐标else:end = time.time()print((end-begin)/60)img_h, img_w = img.shape[:2]

这段代码的主要功能就是读取所有图片并提取内角点。
函数都是opencv中写好的接口,主要用到的就是findChessboardCorners, find4QuadCornerSubpix
有兴趣可以网上查一下这两个函数,用起来都比较简单,源码原理的话,个人暂未进行深入研究。
主要输出参数为all_obj_points, all_points, img_w, img_h
第一个参数为内角点的世界坐标系中的坐标,第二个参数为内角点在图片中的坐标,第三参数为图像像素高度,第四个参数为图像像素宽度。

3.标定相机

    ret, camara_matrix, distcoeffs, rvecs, tvecs = cv.calibrateCamera(all_obj_points, all_points,(img_w, img_h), None, None)print("重投影参数:\n{}".format(ret))print("内参矩阵: \n{}".format(camara_matrix))print("畸变系数: \n{}".format(distcoeffs))print("旋转向量:\n{}".format(rvecs))print("平移向量:\n{}".format(tvecs))

标定相机的函数为calibrateCamera,五个输出参数上面代码所示。

基于python的opencv相机标定(采用黑白棋盘格标定板)相关推荐

  1. 基于Python的OpenCV+TensorFlow+Keras人脸识别实现

    前言:本节要讲的人脸识别主要是借鉴了 一位研究生前辈的文章 我只是在他的基础上进行了改动,让代码能在现在的TensorFlow2.X 等的环境下运行 先看一下效果图 完整工程及源代码请点击链接下载:人 ...

  2. ubuntu16.04安装python.h_ubuntu16.04 下基于 Python 的 OpenCV 的安装

    ubuntu16.04 下基于 Python 的 OpenCV 的安装 这几天一直在学习基于 Python 的 OpenCV , 开发环境是在 Ubuntu16.04 下, 学习的心得就是基于 Pyt ...

  3. 基于python和Opencv将多张图片结合为一张图片的办法

    基于python和Opencv将多张图片结合为一张图片的办法 需要用到的python包 代码本体 这两天写结课论文,需要做一个好看一点的图,要把多张图片结合为同一张图片,本来想用ps,但是懒,干脆用代 ...

  4. 基于Python通过OpenCV实现的口罩识别系统理论篇

    基于Python通过OpenCV实现的口罩识别系统理论设计篇 一.项目实现环境 基于Python 3.8.1版本 opencv-python 4.2.0.34版本 需要自己下载OpenCV的库文件,添 ...

  5. 基于Python与OpenCV的纸质票自动统计功能的实现(一)界面编程

    基于Python与OpenCV的纸质票自动统计功能的实现(一)--界面编程 作为一个资深的自动化工程师,界面编程对我来说太熟悉不过了,但是当时用的都是工业界面编程软件,比如WINCC.组态王等等,在这 ...

  6. 基于Python和OpenCV的面积计算

    基于Python和OpenCV的面积计算 import cv2 import numpy as npimage1 = cv2.imread("F:\\Python\\Image\\1.png ...

  7. cv2 python 获取斑马线_基于python的opencv图像处理实现对斑马线的检测示例

    基本思路 斑马线检测通过opencv图像处理来进行灰度值转换.高斯滤波去噪.阈值处理.腐蚀和膨胀后对图像进行轮廓检测,通过判断车辆和行人的位置,以及他们之间的距离信息,当车速到超过一定阈值时并且与行人 ...

  8. 树莓派安装基于python的opencv

    文章目录 前言 一.需要的设备 二.烧录系统 三.核对python版本是否为3.9.2,并打开摄像头功能 四.安装opencv 五.测试opencv 总结 前言 本文章需求python版本为3.9.2 ...

  9. 基于Python和OpenCV的目标跟踪学习教程 Object Tracking using Python and OpenCV

    实现12种不同的算法来跟踪视频和网络摄像头中的对象! 你会学到: 使用Python和OpenCV跟踪视频和网络摄像头中的对象 理解跟踪算法的基本直觉 实现12种跟踪算法 了解对象检测和对象跟踪之间的区 ...

最新文章

  1. mysql删除表中的唯一索引吗_Mysql 使用sql删除同表中重复数据并加唯一索引
  2. 判断1000素数的c语言程序,C语言求1~1000素数的简单程序
  3. bootstrap的栅格布局与两列布局结合使用
  4. [转载]对复旦食堂的印象
  5. 供应链 信用管理 大数据_以“大数据”引领农产品供应链变革,推动农产品供应链智能化发展...
  6. css flex 小记
  7. Oracle分页小谈
  8. spring mvc---controller返回值
  9. java从控制台读取字符串_从控制台读取Java字符串
  10. 4、【办公自动化】Python实现Word转PDF
  11. [Erlang 0125] Know a little Erlang opcode
  12. web前端面试题-1
  13. 10个较好在线商业理念
  14. 从行业共生到产业共生——2021 MWC上海展观察
  15. VUE项目中打印/转换图片打印
  16. 吴恩达机器学习15-异常检测
  17. SAP中常见的Debug技巧(02)-跳过代码执行
  18. Person owns Dog...
  19. The Source and Develop of RootKit
  20. 解决GitHub/GitLab官网访问慢的问题

热门文章

  1. Lost connection to MySQL server during query问题
  2. Windows系统合并磁盘分区
  3. flex布局避免父盒子被撑开,滚轮失效问题
  4. 基于PHP+MySQL托管中心管理系统的设计与实现#计算机毕设
  5. js判断浏览器是否打开了控制台
  6. 微信小程序网易云音乐播放界面
  7. node.js学习的资源整理
  8. vagrant启动失败解决
  9. mysql读取股票数据_读取股票数据存储到本地MySQL数据库(一)
  10. 2020年英语六级翻译