1.双目测距,通过鼠标点击像素导出像素的世界坐标

代码如下,核心是threeD,图片内所有像素对应的世界坐标都储存在threeD

#从excel里读取数据
#144行fps帧率不准
import cv2
import pandas as pd
import numpy as np
import time
import random
import math# -----------------------------------双目相机的基本参数---------------------------------------------------------
#   left_camera_matrix          左相机的内参矩阵
#   right_camera_matrix         右相机的内参矩阵
#
#   left_distortion             左相机的畸变系数    格式(K1,K2,P1,P2,0)
#   right_distortion            右相机的畸变系数
# -------------------------------------------------------------------------------------------------------------
# 左镜头的内参,如焦距
file_path = r'C:\out1.xlsx'   # r对路径进行转义,windows需要
raw_data = pd.read_excel(file_path)  # header=0表示第一行是表头,就自动去除了
#raw_data = pd.read_excel(file_path, header=0)
#print(raw_data)
data = raw_data.values     # 只提取表中信息
#print(data)
np.array([1,2,3,4,5,6,7,8,9],dtype='float32');
left_camera_matrix = np.array((data[4:7, 1:4]),dtype='float64');
right_camera_matrix = np.array((data[9:12, 1:4]),dtype='float64');
# 畸变系数,K1、K2、K3为径向畸变,P1、P2为切向畸变:[K1,K2,P1,P2,K3]
K1left= np.array((data[7:8, 1:2]),dtype='float64');
K2left= np.array((data[7:8, 2:3]),dtype='float64');
K3left= np.array((data[7:8, 3:4]),dtype='float64');
P1left= np.array((data[8:9, 1:2]),dtype='float64');
P2left= np.array((data[8:9, 2:3]),dtype='float64');
K1right= np.array((data[12:13, 1:2]),dtype='float64');
K2right= np.array((data[12:13, 2:3]),dtype='float64');
K3right= np.array((data[12:13, 3:4]),dtype='float64');
P1right= np.array((data[13:14, 1:2]),dtype='float64');
P2right= np.array((data[13:14, 2:3]),dtype='float64');
#畸变系数,K1、K2、K3为径向畸变,P1、P2为切向畸变:[K1,K2,P1,P2,K3]
left_distortion =np.hstack((K1left,K2left,P1left,P2left,K3left))
right_distortion =np.hstack((K1right,K2right,P1right,P2right,K3right))
# 旋转矩阵
R = np.array((data[1:4, 1:4]),dtype='float64');
# 平移矩阵
T = np.array(np.transpose(data[0:1, 1:4]),dtype='float64');
#T = np.array([-55.4164455,-0.307896388,-3.669759334])size = (320, 180)
R1, R2, P1, P2, Q, validPixROI1, validPixROI2 = cv2.stereoRectify(left_camera_matrix, left_distortion,right_camera_matrix, right_distortion, size, R,T)# 校正查找映射表,将原始图像和校正后的图像上的点一一对应起来
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)
print(Q)# --------------------------鼠标回调函数---------------------------------------------------------
#   event               鼠标事件
#   param               输入参数
# -----------------------------------------------------------------------------------------------
def onmouse_pick_points(event, x, y, flags, param):if event == cv2.EVENT_LBUTTONDOWN:threeD = paramprint('\n像素坐标 x = %d, y = %d' % (x, y))# print("世界坐标是:", threeD[y][x][0], threeD[y][x][1], threeD[y][x][2], "mm")print("世界坐标xyz 是:", threeD[y][x][0] / 1000.0, threeD[y][x][1] / 1000.0, threeD[y][x][2] / 1000.0, "m")distance = math.sqrt(threeD[y][x][0] ** 2 + threeD[y][x][1] ** 2 + threeD[y][x][2] ** 2)distance = distance / 1000.0  # mm -> mprint("距离是:", distance, "m")with open ('C:/threeDD.txt', 'w') as outfile:for slice_2d in threeD:np.savetxt(outfile, slice_2d, fmt = '%f', delimiter = ',')# 加载视频文件
capture = cv2.VideoCapture(0)
WIN_NAME = 'Deep disp'
cv2.namedWindow(WIN_NAME, cv2.WINDOW_AUTOSIZE)# 读取视频
fps = 0.0
ret, frame = capture.read()
while ret:# 开始计时t1 = time.time()# 是否读取到了帧,读取到了则为Trueret, frame = capture.read()# 切割为左右两张图片frame1 = frame[150:330, 0:320]frame2 = frame[150:330, 320:640]# 将BGR格式转换成灰度图片,用于畸变矫正imgL = cv2.cvtColor(frame1, cv2.COLOR_BGR2GRAY)imgR = cv2.cvtColor(frame2, cv2.COLOR_BGR2GRAY)# 重映射,就是把一幅图像中某位置的像素放置到另一个图片指定位置的过程。# 依据MATLAB测量数据重建无畸变图片,输入图片要求为灰度图img1_rectified = cv2.remap(imgL, left_map1, left_map2, cv2.INTER_LINEAR)img2_rectified = cv2.remap(imgR, right_map1, right_map2, cv2.INTER_LINEAR)# 转换为opencv的BGR格式imageL = cv2.cvtColor(img1_rectified, cv2.COLOR_GRAY2BGR)imageR = cv2.cvtColor(img2_rectified, cv2.COLOR_GRAY2BGR)# ------------------------------------SGBM算法----------------------------------------------------------#   blockSize                   深度图成块,blocksize越低,其深度图就越零碎,0<blockSize<10#   img_channels                BGR图像的颜色通道,img_channels=3,不可更改#   numDisparities              SGBM感知的范围,越大生成的精度越好,速度越慢,需要被16整除,如numDisparities#                               取16、32、48、64等#   mode                        sgbm算法选择模式,以速度由快到慢为:STEREO_SGBM_MODE_SGBM_3WAY、#                               STEREO_SGBM_MODE_HH4、STEREO_SGBM_MODE_SGBM、STEREO_SGBM_MODE_HH。精度反之# ------------------------------------------------------------------------------------------------------blockSize = 3img_channels = 3stereo = cv2.StereoSGBM_create(minDisparity=1,numDisparities=64,blockSize=blockSize,P1=8 * img_channels * blockSize * blockSize,P2=32 * img_channels * blockSize * blockSize,disp12MaxDiff=-1,preFilterCap=1,uniquenessRatio=10,speckleWindowSize=100,speckleRange=100,mode=cv2.STEREO_SGBM_MODE_HH)# 计算视差disparity = stereo.compute(img1_rectified, img2_rectified)# 归一化函数算法,生成深度图(灰度图)disp = cv2.normalize(disparity, disparity, alpha=0, beta=255, norm_type=cv2.NORM_MINMAX, dtype=cv2.CV_8U)# 生成深度图(颜色图)dis_color = disparitydis_color = cv2.normalize(dis_color, None, alpha=0, beta=255, norm_type=cv2.NORM_MINMAX, dtype=cv2.CV_8U)dis_color = cv2.applyColorMap(dis_color, 2)# 计算三维坐标数据值threeD = cv2.reprojectImageTo3D(disparity, Q, handleMissingValues=True)# 计算出的threeD,需要乘以16,才等于现实中的距离threeD = threeD * 16# 鼠标回调事件cv2.setMouseCallback("depth", onmouse_pick_points, threeD)#完成计时,计算帧率fps = (fps + (1. / (time.time() - t1+0.1))) / 2frame = cv2.putText(frame, "fps= %.2f" % (fps), (0, 40), cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 255, 0), 2)cv2.imshow("depth", dis_color)cv2.imshow("left", frame1)cv2.imshow(WIN_NAME, disp)  # 显示深度图的双目画面,WIN_NAME = 'Deep disp'# 若键盘按下q则退出播放if cv2.waitKey(1) & 0xff == ord('q'):break# 释放资源
capture.release()# 关闭所有窗口
cv2.destroyAllWindows()

