一.摄像头标定

1. 打印一张棋盘图,网上自己随便找,或者自己用CAD画一个。

2.使用左右两个摄像头,分别同时拍摄不同角度的棋盘图,并保存到目标文件夹下。可参考我的博客:OpenCV011

3.使用matlab工具箱标定:TOOLBOX_calib,标定方法百度一下,就有很多介绍

3.编写一个摄像头参数文件,并命名为:camera_configs.py,我的摄像头参数如下:

# -- coding: utf-8 --
#如若程序有中文注释,将上行代码加到代码的第一行或第二行
#blog:
#https://www.cnblogs.com/zhiyishou/p/5767592.html
#Camera Matrix,distortion
#http://opencv-python-tutroals.readthedocs.io/en/latest/py_tutorials/py_calib3d/py_calibration/py_calibration.html
#                   fx 0 cx
#Camera Matrix=     0 fy cy
#                   0  0  1
#distortion coefficients=(k1,k2,p1,p2,k3)
#filename: camera_configs.py
import cv2
import numpy as npleft_camera_matrix = np.array([[743.75550, 0., 309.19470],[0., 742.26143, 247.91394],[0., 0., 1.]])
left_distortion = np.array([[0.13950, -0.45453, 0.00300, -0.00260, 0.00000]])right_camera_matrix = np.array([[752.48868, 0., 369.93495],[0., 748.39473, 234.17570],[0., 0., 1.]])
right_distortion = np.array([[0.15105, -0.50820, 0.00157, 0.01659, 0.00000]])om = np.array([-0.00573, 0.00361, 0.00487]) # 旋转关系向量
R = cv2.Rodrigues(om)[0]  # 使用Rodrigues变换将om变换为R
T = np.array([-95.74804, 2.60574, 4.01073]) # 平移关系向量size = (640, 480) # 图像尺寸# 进行立体更正
R1, R2, P1, P2, Q, validPixROI1, validPixROI2 = cv2.stereoRectify(left_camera_matrix, left_distortion,right_camera_matrix, right_distortion, size, R,T)
# 计算更正map
left_map1, left_map2 = cv2.initUndistortRectifyMap(left_camera_matrix, left_distortion, R1, P1, size, cv2.CV_16SC2)
right_map1, right_map2 = cv2.initUndistortRectifyMap(right_camera_matrix, right_distortion, R2, P2, size, cv2.CV_16SC2)

二.双目测距实现

废话不说,直接上验证过的代码。调整两个滑块,改变算法阈值。

StereoBM在我之前的博文中有讲解 
# -- coding: utf-8 --
#如若程序有中文注释,将上行代码加到代码的第一行或第二行
#blog:
#https://www.cnblogs.com/zhiyishou/p/5767592.html
import numpy as np
import cv2
import camera_configscv2.namedWindow("left")
cv2.namedWindow("right")
cv2.namedWindow("depth")
cv2.moveWindow("left", 0, 0)
cv2.moveWindow("right", 600, 0)
cv2.createTrackbar("num", "depth", 0, 10, lambda x: None)
cv2.createTrackbar("blockSize", "depth", 5, 255, lambda x: None)
camera1 = cv2.VideoCapture(1)
camera2 = cv2.VideoCapture(0)# 添加点击事件,打印当前点的距离
def callbackFunc(e, x, y, f, p):if e == cv2.EVENT_LBUTTONDOWN:        print threeD[y][x]cv2.setMouseCallback("depth", callbackFunc, None)while True:ret1, frame1 = camera1.read()ret2, frame2 = camera2.read()if not ret1 or not ret2:break# 根据更正map对图片进行重构img1_rectified = cv2.remap(frame1, camera_configs.left_map1, camera_configs.left_map2, cv2.INTER_LINEAR)img2_rectified = cv2.remap(frame2, camera_configs.right_map1, camera_configs.right_map2, cv2.INTER_LINEAR)# 将图片置为灰度图,为StereoBM作准备imgL = cv2.cvtColor(img1_rectified, cv2.COLOR_BGR2GRAY)imgR = cv2.cvtColor(img2_rectified, cv2.COLOR_BGR2GRAY)# 两个trackbar用来调节不同的参数查看效果num = cv2.getTrackbarPos("num", "depth")blockSize = cv2.getTrackbarPos("blockSize", "depth")if blockSize % 2 == 0:blockSize += 1if blockSize < 5:blockSize = 5# 根据Block Maching方法生成差异图(opencv里也提供了SGBM/Semi-Global Block Matching算法,有兴趣可以试试)stereo = cv2.StereoBM(0,16*num, blockSize)disparity = stereo.compute(imgL, imgR)disp = cv2.normalize(disparity, disparity, alpha=0, beta=255, norm_type=cv2.NORM_MINMAX, dtype=cv2.CV_8U)# 将图片扩展至3d空间中,其z方向的值则为当前的距离threeD = cv2.reprojectImageTo3D(disparity.astype(np.float32)/16., camera_configs.Q)cv2.imshow("left", img1_rectified)cv2.imshow("right", img2_rectified)cv2.imshow("depth", disp)key = cv2.waitKey(1)if key == ord("q"):breakelif key == ord("s"):cv2.imwrite("./snapshot/BM_left.jpg", imgL)cv2.imwrite("./snapshot/BM_right.jpg", imgR)cv2.imwrite("./snapshot/BM_depth.jpg", disp)camera1.release()
camera2.release()
cv2.destroyAllWindows()

