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进行摄像机标定的代码:

[python] view plaincopy
  1. # -*- coding:utf-8 -*-
  2. __author__ = 'Microcosm'
  3. import cv2
  4. import numpy as np
  5. import glob
  6. # 设置寻找亚像素角点的参数,采用的停止准则是最大循环次数30和最大误差容限0.001
  7. criteria = (cv2.TERM_CRITERIA_MAX_ITER | cv2.TERM_CRITERIA_EPS, 30, 0.001)
  8. # 获取标定板角点的位置
  9. objp = np.zeros((6*7,3), np.float32)
  10. objp[:,:2] = np.mgrid[0:7,0:6].T.reshape(-1,2)  # 将世界坐标系建在标定板上,所有点的Z坐标全部为0,所以只需要赋值x和y
  11. obj_points = []    # 存储3D点
  12. img_points = []    # 存储2D点
  13. images = glob.glob("E:\python\Python Project\opencv_showimage\images\calibrateImages\*.jpg")
  14. for fname in images:
  15. img = cv2.imread(fname)
  16. gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
  17. size = gray.shape[::-1]
  18. ret, corners = cv2.findChessboardCorners(gray, (7,6), None)
  19. if ret:
  20. obj_points.append(objp)
  21. corners2 = cv2.cornerSubPix(gray, corners, (5,5), (-1,-1), criteria)  # 在原角点的基础上寻找亚像素角点
  22. if corners2:
  23. img_points.append(corners2)
  24. else:
  25. img_points.append(corners)
  26. cv2.drawChessboardCorners(img, (7,6), corners, ret)   # 记住,OpenCV的绘制函数一般无返回值
  27. cv2.imshow('img', img)
  28. cv2.waitKey(50)
  29. print len(img_points)
  30. cv2.destroyAllWindows()
  31. # 标定
  32. ret, mtx, dist, rvecs, tvecs = cv2.calibrateCamera(obj_points, img_points,size, None, None)
  33. print "ret:",ret
  34. print "mtx:\n",mtx        # 内参数矩阵
  35. print "dist:\n",dist      # 畸变系数   distortion cofficients = (k_1,k_2,p_1,p_2,k_3)
  36. print "rvecs:\n",rvecs    # 旋转向量  # 外参数
  37. print "tvecs:\n",tvecs    # 平移向量  # 外参数
  38. print("-----------------------------------------------------")
  39. # 畸变校正
  40. img = cv2.imread(images[12])
  41. h, w = img.shape[:2]
  42. newcameramtx, roi = cv2.getOptimalNewCameraMatrix(mtx,dist,(w,h),1,(w,h))
  43. print newcameramtx
  44. print("------------------使用undistort函数-------------------")
  45. dst = cv2.undistort(img,mtx,dist,None,newcameramtx)
  46. x,y,w,h = roi
  47. dst1 = dst[y:y+h,x:x+w]
  48. cv2.imwrite('calibresult11.jpg', dst1)
  49. print "方法一:dst的大小为:", dst1.shape
  50. # undistort方法二
  51. print("-------------------使用重映射的方式-----------------------")
  52. mapx,mapy = cv2.initUndistortRectifyMap(mtx,dist,None,newcameramtx,(w,h),5)  # 获取映射方程
  53. #dst = cv2.remap(img,mapx,mapy,cv2.INTER_LINEAR)      # 重映射
  54. dst = cv2.remap(img,mapx,mapy,cv2.INTER_CUBIC)        # 重映射后,图像变小了
  55. x,y,w,h = roi
  56. dst2 = dst[y:y+h,x:x+w]
  57. cv2.imwrite('calibresult11_2.jpg', dst2)
  58. print "方法二:dst的大小为:", dst2.shape        # 图像比方法一的小
  59. print("-------------------计算反向投影误差-----------------------")
  60. tot_error = 0
  61. for i in xrange(len(obj_points)):
  62. img_points2, _ = cv2.projectPoints(obj_points[i],rvecs[i],tvecs[i],mtx,dist)
  63. error = cv2.norm(img_points[i],img_points2, cv2.NORM_L2)/len(img_points2)
  64. tot_error += error
  65. mean_error = tot_error/len(obj_points)
  66. print "total error: ", tot_error
  67. print "mean error: ", mean_error

下图是畸变校正前的图片:

通过标定获取摄像机内外参数以及畸变校正系数后对其进行校正:

