双目视觉离线测量空间三维坐标带详细注释

这篇具有很好参考价值的文章主要介绍了双目视觉离线测量空间三维坐标带详细注释。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

直接上代码:

import numpy as np
import cv2
import glob


# 函数功能:通过双目相机的内外参数和畸变系数进行立体校正,获得去畸变后的双目参数
def get_stereo_rectify_image_from_camera_parameters(P, gray_imageL, gray_imageR):

    # 左、右相机内参
    mtx_l = np.array([[P[0], 0, P[1], 0],
                      [0, P[2], P[3], 0],
                      [0, 0, 1, 0]])
    mtx_r = np.array([[P[4], 0, P[5], 0],
                      [0, P[6], P[7], 0],
                      [0, 0, 1, 0]])
    # 右相机到左相机的旋转矩阵、平移矩阵
    R_lr = np.array([[P[8], P[9], P[10]],
                     [P[11], P[12], P[13]],
                     [P[14], P[15], P[16]]])
    T_lr = np.array([[P[17]],
                     [P[18]],
                     [P[19]]])
    cameraMatrixL = mtx_l[:, 0:3]
    cameraMatrixR = mtx_r[:, 0:3]
    # 左、右相机畸变
    distCoeffL = np.array([P[20], P[21], P[22], P[23], P[24]])
    distCoeffR = np.array([P[25], P[26], P[27], P[28], P[29]])
    # 左相机到左相机的投影矩阵
    R_ll = ([[1, 0, 0],
             [0, 1, 0],
             [0, 0, 1]])
    T_ll = ([[0], [0], [0]])
    temp_R_ll = np.append(R_ll, T_ll, axis=1)
    _temp_R_ll = np.row_stack((temp_R_ll, [0, 0, 0, 1]))
    P0 = np.dot(mtx_l, _temp_R_ll)
    # 左相机到右相机的投影矩阵
    temp_R_lr = np.append(R_lr, T_lr, axis=1)
    _temp_R_lr = np.row_stack((temp_R_lr, [0, 0, 0, 1]))
    P1 = np.dot(mtx_r, _temp_R_lr)

    # 图像的分辨率
    imageSize = (gray_imageL.shape[1], gray_imageL.shape[0])
    # # 立体校正
    Rl, Rr, Pl, Pr, Q, validROIL, validROIR = cv2.stereoRectify(cameraMatrixL, distCoeffL, cameraMatrixR, distCoeffR, imageSize, R_lr, T_lr, flags=0, alpha=0, newImageSize=(0, 0))
    # 计算更正remap
    mapLx, mapLy = cv2.initUndistortRectifyMap(cameraMatrixL, distCoeffL, Rl, Pl, imageSize, cv2.CV_32FC1)
    mapRx, mapRy = cv2.initUndistortRectifyMap(cameraMatrixR, distCoeffR, Rr, Pr, imageSize, cv2.CV_32FC1)
    # 经过remap之后,左右相机的图像已经共面并且行对齐
    rectifyImageL = cv2.remap(gray_imageL, mapLx, mapLy, cv2.INTER_LINEAR)
    rectifyImageR = cv2.remap(gray_imageR, mapRx, mapRy, cv2.INTER_LINEAR)

    # 返回值分别为:左、右相机投影矩阵,校正后的左、右相机投影矩阵,校正后的左、右相机图像
    return P0, P1, Pl, Pr, rectifyImageL, rectifyImageR