测距时需用到matlab导出的相机标定参数,详见【双目相机】基于matlab的参数标定2-使用matlab标定

注意:使用之前必须新建立一个空的txt文件(如代码内的threeDD.txt),新建立的文件必须是空的(即不含任何内容)

使用此代码,在鼠标点击事件发生时即可记录此时刻的threeD内容

threeD即双目相机对应的图片的所有像素的世界坐标,通过其像素坐标(x,y)索引,索引公式:列数=320y+x+1)

2.将txt转化为excel索引数据

步骤如下所示
1.excel选择 打开
2.点击要打开的txt文件,依次按照如下步骤进行
完毕,即可在excel中查看数据

3.数据索引

如下图所示,假设python中点击像素(x,y)=(200,149)输出结果如下:
按照公式:
索引公式:列数=320y+x+1

计算出结果在excel的47881行内

【双目相机】双目摄像头测距并导出世界坐标数据进入txt【python】相关推荐

  1. 双目相机--双目视差与深度距离关系推导详解

    相机成像的模型如下图所示: P为空间中的点,P1和P2是点P在左右像平面上的成像点,f是焦距,OR和OT是左右相机的光心.由下图可见左右两个相机的光轴是平行的.XR和XT是两个成像点在左右两个像面上距 ...

  2. Win10-OpenCV双目相机开发

    平台环境硬件Win10 VS2019 OpenCV3.4.6 ZED双目相机 //===================双目相机图像形式===============================/ ...

  3. 「 SLAM lesson-1.2 」传感器分类、单目相机、双目相机、深度相机

    结合 高翔老师的著作<视觉SLAM十四讲:从理论到实践>,加上小白的工程经验共同完成.建议作为笔记功能反复使用. 一.用于定位的传感器分类 主要分成两类:         1). 传感器携 ...

  4. 双目相机测距代码演示

    双目测距的操作流程有四步:相机标定--双目校正--双目匹配--计算深度,具体内容参考 : https://blog.csdn.net/qq_38236355/article/details/88933 ...

  5. 双目相机标定以及立体测距原理及OpenCV实现

    转载 双目相机标定以及立体测距原理及OpenCV实现 http://blog.csdn.net/dcrmg/article/details/52986522?locationNum=15&fp ...

  6. 双目测距------双目相机V1.0,将双目相机采集到任意一点的深度数据进行串口传输(带源码)

    Depth2Uart 双目测距------双目相机V1.0,将双目相机采集到任意一点的深度数据进行串口传输 一.项目说明/Overview 所实现的功能:基于Intel Realsense官方提供的S ...

  7. ORB-SLAM2:一个支持单目、双目和RGB-D摄像头(相机)的开源SLAM系统(翻译)

    书读百遍其义自见,为了日后能方便快速回顾ORB-SLAM2的原理和思想,这里本人将论文翻译成中文母语,网上也有其他的翻译版本,诸君也可参照.本文不求诸君全信,但求无误导之嫌疑.小经验:研究源码以及修改 ...

  8. 双目相机标定以及立体测距原理及OpenCV实现(下)

    前篇:双目相机标定以及立体测距原理及实现(上) 双目相机标定后,可以看到左右相机对应匹配点基本上已经水平对齐. 之后在该程序基础上运行stereo_match.cpp,求左右相机的视差. 注:下边Op ...

  9. 双目相机标定以及立体测距原理及实现(上)

    作者丨童虎 编辑丨3D视觉开发者社区 单目相机标定的目标是获取相机的内参和外参,内参(1/dx,1/dy,Cx,Cy,f)表征了相机的内部结构参数,外参是相机的旋转矩阵R和平移向量t.内参中dx和dy ...

