广告
返回顶部
首页 > 资讯 > 后端开发 > Python >OpenCV实现相机标定
  • 652
分享到

OpenCV实现相机标定

2024-04-02 19:04:59 652人浏览 独家记忆

Python 官方文档:入门教程 => 点击学习

摘要

本文实例为大家分享了OpenCV实现相机标定的具体代码,供大家参考,具体内容如下 一、相机与针孔相机模型 1.相机模型 现代科技加持下的相机已经成为制造精密设计巧妙的消费品,相机的光

本文实例为大家分享了OpenCV实现相机标定的具体代码,供大家参考,具体内容如下

一、相机与针孔相机模型

1.相机模型

现代科技加持下的相机已经成为制造精密设计巧妙的消费品,相机的光学结构也比诞生之初复杂了许多
典型单反相机光学结构:

在众多相机模型中,针孔相机又称投影相机模型是相对简单而常用的模型。简单的说,针孔相机模型就是把相机简化成单纯的小孔成像,可想而知,这种简化对于精度要求高的情况或者特殊镜头的相机是不适用的。
小孔成像原理:

2.引入透镜

单纯的小孔成像模型中没有考虑镜头,现实条件下,由一片或多片透镜组成的镜头才能让利用了小孔成像原理的相机成像清晰的同时保持画面亮度。所以我们需要向模型引入透镜。
透镜成像原理:

但是,新的问题也随之而来:虚焦、畸变
一般我们称之为径向畸变,即光线在院里透镜中的地方比靠近中心的地方更加弯曲。径向畸变又分为中短焦距、近距离的桶形畸变和长焦距、远距离会出现的枕形畸变。

二、相机参数

1.坐标系约定

我们约定三个坐标系

1、世界坐标系矩阵:X

2、摄像机坐标系:Xc,

3、图像(像素)坐标系:x

4、相机矩阵:P

2.像平面到像素平面的投影

将三维空间中一点,过该点取一平面与像素平面平行,该平面就是像平面。设该三位点P,齐次坐标为X。投影为图像点P’,平面坐标x。
针孔相机模型:

在针孔相机模型中,像素坐标和像坐标之间的关系:
λx = PX
其中,λ是三位点的逆深度。P为相机矩阵,可以分解为:
P = R[K|t]
R 是描述照相机方向的旋转矩阵,t 是描述照相机中心位置的三维平移向量,内标定矩阵K 描述照相机的投影性质。标定矩阵仅和照相机自身的情况有关,通常可以写成:

焦距f是像在平面到像素平面中心的距离。s是倾斜参数,α是纵横比例参数。
在像素数组在传感器上没有偏斜且像素是正方形的时候,可以设 s = 0,α = 1。标定矩阵可以简化为:

三、相机标定

实验图片如下:

代码如下:

import cv2
import numpy as np
import glob

# 找棋盘格角点
# 阈值
criteria = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 30, 0.001)
#棋盘格模板规格
w = 7   #内角点个数,内角点是和其他格子连着的点
h = 7

# 世界坐标系中的棋盘格点,例如(0,0,0), (1,0,0), (2,0,0) ....,(8,5,0),去掉Z坐标,记为二维矩阵
objp = np.zeros((w*h,3), np.float32)
objp[:,:2] = np.mgrid[0:w,0:h].T.reshape(-1,2)
# 储存棋盘格角点的世界坐标和图像坐标对
objpoints = [] # 在世界坐标系中的三维点
imgpoints = [] # 在图像平面的二维点

images = glob.glob('picture/*.jpg')
for fname in images:
    img = cv2.imread(fname)
    gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
    # 找到棋盘格角点
    # 棋盘图像(8位灰度或彩色图像)  棋盘尺寸  存放角点的位置
    ret, corners = cv2.findChessboardCorners(gray, (w,h),None)
    # 如果找到足够点对,将其存储起来
    if ret == True:
        # 角点精确检测
        # 输入图像 角点初始坐标 搜索窗口为2*winsize+1 死区 求角点的迭代终止条件
        cv2.cornerSubPix(gray,corners,(11,11),(-1,-1),criteria)
        objpoints.append(objp)
        imgpoints.append(corners)
        # 将角点在图像上显示
        cv2.drawChessboardCorners(img, (w,h), corners, ret)
        cv2.imshow('findCorners',img)
        cv2.waiTKEy(1000)
