OpenCV实现相机校正

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

1. 相机标定

根据张正友校正算法,利用棋盘格数据校正对车载相机进行校正,计算其内参矩阵,外参矩阵和畸变系数。

标定的流程是:

  • 准备棋盘格数据,即用于标定的图片
  • 对每一张图片提取角点信息
  • 在棋盘上绘制提取到的角点(非必须,只是为了显示结果)
  • 利用提取的角点对相机进行标定
  • 获取相机的参数信息

2.关于相机校正用到的几个API:

1、寻找棋盘图中的棋盘角点

rect, corners = cv2.findChessboardCorners(image, pattern_size, flags)

参数:

  • Image: 输入的棋盘图,必须是8位的灰度或者彩色图像
  • Pattern_size:棋盘图中每行每列的角点个数(内角点)。
  • flags: 用来定义额外的滤波步骤以有助于寻找棋盘角点。所有的变量都可以单独或者以逻辑或的方式组合使用。取值主要有:

CV_CALIB_CB_ADAPTIVE_THRESH :使用自适应阈值(通过平均图像亮度计算得到)将图像转换为黑白图,而不是一个固定的阈值。

CV_CALIB_CB_NORMALIZE_IMAGE :在利用固定阈值或者自适应的阈值进行二值化之前,先使用cvNormalizeHist来均衡化图像亮度。

CV_CALIB_CB_FILTER_QUADS :使用其他的准则(如轮廓面积,周长,方形形状)来去除在轮廓检测阶段检测到的错误方块。

返回:

  • Corners:检测到的角点
  • rect: 输出是否找到角点,找到角点返回1,否则返回0

2、检测完角点之后可以将测到的角点绘制在图像上,使用的API是:

cv2.drawChessboardCorners(img, pattern_size, corners, rect)

参数:

  • Img: 预绘制检测角点的图像
  • pattern_size : 预绘制的角点的形状
  • corners: 角点矩阵
  • rect: 表示是否所有的棋盘角点被找到,可以设置为findChessboardCorners的返回值

注意:如果发现了所有的角点,那么角点将用不同颜色绘制(每行使用单独的颜色绘制),并且把角点以一定顺序用线连接起来。

3利用定标的结果计算内外参数

ret, mtx, dist, rvecs, tvecs = cv2.calibrateCamera(object_points, image_points, image_size, None, None)

参数:

  • Object_points:世界坐标系中的点,在使用棋盘的场合,令z的坐标值为0,而x,y坐标用里面来度量,选用英寸单位,那么所有参数计算的结果也是用英寸表示。最简单的方式是定义棋盘的每一个方块为一个单位。
  • image_points:在图像中寻找到的角点的坐标,包含object_points所提供的所有点
  • image_size: 图像的大小,以像素为衡量单位

返回:

  • ret: 返回值
  • mtx: 相机的内参矩阵,大小为3*3的矩阵
  • dist: 畸变系数,为5*1大小的矢量
  • rvecs: 旋转变量
  • tvecs: 平移变量

2.1 图像去畸变

上一步中得到相机的内参及畸变系数,利用其进行图像的去畸变,最直接的方法就是调用opencv中的函数得到去畸变的图像:

def img_undistort(img, mtx, dist):
    dst = cv2.undistort(img, mtx, dist, None, mtx)
    return dst

求畸变的API:

dst = cv2.undistort(img, mtx, dist, None, mtx)

参数:

  • Img: 要进行校正的图像
  • mtx: 相机的内参
  • dist: 相机的畸变系数

返回:

  • dst: 图像校正后的结果

3. 相机校正

import cv2
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.image as mpimg
import glob

def plot_contrast_imgs(origin_img, converted_img, origin_img_title="origin_img", converted_img_title="converted_img", converted_img_gray=False):
    """
    用于对比显示两幅图像
    """
    fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(15, 20))
    ax1.set_title(origin_img_title)
    ax1.imshow(origin_img)
    ax2.set_title(converted_img_title)
    if converted_img_gray==True:
        ax2.imshow(converted_img, cmap="gray")
    else:
        ax2.imshow(converted_img)
    plt.show()