OpenCV012:双目测距相关推荐

  1. opencv双目测距资料整理

    2010年: http://download.csdn.net/detail/s620888/2428778 使用OpenCV开发的双目标定与景深测距,包括从两个摄像头中直接提取图片,然后直接进行标定 ...

  2. fpga摄像头模块_FPGA开源项目:双目测距(一)之双目图像采集显示以及图片保存...

    1.简述 这个项目是大三下学期暑假(也就是2019年8份)完成的,当时的视频效果已发布在bilibili上,这是我们的省级的科研立项,其实就我一个人负责完成.发布bilibili后很多人比较感兴趣,打 ...

  3. 双目测距数学原理详解(转载)

    版权声明:本文为博主原创文章,转载请联系作者 https://blog.csdn.net/u013832707/article/details/53781810 <div class=" ...

  4. 双目测距(一)--图像获取与单目标定

    原文: http://blog.csdn.net/chenyusiyuan/article/details/5961769 双目测距的基本原理 如上图所示,双目测距主要是利用了目标点在左右两幅视图上成 ...

  5. 学习OpenCV双目测距原理及常见问题解答

    转自博客:https://blog.csdn.net/angle_cal/article/details/50800775 一. 整体思路和问题转化.   图1. 双摄像头模型俯视图  图1解释了双摄 ...

  6. 学习OpenCV(4) 基于OpenCV的双目测距程序

    用MFC和OpenCV编写的双目测距程序,编写过程中参考了很多前人的经验,期间很多博主给我提供了源码或者问题解答,所以我想把我的经验写出来分享给大家,也许并没有什么使用价值,但是可以作为类似的项目的参 ...

  7. Android双目三维重建:Android双目摄像头实现双目测距

    Android双目三维重建:Android双目摄像头实现双目测距 目录 Android双目三维重建:Android双目摄像头实现双目测距 1.开发版本 2.Android双目摄像头 3.双目相机标定 ...

  8. 研电赛项目之双目测距,涉及matlab相机标定,opencv多线程编程,摄像头读取,行人检测、BM立体匹配等等

    1 前言 今年参加了十五届研电赛,前天刚提交了作品,还有几天就答辩了,趁这几天总结一下这一个多月的收获. 本次研电赛作品为汽车行驶防碰撞系统,主要面向大型汽车在低速行驶场景下的防碰撞问题,通过双目相机 ...

  9. 8、双目测距及3D重建python

    文章目录 1.简介 1.1 双目测距 1.2 三维重建 2.双目测距 2.1.双目测距原理 2.2.双目相机标定和校准 2.2.1 双目相机选择 2.2.2 采集标定板的左右视图 2.2.3 相机标定 ...

最新文章

  1. 织梦 百度sitemap制作教程
  2. 53帧变900帧!AI让你不用昂贵的高速摄像机也能制作慢镜头,来自华为|CVPR 2021...
  3. linux存储--dup和dup2函数解析(十八)
  4. WPF 3D基础学习 - 画布、相机、Model3D(1)
  5. TRY NOT TO SAY SO MUCH!
  6. ios runloop学习
  7. Red5 简单安装指南
  8. IIS上的web service调用AX服务问题
  9. 强化学习《基于价值 - DQN其他细节算法》
  10. ubuntu上常用的软件安装
  11. 精美商业计划书PPT模版大合集(共107份,900M)
  12. COMSOL激光烧蚀仿真模型
  13. 期刊论文分析的技巧与程序
  14. ITIL、COBIT、CMMi、ISO、17799框架大揭秘
  15. Vue 在使用v-if的前提下,使用elementResizeDetector配合ref获取元素块的高度
  16. 关于嵌入式的技术竞争力需要花点时间整理一下给大家
  17. [转自知乎]总有些人,让你找不到话题可聊
  18. CNN实现手写0-9数字识别
  19. Linux麒麟系统中文乱码,ubuntu麒麟系统tomcat中文乱码怎么办?ubuntu tomcat中文显示乱码解决方法...
  20. 多人在线协作实现的概要设计

热门文章

  1. 【优秀课设】基于OpenCV-Python的摄像头人脸检测追踪控制系统
  2. Windows Azure Pack与VMware VRA 对比(三)VRA角色简介及基础配置
  3. 微信支付宝个人免签约收款系统的实现
  4. pip 安装 pyautogui 失败
  5. vue面试H5适配快速搭建
  6. QtWebassembly遇到的一些报错问题及解决方案
  7. 金蝶K3出入库单据制单日期误填到未来的日期,如何进行账务调整?
  8. python61到08使用说明书_phonopy中文使用说明
  9. 《Ce train qui s’en va 离站的火车》
  10. 轻量级的项目管理看板工具-Leangoo领歌