cv2.destroyAllwindows()
#标定、去畸变
# 输入:世界坐标系里的位置 像素坐标 图像的像素尺寸大小 3*3矩阵,相机内参数矩阵 畸变矩阵
# 输出:标定结果 相机的内参数矩阵 畸变系数 旋转矩阵 平移向量
ret, mtx, dist, rvecs, tvecs = cv2.calibrateCamera(objpoints, imgpoints, gray.shape[::-1], None, None)
# mtx:内参数矩阵
# dist:畸变系数
# rvecs:旋转向量 (外参数)
# tvecs :平移向量 (外参数)
print (("ret:"),ret)
print (("mtx:\n"),mtx)        # 内参数矩阵
print (("dist:\n"),dist)      # 畸变系数   distortion cofficients = (k_1,k_2,p_1,p_2,k_3)
print (("rvecs:\n"),rvecs)    # 旋转向量  # 外参数
print (("tvecs:\n"),tvecs)    # 平移向量  # 外参数
# 去畸变
img2 = cv2.imread('picture/6.jpg')
h,w = img2.shape[:2]
# 我们已经得到了相机内参和畸变系数,在将图像去畸变之前,
# 我们还可以使用cv.getOptimalNewCameraMatrix()优化内参数和畸变系数,
# 通过设定自由自由比例因子alpha。当alpha设为0的时候,
# 将会返回一个剪裁过的将去畸变后不想要的像素去掉的内参数和畸变系数;
# 当alpha设为1的时候,将会返回一个包含额外黑色像素点的内参数和畸变系数,并返回一个ROI用于将其剪裁掉
newcameramtx, roi=cv2.getOptimalNewCameraMatrix(mtx,dist,(w,h),0,(w,h)) # 自由比例参数

dst = cv2.undistort(img2, mtx, dist, None, newcameramtx)
# 根据前面ROI区域裁剪图片
x,y,w,h = roi
dst = dst[y:y+h, x:x+w]
cv2.imwrite('calibresult.jpg',dst)

# 反投影误差
# 通过反投影误差,我们可以来评估结果的好坏。越接近0,说明结果越理想。
# 通过之前计算的内参数矩阵、畸变系数、旋转矩阵和平移向量,使用cv2.projectPoints()计算三维点到二维图像的投影,
# 然后计算反投影得到的点与图像上检测到的点的误差,最后计算一个对于所有标定图像的平均误差,这个值就是反投影误差。
total_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)
    total_error += error
print (("total error: "), total_error/len(objpoints))

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持编程网。

--结束END--

本文标题: OpenCV实现相机标定