方法一:

方法二:

Python+OpenCV学习(17)---摄像机标定相关推荐

  1. python做直方图-python OpenCV学习笔记实现二维直方图

    本文介绍了python OpenCV学习笔记实现二维直方图,分享给大家,具体如下: 官方文档 – https://docs.opencv.org/3.4.0/dd/d0d/tutorial_py_2d ...

  2. python opencv 直方图均衡_详解python OpenCV学习笔记之直方图均衡化

    本文介绍了python OpenCV学习笔记之直方图均衡化,分享给大家,具体如下: 官方文档 – https://docs.opencv.org/3.4.0/d5/daf/tutorial_py_hi ...

  3. Python OpenCV实践,相机标定

    Python OpenCV实践,相机标定 前言 准备棋盘格 标定相机 图像去畸变 前言 本篇主要是使用python opencv标定相机内参和畸变参数的记录,主要参考opencv官方文档中的示例. 本 ...

  4. (转)OpenCV版本的摄像机标定

    摄像机的标定问题是机器视觉领域的入门问题,可以分为传统的摄像机定标方法和摄像机自定标方法.定标的方法有很多中常见的有:Tsai(传统)和张正友(介于传统和自定标)等, 摄像机成像模型和四个坐标系(通用 ...

  5. 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 ...

  6. Python+opencv学习记录8:边缘保留滤波(EPF)

    文章目录 1.高斯双边模糊 1.1原理 1.2代码解析 2.均值迁移模糊 2.1.原理 2.2.代码解析 完整代码 1.高斯双边模糊 1.1原理 前文提到的高斯模糊只考虑了像素空间的分布,而没有考虑差 ...

  7. python opencv学习笔记之数米粒,并返回每一个米粒的位置面积及总个数平均面积

    之前曾经写过一道数米粒的作业,当时用的是c++中的opencv,这次用python试了一下. 原图及效果图 咦?水印怎么去啊 程序流程 程序的大致流程为: 1.读取图片 2.灰度化 3.二值化 4.膨 ...

  8. Python+opencv学习记录6:模糊操作

    文章目录 1.模糊操作基本原理 1.1.均值模糊 1.2.中值模糊 1.3.自定义模糊 2.相对应的代码 2.1.均值模糊 2.2.中值模糊 2.3.自定义模糊 完整代码 1.模糊操作基本原理 图像在 ...

  9. 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 ...

最新文章

  1. 千人网站服务器,千人云服务器
  2. 寻找优秀的程序员之实战指南-2
  3. FastJson 原理
  4. linux c 获取 进程 线程 id
  5. OSU!(bzoj 4318)
  6. SqlParameter的作用与用法
  7. PL/SQL块结构和组成元素
  8. 69 个经典 Spring 面试题和答案
  9. Zookeeper_环境搭建及客户端使用
  10. 时代聚焦AI安全——可解释性
  11. Typora+PicGo+github搭建免费稳定图床写博客如行云流水(mac+window)
  12. windows消息检测函数
  13. 做手机系统,鸿蒙怎样才有机会
  14. xencenter如何安装Centos7虚拟机系统
  15. 浏览器打开html文件特别慢,打开网页慢是什么原因,教您打开网页慢怎么解决
  16. ECC椭圆曲线加密的特点以及在有限域(Fp)的三点共线问题
  17. 企业微信java开发demo_微信企业号demo
  18. Kylin RT OLAP reassign流程即重新分配replica_set 流程
  19. zbrush 使用ZModeler制作护腕
  20. ubuntu20.04 更新后蓝牙机械键盘不可用

热门文章

  1. libsigc++库的使用
  2. 函数调用oracle,oracle 函数调用
  3. 关不关机 扫地机器人_BOBOT扫地机器人能扫还能拖,你的家庭好助理
  4. vue配置文件读取_Vue+Spring Boot简单用户登录Demo实现
  5. mysql 随机选择数据_从MySQL随机选取数据
  6. php+我的第一个程序,2. 第一个 C 程序
  7. 删除logs mysql_关于删除MySQL Logs的问题记录_MySQL
  8. 和与余数的和同余理解_每日一题 | 第38期:数量关系之余数特性
  9. html中两行三列怎样写,html – Flexbox 3 divs,两列,一列有两行
  10. 皮一皮:据说这是昨天大多数人的写照...