Python+OpenCV学习(17)---摄像机标定
Python+OpenCV学习(17)---摄像机标定
原文:http://blog.csdn.net/firemicrocosm/article/details/48594897
利用python学习OpenCV,个人感觉比较方便。函数的形式与C++基本相同,所以切换过来还是比较好的,对于像我这种对python不太熟练的人,使用python的集成开发环境PyCharm进行学习,可以设置断点调试,有助于我这类初学者理解掌握。
摄像机标定是机器人视觉进行目标定位跟踪的首要环节,通过标定板标定好摄像机的内外参数,然后进行后续的定位识别工作。本次介绍的摄像机标定的实验测试图像是OpenCV安装目录文件夹cpp\samples中的left0-left14.jpg图像。
下面是利用python语言结合OpenCV进行摄像机标定的代码:
- # -*- coding:utf-8 -*-
- __author__ = 'Microcosm'
- import cv2
- import numpy as np
- import glob
- # 设置寻找亚像素角点的参数,采用的停止准则是最大循环次数30和最大误差容限0.001
- criteria = (cv2.TERM_CRITERIA_MAX_ITER | cv2.TERM_CRITERIA_EPS, 30, 0.001)
- # 获取标定板角点的位置
- objp = np.zeros((6*7,3), np.float32)
- objp[:,:2] = np.mgrid[0:7,0:6].T.reshape(-1,2) # 将世界坐标系建在标定板上,所有点的Z坐标全部为0,所以只需要赋值x和y
- obj_points = [] # 存储3D点
- img_points = [] # 存储2D点
- images = glob.glob("E:\python\Python Project\opencv_showimage\images\calibrateImages\*.jpg")
- for fname in images:
- img = cv2.imread(fname)
- gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
- size = gray.shape[::-1]
- ret, corners = cv2.findChessboardCorners(gray, (7,6), None)
- if ret:
- obj_points.append(objp)
- corners2 = cv2.cornerSubPix(gray, corners, (5,5), (-1,-1), criteria) # 在原角点的基础上寻找亚像素角点
- if corners2:
- img_points.append(corners2)
- else:
- img_points.append(corners)
- cv2.drawChessboardCorners(img, (7,6), corners, ret) # 记住,OpenCV的绘制函数一般无返回值
- cv2.imshow('img', img)
- cv2.waitKey(50)
- print len(img_points)
- cv2.destroyAllWindows()
- # 标定
- ret, mtx, dist, rvecs, tvecs = cv2.calibrateCamera(obj_points, img_points,size, None, None)
- 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 # 平移向量 # 外参数
- print("-----------------------------------------------------")
- # 畸变校正
- img = cv2.imread(images[12])
- h, w = img.shape[:2]
- newcameramtx, roi = cv2.getOptimalNewCameraMatrix(mtx,dist,(w,h),1,(w,h))
- print newcameramtx
- print("------------------使用undistort函数-------------------")
- dst = cv2.undistort(img,mtx,dist,None,newcameramtx)
- x,y,w,h = roi
- dst1 = dst[y:y+h,x:x+w]
- cv2.imwrite('calibresult11.jpg', dst1)
- print "方法一:dst的大小为:", dst1.shape
- # undistort方法二
- print("-------------------使用重映射的方式-----------------------")
- mapx,mapy = cv2.initUndistortRectifyMap(mtx,dist,None,newcameramtx,(w,h),5) # 获取映射方程
- #dst = cv2.remap(img,mapx,mapy,cv2.INTER_LINEAR) # 重映射
- dst = cv2.remap(img,mapx,mapy,cv2.INTER_CUBIC) # 重映射后,图像变小了
- x,y,w,h = roi
- dst2 = dst[y:y+h,x:x+w]
- cv2.imwrite('calibresult11_2.jpg', dst2)
- print "方法二:dst的大小为:", dst2.shape # 图像比方法一的小
- print("-------------------计算反向投影误差-----------------------")
- tot_error = 0
- for i in xrange(len(obj_points)):
- img_points2, _ = cv2.projectPoints(obj_points[i],rvecs[i],tvecs[i],mtx,dist)
- error = cv2.norm(img_points[i],img_points2, cv2.NORM_L2)/len(img_points2)
- tot_error += error
- mean_error = tot_error/len(obj_points)
- print "total error: ", tot_error
- print "mean error: ", mean_error
下图是畸变校正前的图片:
通过标定获取摄像机内外参数以及畸变校正系数后对其进行校正:
方法一:
方法二:
Python+OpenCV学习(17)---摄像机标定相关推荐
- python做直方图-python OpenCV学习笔记实现二维直方图
本文介绍了python OpenCV学习笔记实现二维直方图,分享给大家,具体如下: 官方文档 – https://docs.opencv.org/3.4.0/dd/d0d/tutorial_py_2d ...
- python opencv 直方图均衡_详解python OpenCV学习笔记之直方图均衡化
本文介绍了python OpenCV学习笔记之直方图均衡化,分享给大家,具体如下: 官方文档 – https://docs.opencv.org/3.4.0/d5/daf/tutorial_py_hi ...
- Python OpenCV实践,相机标定
Python OpenCV实践,相机标定 前言 准备棋盘格 标定相机 图像去畸变 前言 本篇主要是使用python opencv标定相机内参和畸变参数的记录,主要参考opencv官方文档中的示例. 本 ...
- (转)OpenCV版本的摄像机标定
摄像机的标定问题是机器视觉领域的入门问题,可以分为传统的摄像机定标方法和摄像机自定标方法.定标的方法有很多中常见的有:Tsai(传统)和张正友(介于传统和自定标)等, 摄像机成像模型和四个坐标系(通用 ...
- Python+opencv学习记录3:色彩空间
文章目录 1.色彩空间的介绍 1.1.什么是色彩空间 1.2.常见的色彩空间 1.2.1.RGB 1.2.2.HSV 1.2.3.HSI 1.2.4.YCrCb 1.2.5.YUV 1.3.相应的AP ...
- Python+opencv学习记录8:边缘保留滤波(EPF)
文章目录 1.高斯双边模糊 1.1原理 1.2代码解析 2.均值迁移模糊 2.1.原理 2.2.代码解析 完整代码 1.高斯双边模糊 1.1原理 前文提到的高斯模糊只考虑了像素空间的分布,而没有考虑差 ...
- python opencv学习笔记之数米粒,并返回每一个米粒的位置面积及总个数平均面积
之前曾经写过一道数米粒的作业,当时用的是c++中的opencv,这次用python试了一下. 原图及效果图 咦?水印怎么去啊 程序流程 程序的大致流程为: 1.读取图片 2.灰度化 3.二值化 4.膨 ...
- Python+opencv学习记录6:模糊操作
文章目录 1.模糊操作基本原理 1.1.均值模糊 1.2.中值模糊 1.3.自定义模糊 2.相对应的代码 2.1.均值模糊 2.2.中值模糊 2.3.自定义模糊 完整代码 1.模糊操作基本原理 图像在 ...
- python opencv学习(一)Anaconda3+opencv-python3.2.0.7+opencv-contrib-python3.2.0.7安装配置
Anacond下载 下载地址:https://www.anaconda.com/download/ 我下载的路径不是c盘,而是d盘,所以,安装好之后,打开Anaconda Promopt进行安装Ope ...
最新文章
- 千人网站服务器,千人云服务器
- 寻找优秀的程序员之实战指南-2
- FastJson 原理
- linux c 获取 进程 线程 id
- OSU!(bzoj 4318)
- SqlParameter的作用与用法
- PL/SQL块结构和组成元素
- 69 个经典 Spring 面试题和答案
- Zookeeper_环境搭建及客户端使用
- 时代聚焦AI安全——可解释性
- Typora+PicGo+github搭建免费稳定图床写博客如行云流水(mac+window)
- windows消息检测函数
- 做手机系统,鸿蒙怎样才有机会
- xencenter如何安装Centos7虚拟机系统
- 浏览器打开html文件特别慢,打开网页慢是什么原因,教您打开网页慢怎么解决
- ECC椭圆曲线加密的特点以及在有限域(Fp)的三点共线问题
- 企业微信java开发demo_微信企业号demo
- Kylin RT OLAP reassign流程即重新分配replica_set 流程
- zbrush 使用ZModeler制作护腕
- ubuntu20.04 更新后蓝牙机械键盘不可用
热门文章
- libsigc++库的使用
- 函数调用oracle,oracle 函数调用
- 关不关机 扫地机器人_BOBOT扫地机器人能扫还能拖,你的家庭好助理
- vue配置文件读取_Vue+Spring Boot简单用户登录Demo实现
- mysql 随机选择数据_从MySQL随机选取数据
- php+我的第一个程序,2. 第一个 C 程序
- 删除logs mysql_关于删除MySQL Logs的问题记录_MySQL
- 和与余数的和同余理解_每日一题 | 第38期:数量关系之余数特性
- html中两行三列怎样写,html – Flexbox 3 divs,两列,一列有两行
- 皮一皮:据说这是昨天大多数人的写照...