# 函数功能:通过双目相机的参数和相机拍摄的光斑的左、右相机图像,计算出光斑三维坐标
def cal_coordinate_from_spot_centroid(cameraParameters, imageL, imageR):

    # 读取相机拍摄的光斑图像,及相机内外参的txt文件
    imagesL = glob.glob(imageL)
    imagesR = glob.glob(imageR)
    file = open(cameraParameters, 'r')
    P = (np.array([x.strip() for x in file.readlines()])).astype(np.float64)

    for imgL in imagesL:
        listL = []
        listR = []

        grayImageL = cv2.imread(imgL, 0)
        imgR = imgL.replace('L', 'R')
        grayImageR = cv2.imread(imgR, 0)

        # 对左右相机拍摄的图像进行立体校正处理
        P0, P1, Pl, Pr, rectifyimgL, rectifyimgR = get_stereo_rectify_image_from_camera_parameters(P, grayImageL, grayImageR)
        # 阈值分割
        ret, thr = cv2.threshold(rectifyimgL, 175, 255, cv2.THRESH_BINARY)
        # 找到图像轮廓并画出来
        contoursL, hie = cv2.findContours(thr, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
        cv2.drawContours(rectifyimgL, contours=contoursL, contourIdx=-1, color=[0, 0, 255], thickness=2)
        contoursL = [cnt for cnt in contoursL if cv2.contourArea(cnt) > 30]
        # 计算图像质心坐标
        for index in range(len(contoursL)):
            ML = cv2.moments(contoursL[index])
            cxL = round(ML['m10'] / ML['m00'], 3)
            cyL = round(ML['m01'] / ML['m00'], 3)
            centerlistL = [cxL, cyL]
            listL.append(centerlistL)

        ret, thr = cv2.threshold(rectifyimgR, 175, 255, cv2.THRESH_BINARY)
        contoursR, hie = cv2.findContours(thr, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
        cv2.drawContours(rectifyimgR, contours=contoursR, contourIdx=-1, color=[0, 0, 255], thickness=2)
        contoursR = [cnt for cnt in contoursR if cv2.contourArea(cnt) > 30]
        for index in range(len(contoursR)):
            MR = cv2.moments(contoursR[index])
            cxR = round(MR['m10'] / MR['m00'], 3)
            cyR = round(MR['m01'] / MR['m00'], 3)
            centerlistR = [cxR, cyR]
            listR.append(centerlistR)

        # 计算光斑的三维坐标
        for i in range(len(listL)):
            s1 = np.array(cv2.triangulatePoints(Pl, Pr, np.array(listL[i]), np.array(listR[i]))).T
            point_3D = s1[0][:-1] / np.max(s1[0][-1])
            point_3D = ("%.3f" % float(point_3D[0]), "%.3f" % float(point_3D[1]), "%.3f" % float(point_3D[2]))
            print('光斑{}的三维空间坐标为:{}'.format(i + 1, point_3D))


if __name__ == "__main__":
    # 读取相机内外参的txt文件,包括双目相机的内外参和畸变参数
    camera_parameters = '0524.txt'
    # 读取相机拍摄的光斑图像
    image_L = 'L1.bmp'
    image_R = 'R1.bmp'
    cal_coordinate_from_spot_centroid(camera_parameters, image_L, image_R)

代码中的示例图片和参数详见链接。文章来源地址https://www.toymoban.com/news/detail-505526.html

到了这里,关于双目视觉离线测量空间三维坐标带详细注释的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 计算机视觉之三维重建(5)---双目立体视觉

     如下图即是一个平行视图。特点:(1) 两个平面平行。 (2) 基线平行于图像平面,极点 e e e 和 e ′ e\\\' e ′ 位于无穷远处。  1. 对于基础矩阵我们有另一个表达式: F = e ′ × K ′ R K − 1 F=e\\\'×K\\\'RK^{−1} F = e ′ × K ′ R K − 1 ,推导过程如下所示。  2. 在平行视图情况下,极点

    2024年04月12日
    浏览(50)
  • 【图像处理】基于双目视觉的物体体积测量算法研究(Matlab代码实现)

    💥💥💞💞 欢迎来到本博客 ❤️❤️💥💥 🏆博主优势: 🌞🌞🌞 博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️ 座右铭: 行百里者,半于九十。 📋📋📋 本文目录如下: 🎁🎁🎁 目录 💥1 概述 📚2 运行结果 🎉3 参考文献 🌈4 Matlab代码实现 本文运用

    2024年02月11日
    浏览(39)
  • 双目视觉实战---三维重建基础与极几何

    目录 一,简介 二. 双视图与三角化 1. 三角化模型 2. 多视图几何的关键问题 3、极几何 三、本质矩阵 四、基础矩阵 3. 基础矩阵的作用及小结 五、基础矩阵估计 三维重建是指通过一系列的图像或传感器数据,推导出物体或场景的三维模型的过程。而极几何(Epipolar Geometry)

    2024年02月07日
    浏览(42)
  • 双目视觉检测 KX02-SY1000型测宽仪 有效修正和消除距离变化对测量的影响

    双目视觉检测的基本原理 利用相机测量宽度时,由于单个相机在成像时存在“近大远小”的现象,并且单靠摄入的图像无法知道被测物的距离,所以由被测物的跳动导致的被测物到工业相机之间距离变化,使测量精度难以提高。 因此测宽仪需要采用两个相机从不同的角度对

    2024年02月06日
    浏览(45)
  • 【必备知识】 三维空间/坐标转换/相机知识

    以下内容包含了2D坐标与3D坐标系之间的转换以及关于相机场的基础知识,理解这部分内容可以更快入门SLAM相关、多视角合成、三维空间变换等内容。 照相机制造过程中的一些涉及到透镜精密以及组装工艺等原因需要对图像进行相应的矫正。如下所示: 需要建立世界坐标系到

    2024年02月03日
    浏览(46)
  • 【数理知识】求两个三维空间点的坐标矩阵之间,任意两两点之间的空间距离,matlab 实现

    假设有两个包含了三维空间点坐标的,三维向量集 A A A 和 B B B ,两集合中分别有 m m m 个和 n n n 个三维空间坐标点,可以用矩阵表示为 A = [ a 1 x a 2 x a 3 x ⋯ a m x a 1 y a 2 y a 3 y ⋯ a m y a 1 z a 2 z a 3 z ⋯ a m z ] 3 × m , B = [ b 1 x b 2 x b 3 x ⋯ b n x b 1 y b 2 y b 3 y ⋯ b n y b 1 z b 2 z b 3 z ⋯

    2024年02月11日
    浏览(51)
  • 知三维空间中任意旋转抛物面的顶点和焦点坐标,建立该旋转抛物面方程

            建立三维空间旋转抛物线方程的前提,首先需要确定三维空间直角坐标系的 位置,然后确定焦点和抛物面顶点的坐标,再利用焦点和抛物面顶点的坐标求出准面方程(我们这里把准面定义为是准线绕着焦点与抛物面顶点形成的直线旋转180°所形成的平面,且该平面垂

    2024年02月09日
    浏览(49)
  • 视觉SLAM14讲笔记-第3讲-三维空间刚体运动

    空间向量之间的运算包括: 数乘、加法、减法、内积、外积。 内积 :可以描述向量间的投影关系,结果是一个标量。 a ⃗ ⋅ b ⃗ = ∑ i = 1 3 a i b i = ∤ a ∤ ∤ b ∤ c o s ⟨ a , b ⟩ vec{a} cdot vec{b}=sum_{i=1}^3{{a _i}{b_i}} =nmid a nmid nmid b nmid cos langle a,b rangle a ⋅ b = i = 1 ∑ 3 ​

    2024年02月11日
    浏览(48)
  • 机器人学|手机玻璃加工全自动化——AGV+机器人+视觉解决方案(含双目三维视觉SLAM建图、MATLAB的AGV路径规划导航避障、六轴机械手臂建模与路径规划仿真,附带源代码)

    文章目录 前言 一、国内外移动操作机器人现状 二、方案概述 三、主要部件BOM清单 1.差动轮式AGV: 2.UR5系列机械臂 3.Cognex智能相机 4.加工台 5.控制系统 6.电源和电缆 四、技术点及工作流程 五、计算自动化方案与人工方案成本收回时间 1.自动化方案成本分析: 2.人工方案成本

    2024年01月22日
    浏览(50)
  • OpenCV C++双目三维重建:双目摄像头实现双目测距

    目录 OpenCV C++双目三维重建:双目摄像头实现双目测距 1.目录结构 2.依赖库  (1) Ubuntu 18.04配置开发环境  (2) Windows配置开发环境 3.双目相机标定  (1)双目相机标定-Python版  (2)双目相机标定-Matlab版 4.相机参数配置 5. 双目测距 6. 运行Demo 7.双目测距的误差说明 8. 双目三维重建项

    2024年02月02日
    浏览(66)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包