最新文章

  1. 什么是结构风险?在决策树类相关算法中通常有哪些正则化参数来控制模型的结构风险?解读一下
  2. php 7编译 phar,编译安装php7
  3. 程序编译生成的Hex、Bin、axf和elf格式
  4. python中构造方法可以被继承吗_python – 类继承:构造函数应该兼容吗?多重继承的情况?...
  5. kafka->Flink->ElasticSearch(Java形式)
  6. android 百度地图3.0,android 百度地图3.0
  7. java 8 删选集合 和取集合中的字段重组成集合的使用
  8. 谷歌相册明年取消无限空间储存政策
  9. 中国大陆物联网驶入快车道 台商抢上车
  10. SQL计算两个日期之间的工作天数
  11. Sublime Text 3的中文显示乱码问题
  12. 如何将CAD图纸转换成彩色jpg?
  13. 人月神话札记:系统设计
  14. 爬取男神or女神图片(爬虫案例二)
  15. matlab 2015 积分,Matlab中如何求解积分?
  16. 录入年、月、日,判断日期的合法性
  17. 斯坦福校长被曝学术不端,正接受校方调查!11篇论文「篡改图片」涉嫌造假...
  18. css动态特效 @keyframes
  19. ArcMap中创建.shp文件
  20. 框架与设计模式的区别

热门文章

  1. 2020牛客寒假算法基础集训营4
  2. java图片识别人像计算人头数_人头检测代码示例:SVM+HOG
  3. 【荐书】如何赚钱,如何管理钱
  4. 【杂谈】如何通过目标职位确定学习路径和努力方向(拿测试工程师举例子)
  5. 利用这个小工具+系统日历让你在SCAU成为时间管理大师
  6. 【SequoiaDB|巨杉数据库】特殊配置修改
  7. element-内置过渡动画-fade 淡入淡出
  8. 在万米高空享受高速网络!中国航司机队将能接入高速互联网;温德姆酒店集团将采用亚马逊云技术 | 美通社头条...
  9. 解决Bitlocker加密暂停无法继续也无法取消
  10. kensington安全锁_备用电源-Kensington 120W笔记本电源适配器