本文链接: https://www.lsjlt.com/news/119762.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • OpenCV实现相机标定
    本文实例为大家分享了OpenCV实现相机标定的具体代码,供大家参考,具体内容如下 一、相机与针孔相机模型 1.相机模型 现代科技加持下的相机已经成为制造精密设计巧妙的消费品,相机的光...
    99+
    2022-11-11
  • OpenCV实现相机标定板
    本文实例为大家分享了OpenCV实现相机标定板的具体代码,供大家参考,具体内容如下 1.代码实现 #include <opencv.hpp> #include "h...
    99+
    2022-11-12
  • OpenCV怎么实现相机标定板
    这篇文章主要介绍OpenCV怎么实现相机标定板,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!具体内容如下1.代码实现#include <opencv.hpp>#include &quo...
    99+
    2023-06-14
  • OpenCV实现相机标定示例详解
    目录环境准备相机标定棋盘格图片实时显示相机的画面在线标定实时显示相机画面,按键保存能检测到角点的棋盘格图片离线标定畸变矫正环境准备 vs2015+opencv4.10安装与配置 相机...
    99+
    2022-11-12
  • OpenCV相机标定的全过程记录
    目录一、OpenCV标定的几个常用函数findChessboardCorners()棋盘格角点检测cv::drawChessboardCorners()棋盘格角点的绘制find4Qu...
    99+
    2022-11-13
  • opencv摄像机标定的实现
    原图 矫正后 我新建了个jz的文件夹放相机矫正所需要拍摄的图片,如下:共12张   # coding:utf-8 import cv2 import nu...
    99+
    2022-11-13
  • Python OpenCV 单目相机标定、坐标转换相关代码(包括鱼眼相机)
    前言   本文不讲原理,只关注代码,有很多博客是讲原理的,但是代码最多到畸变矫正就结束了,实际上就是到 OpenCV 官方示例涉及的部分。   在官方示例中使用黑白棋盘格求解了相机的内外参和畸变系数,...
    99+
    2023-09-23
    python opencv 计算机视觉
  • opencv如何实现摄像机标定
    小编给大家分享一下opencv如何实现摄像机标定,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!原图矫正后我新建了个jz的文件夹放相机矫正所需要拍摄的图片,如下:共...
    99+
    2023-06-29
  • OpenCV实现相机校正
    本文实例为大家分享了OpenCV实现相机校正的具体代码,供大家参考,具体内容如下 1. 相机标定 根据张正友校正算法,利用棋盘格数据校正对车载相机进行校正,计算其内参矩阵,外参矩阵和...
    99+
    2022-11-12
  • OpenCV实现简易标定板
    本文实例为大家分享了OpenCV实现简易标定板的具体代码,供大家参考,具体内容如下 使用OpenCV生成标定板图片,然后找高精度打印机进行打印,贴在硬板上,就可以得到一个简易的标定板...
    99+
    2022-11-12
  • opencv锁定鼠标定位的实现
    目录控制鼠标鼠标事件:创建方法完整学习代码控制鼠标 opencv允许我们对窗口的鼠标动作做出响应: setMouseCallback(winname,callback,userdat...
    99+
    2023-02-16
    opencv锁定鼠标定位 opencv 鼠标定位
  • OpenCV实现相机校正的方法
    这篇文章主要介绍OpenCV实现相机校正的方法,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!具体内容如下1. 相机标定根据张正友校正算法,利用棋盘格数据校正对车载相机进行校正,计算其内参矩阵,外参矩阵和畸变系数。标定...
    99+
    2023-06-15
  • OpenCV实现简易标定板的方法
    这篇文章给大家分享的是有关OpenCV实现简易标定板的方法的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。本文实例为大家分享了OpenCV实现简易标定板的具体代码,供大家参考,具体内容如下使用OpenCV生成标定板...
    99+
    2023-06-14
  • python+opencv实现目标跟踪
    python-opencv3.0新增了一些比较有用的追踪器算法,这里根据官网示例写了一个追踪器类 程序只能运行在安装有opencv3.0以上版本和对应的contrib模块的python解释器   #encoding=utf-8 imp...
    99+
    2023-01-31
    目标 python opencv
  • Python+OpenCV实现寻找到圆点标定板的角点
    图像大小按原图计算 dis_mm是标定板上的实际距离,要根据真实情况计算。 示例代码 # coding:utf-8 import math import cv2 import nu...
    99+
    2022-11-13
    Python OpenCV寻找角点 Python 寻找角点 Python OpenCV 角点
  • python+opencv实现文字颜色识别与标定功能
            最近接了一个比较简单的图像处理的单子,花了一点时间随便写了一下:  数据集客户没有是自...
    99+
    2022-11-12
  • Android自定义相机实现定时拍照功能
    这篇博客为大家介绍Android自定义相机,并且实现倒计时拍照功能。 首先自定义拍照会用到SurfaceView控件显示照片的预览区域,以下是布局文件: activity_...
    99+
    2022-06-06
    相机 Android
  • opencv-python+yolov3实现目标检测
    目录目标检测概况目标检测是?目标检测算法?yolov3模型简介性能介绍架构介绍opencv-python实现why opencv?正文因为最近的任务有用到目标检测,所以昨天晚...
    99+
    2022-11-12
  • Android自定义View实现相机对焦框
    前言 在相机APP中,手动对焦时都会出现一个对焦框,告诉用户相机正在对焦。那么这种对焦框是怎么实现的呢?最近项目中有几个需求,实现手动对焦,自动对焦和对焦框。总体来说不是很复杂,在这...
    99+
    2022-11-13
  • uniapp自定义相机实现示例详解
    目录自定义相机起因利用livePusher实现使用效果图拓展实现多种自定义相机水印相机身份证相机人像相机自定义相机 起因 由于最近用uniapp调用原生相机容易出现闪退问题,找了很...
    99+
    2023-03-09
    uniapp自定义相机 uniapp 相机实现
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作