# 1. 参数设定:定义棋盘横向和纵向的角点个数并指定校正图像的位置
nx = 9
ny = 6
file_paths = glob.glob("./camera_cal/calibration*.jpg")
# 2. 计算相机的内外参数及畸变系数
def cal_calibrate_params(file_paths):
    object_points = []  # 三维空间中的点:3D
    image_points = []   # 图像空间中的点:2d
    # 2.1 生成真实的交点坐标:类似(0,0,0), (1,0,0), (2,0,0) ....,(6,5,0)的三维点
    objp = np.zeros((nx * ny, 3), np.float32)
    objp[:, :2] = np.mgrid[0:nx, 0:ny].T.reshape(-1, 2)
    # 2.2 检测每幅图像角点坐标
    for file_path in file_paths:
        img = cv2.imread(file_path)
        # 将图像转换为灰度图
        gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
        # 自动检测棋盘格内4个棋盘格的角点(2白2黑的交点)
        rect, corners = cv2.findChessboardCorners(gray, (nx, ny), None)
        # 若检测到角点,则将其存储到object_points和image_points
        if rect == True:
            object_points.append(objp)
            image_points.append(corners)
    # 2.3 获取相机参数
    ret, mtx, dist, rvecs, tvecs = cv2.calibrateCamera(object_points, image_points, gray.shape[::-1], None, None)
    return ret, mtx, dist, rvecs, tvecs

def img_undistort(img, mtx, dist):
    """
    图像去畸变
    """
    return cv2.undistort(img, mtx, dist, None, mtx)

# 测试去畸变函数的效果
file_paths = glob.glob("./camera_cal/calibration*.jpg")
ret, mtx, dist, rvecs, tvecs = cal_calibrate_params(file_paths)
if mtx.any() != None:  # a.any() or a.all()
    img = mpimg.imread("./camera_cal/calibration1.jpg")
    undistort_img = img_undistort(img, mtx, dist)
    plot_contrast_imgs(img, undistort_img)
    print("done!")
else:
    print("failed")

执行代码:

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

(0)

相关推荐

  • Python opencv相机标定实现原理及步骤详解

    相机标定相机标定的目的 获取摄像机的内参和外参矩阵(同时也会得到每一幅标定图像的选择和平移矩阵),内参和外参系数可以对之后相机拍摄的图像就进行矫正,得到畸变相对很小的图像. 相机标定的输入 标定图像上所有内角点的图像坐标,标定板图像上所有内角点的空间三维坐标(一般情况下假定图像位于Z=0平面上). 相机标定的输出 摄像机的内参.外参系数. 拍摄的物体都处于三维世界坐标系中,而相机拍摄时镜头看到的是三维相机坐标系,成像时三维相机坐标系向二维图像坐标系转换.不同的镜头成像时的转换矩阵不同,同时可能引

  • OpenCV实现相机校正

    本文实例为大家分享了OpenCV实现相机校正的具体代码,供大家参考,具体内容如下 1. 相机标定 根据张正友校正算法,利用棋盘格数据校正对车载相机进行校正,计算其内参矩阵,外参矩阵和畸变系数. 标定的流程是: 准备棋盘格数据,即用于标定的图片 对每一张图片提取角点信息 在棋盘上绘制提取到的角点(非必须,只是为了显示结果) 利用提取的角点对相机进行标定 获取相机的参数信息 2.关于相机校正用到的几个API: 1.寻找棋盘图中的棋盘角点 rect, corners = cv2.findChessbo

  • OpenCV实现相机标定板

    本文实例为大家分享了OpenCV实现相机标定板的具体代码,供大家参考,具体内容如下 1.代码实现 #include <opencv.hpp> #include "highgui.h" #include "cxcore.h" using namespace cv; int main0(int argc, char *argv[]) { int width = 140;//width and heigth of single square int heigh

  • OpenCV实现相机标定示例详解

    目录 环境准备 相机标定 棋盘格图片 实时显示相机的画面 在线标定 实时显示相机画面,按键保存能检测到角点的 棋盘格图片 离线标定 畸变矫正 环境准备 vs2015+opencv4.10安装与配置 相机标定 棋盘格图片 可以自己生成,然后打印到A4纸上.(也可以去TB买一块,平价买亚克力板的,不反光买氧化铝材质,高精度买陶瓷的) /** * 生成棋盘格图片 **/ int generateCalibrationPicture() { //Mat frame = imread("3A4.bmp&q

  • OpenCV实现相机标定

    本文实例为大家分享了OpenCV实现相机标定的具体代码,供大家参考,具体内容如下 一.相机与针孔相机模型 1.相机模型 现代科技加持下的相机已经成为制造精密设计巧妙的消费品,相机的光学结构也比诞生之初复杂了许多典型单反相机光学结构: 在众多相机模型中,针孔相机又称投影相机模型是相对简单而常用的模型.简单的说,针孔相机模型就是把相机简化成单纯的小孔成像,可想而知,这种简化对于精度要求高的情况或者特殊镜头的相机是不适用的.小孔成像原理: 2.引入透镜 单纯的小孔成像模型中没有考虑镜头,现实条件下,由

  • 如何基于matlab相机标定导出xml文件

    1 参数选择 径向畸变3个参数还是两个参数 默认两个参数 如果是三个参数 2准备转化生成结果 二参数的转化代码 writeExternalandIntrinsicMatrix(cameraParams62,'cameraParams622.xml'); function writeExternalandIntrinsicMatrix(cameraParams,file) %writeXML(cameraParams,file) docNode = com.mathworks.xml.XMLUti

  • 基于Opencv制作的美颜相机带你领略美颜特效的效果

    目录 导语 正文 总结 导语 ​现在每一次出门,女友就喜欢拍照!BUT 嫌弃我给拍的照片角度不对,采光不好....... ​ 总之一大堆理由,啥时候让我拍照的水平能有美颜相机三分之一的效果就好!​ 果然都是锻炼出来的,至少现在我能看出来朋友圈哪些小姐姐批没批过照片.​ ​​ ​逃不掉​ ​逃不掉啊,为了摆脱这种局面-- 立马给女友写了一款简易版本的美颜相机给她偷偷的用!这样子就不担心被锤了.机智如我.jpg ​​ 正文 环境安装: dlib库的安装 本博客提供三种方法进行安装 T1方法:pip

  • 聊一聊OpenCV相机标定

    相机标定:简单的说,就是获得相机参数的过程.参数如:相机内参数矩阵,投影矩阵,旋转矩阵和平移矩阵等 什么叫相机参数? 简单的说,将现实世界中的人.物,拍成一张图像(二维).人或物在世界中的三维坐标,和图像上对应的二维坐标间的关系.表达两种不同维度坐标间的关系用啥表示?用相机参数. 相机的成像原理 先来看一下,相机的成像原理: 如图所示,这是一个相机模型.将物体简化看成一个点.来自物体的光,通过镜头,击中图像平面(图像传感器),以此成像.d0是物体到镜头的距离,di时镜头到图像平面的距离,f是镜头

  • OpenCV相机标定的全过程记录

    目录 一.OpenCV标定的几个常用函数 findChessboardCorners()棋盘格角点检测 cv::drawChessboardCorners()棋盘格角点的绘制 find4QuadCornerSubpix()对粗提取的角点进行精确化 cornerSubPix()亚像素检测 calibrateCamera()求解摄像机的内在参数和外在参数 initUndistortRectifyMap()计算畸变参数 二.绘制棋盘格,拍摄照片 三.相机标定 四.对图片进行校正 总结 一.OpenCV

  • 利用OPENCV为android开发畸变校正的JNI库方法

    需要为项目提供一套畸变校正的算法,由于需要大量的矩阵运算,考虑到效率和适时性,使用JNI开发,希望把有关数组短阵的处理的变换全部放入C语言中处理. 主要用于android移动端,大致的数据来源一是从camera直接读取YUV数据,一种是从第三方接读取RGB数据,另一种是直接对BITMAP进行处理. 1.考虑到硬件设备接口,第三方软件接口,图像接口,OPENCV接口,希望能够开发出通用的算法库,一劳永逸的解决各种复杂的使用场景,因此数据要支持YUV,支持ARGB,支持MAT 2android对BI

  • opencv利用霍夫变换检测直线进行图片校正

    利用霍夫变换检测直线,校正拍摄倾斜的图片 #include<opencv2\opencv.hpp> #include <iostream> using namespace cv; using namespace std; #define ERROR 1234 //度数转换 double DegreeTrans(double theta) { double res = theta / CV_PI * 180; return res; } //逆时针旋转图像degree角度(原尺寸)

随机推荐