精华内容
下载资源
问答
  • 双目相机

    千次阅读 2019-05-06 14:47:27
    双目相机 计算机视觉基础1——视差与深度信息 目录 1. 单目 2. 双目 3. RGBD 双目立体视觉 相机标定————畸变矫正————立体校正————极线约束————立体匹配(关键步骤)————三角测量 ...

     

    双目相机

     

    计算机视觉基础1——视差与深度信息

    目录

    1. 单目
    2. 双目
    3. RGBD
    

    双目立体视觉

    相机标定————畸变矫正————立体校正————极线约束————立体匹配(关键步骤)————三角测量
    

    立体匹配最基本的步骤:

    1)代价计算。
       计算左图一个像素和右图一个像素之间的代价(某种差值)。
       
    2)代价聚合。
       一般基于点之间的匹配很容易受噪声的影响,往往真实匹配的像素的代价并不是最低。
       所以有必要在点的周围建立一个window,让像素块和像素块之间进行比较,这样肯定靠谱些。
       代价聚合往往是局部算法或者半全局算法才会使用,
       全局算法抛弃了window,采用基于全图信息的方式建立能量函数。
       
    3)深度赋值。
       这一步可以区分局部算法与全局算法,局部算法直接优化代价聚合模型。
       而全局算法,要建立一个能量函数,能量函数的数据项往往就是代价聚合公式,例如DoubleBP。
       输出的是一个粗略的视差图。
       
    4)结果优化。
       对上一步得到的粗估计的视差图进行精确计算,策略有很多,
       例如plane fitting,BP,动态规划等。
    

    局部方法

    Winner-takes-All
    赢者通吃————先入为主—————用户黏性
    局部最小
    

    方法有:

    1. Block Matching 块匹配
    
    
    6. CSCA
    

    半全局

    全局

    双目 ros 包 elas

    wiki.ros elas_ros

    github code cyphy-elas-ros

    普通工程 ELAS

    stereo_elas

    双目障碍物检测

    深度学习双目匹配 DispNet

    可以建立 相机坐标系下的 点云

    如需建立 世界坐标系下的点云 需要跟踪 每一帧图像的位姿变化 既需要配合 视觉里程计来使用

    viso2

    机器人视觉 实验室 代码参考 

    机器人视觉 实验室 代码参考 

    elas使用

    节点 Nodes

    节点1. elas_ros Nodes

    完成 双目视差匹配disparity matching, 生成当前相机坐标系下的点云point clouds   camera's local reference frame.

    订阅的话题 Subscribed Topics

    a. <stereo>/left/<image> (sensor_msgs/Image)      左图矫正后的图像 Left rectified stereo image. 
    
    b. <stereo>/right/<image> (sensor_msgs/Image)     右图矫正后的图像 Right rectified stereo image. 
    
    c. <stereo>/left/camera_info (sensor_msgs/CameraInfo) 左相机参数 Camera info for left camera. 
    
    4. <stereo>/right/camera_info (sensor_msgs/CameraInfo) 右相机参数 Camera info for right camera. 
    

    发布的话题 Published Topics

    a. disparity (sensor_msgs/Image)  视差 话题
       Image representing the calculated disparity at each point. 
        Note that the values are scaled to be in the range [0, 255] 
    
    b. point_cloud (sensor_msgs/PointCloud2) 左相机当前坐标系下 的点云地图
        The point cloud assosciated with the calculated disparity in the left camera's local reference frame. 
    
    c. frame_data (elas_ros/ElasFrameData)  结构数据  用于三维重建
        Frame data used for the point cloud concatenation process. See node pc_construction. 
    

    参数 Parameters

    a. ~queue_size (int, default: 5)  队列大小
        Length of the input queues for left and right camera synchronization. 
    
    b. ~approximate_sync (bool, default: false)  同步
        Whether the node should use approximate synchronization of incoming messages. 
        Set to true if cameras do not have synchronised timestamps. 
    

    节点2. pc_construction 三维重建

    This node concatenates the point clouds generated by the elas_ros node.
    

    订阅的话题 Subscribed Topics

    <frame_data> (elas_ros/ElasFrameData)   结构数据  用于三维重建
        The frame data generated by the elas_ros node. 
    
    <pose> (geometry_msgs/PoseStamped)    相机姿态数据  来自视觉里程计
        The pose transformation from base frame to pose frame. 
        This accounts for motion of the camera. This can typically be determined by appropriate visual odometry. 
        See usage notes below. 
    

    发布的话题Published Topics

    point_cloud (sensor_msgs/PointCloud2) 世界坐标系下的点云地图
        The concatenated point cloud. 
    

    参数 Parameters

    ~queue_size (int, default: 5)  队列大小 
        Length of the input queues for frame data and pose synchronization. 
    

      ~approximate_sync (bool, default: false)  同步 Whether the node should use approximate synchronization of incoming messages. Set to true if frame data and pose do not have synchronised timestamps.

    base_frame_id (string)  基坐标系
        The name of the base frame that the concatenated point cloud should be cast into. 
    
    pose_frame_id (string)  相机位姿坐标系
        The name of the frame that the given pose transforms into. 
    

    相机 图像处理流水线 ros包

    image_pipeline

    Tables Are Cool
    col 3 is right-aligned $1600
    col 2 is centered $12
    zebra stripes are neat $1

    显示链接中带括号的图片

    ![][1] [1]: http://latex.codecogs.com/gif.latex?\prod%20(n_{i})+1

    单目 双目相机 实战

    单目标定

    双目标定

    双目匹配

    OpenCV提供了以下四种立体匹配算法的函数:

    1. 基于局部的块匹配    Block Matching(BM) StereoBM
    2. 半全局块匹配        Semi-Global Block Matching(SGBM) StereoSGBM
    >第一步对每一个Pixel使用块匹配BM进行匹配,得到了全部Pixel的disparity map。
    >第二步对Disparity map建立图,用Graph Cut对其进行全局优化。
    >利用Rectification将二维转化为一维
    3. 基于全局的图割      Graph Cut(GC)cvStereoGCState()
    4. 基于全局的 动态规划 Dynamic Programming(DP)cvFindStereoCorrespondence()
    

    双目相机 算法

    ADCensus, SGBM, BM算法参考

    ELAS论文解析

    ELAS代码

    棋盘格

    双目相机 矫正

    * 用法 ./Stereo_Calibr -w=6 -h=8  -s=24.3 stereo_calib.xml   
      我的  ./Stereo_Calibr -w=8 -h=10 -s=200 stereo_calib.xml
    * ./stereo_calib -w=9 -h=6 stereo_calib.xml 标准图像
    *  实际的正方格尺寸在程序中指定 const float squareSize = 2.43f;    
       2.43cm  mm为单位的话为 24.3  0.1mm为精度的话为   243 注意 标定结果单位(纲量)和此一致
    

    原理分析 原理分析2

    径向畸变矫正 光学透镜特效 凸起 k1 k2 k3 三个参数确定

     Xp=Xd(1 + k1*r^2 + k2*r^4 + k3*r^6)
     Yp=Yd(1 + k1*r^2 + k2*r^4 + k3*r^6)
    

    切向畸变矫正 装配误差 p1 p2 两个参数确定

     Xp= Xd + ( 2*p1*y  + p2*(r^2 + 2*x^2) )
     Yp= Yd + ( p1 * (r^2 + 2*y^2) + 2*p2*x )
     r^2 = x^2+y^2
    

    投影公式 世界坐标点 到 相机像素坐标系下

                                                  | Xw|
    *  | u|     |fx  0   ux 0|     |    R   T  |    | Yw|
    *  | v| =   |0   fy  uy 0|  *  |           | *  | Zw| = M*W
    *  | 1|     |0   0  1   0|     |   0 0  0 1|    | 1 |
    

    相机标定和三维重建

    *   像素坐标齐次表示(3*1)  =  内参数矩阵 齐次表示(3*4)  ×  外参数矩阵齐次表示(4*4) ×  物体世界坐标 齐次表示(4*1)
    *   内参数齐次 × 外参数齐次 整合 得到 投影矩阵  3*4    左右两个相机 投影矩阵 P1 = K1*T1   P2 = k2*T2
    *   世界坐标 W  ----> 左相机投影矩阵 P1 ------> 左相机像素点 (u1,v1,1)
    *               ----> 右相机投影矩阵 P2 ------> 右相机像素点 (u2,v2,1)
    

    Q为 视差转深度矩阵 disparity-to-depth mapping matrix

    * Z = f*B/d       =   f    /(d/B)
    * X = Z*(x-c_x)/f = (x-c_x)/(d/B)
    * X = Z*(y-c_y)/f = (y-y_x)/(d/B)
    

    Q为 视差转深度矩阵 参考

    *    Q= | 1   0    0         -c_x     |    Q03
    *       | 0   1    0         -c_y     |    Q13
    *       | 0   0    0          f       |    Q23
    *       | 0   0   -1/B   (c_x-c_x')/B |    c_x和c_x' 为左右相机 平面坐标中心的差值(内参数)
    *                   Q32        Q33
    
    *  以左相机光心为世界坐标系原点   左手坐标系Z  垂直向后指向 相机平面  
    *           |x|      | x-c_x           |     |X|
    *           |y|      | y-c_y           |     |Y|
    *   Q    *  |d| =    |   f             |  =  |Z|======>  Z'  =   Z/W =     f/((-d+c_x-c_x')/B)
    *           |1|      |(-d+c_x-c_x')/B  |     |W|         X'  =   X/W = ( x-c_x)/((-d+c_x-c_x')/B)
                                                             Y'  =   Y/W = ( y-c_y)/((-d+c_x-c_x')/B)
                                                            与实际值相差一个负号
    

    双目 视差与深度的关系

    Z = f * T / D   
    f 焦距 量纲为像素点  
    T 左右相机基线长度 
    量纲和标定时 所给标定板尺寸 相同 
    D视差 量纲也为 像素点 分子分母约去,
    Z的量纲同 T
    

    像素单位与 实际物理尺寸的关系

    * CCD的尺寸是8mm X 6mm,帧画面的分辨率设置为640X480,那么毫米与像素点之间的转换关系就是80pixel/mm
    * CCD传感器每个像素点的物理大小为dx*dy,相应地,就有 dx=dy=1/80
    * 假设像素点的大小为k x l,其中 fx = f / k, fy = f / (l * sinA), 
      A一般假设为 90°,是指摄像头坐标系的偏斜度(就是镜头坐标和CCD是否垂直)。
    * 摄像头矩阵(内参)的目的是把图像的点从图像坐标转换成实际物理的三维坐标。因此其中的fx,y, cx, cy 都是使用类似上面的纲量。
    * 同样,Q 中的变量 f,cx, cy 也应该是一样的。
    
        参考代码 
        https://github.com/yuhuazou/StereoVision/blob/master/StereoVision/StereoMatch.cpp
        https://blog.csdn.net/hujingshuang/article/details/47759579
    
        http://blog.sina.com.cn/s/blog_c3db2f830101fp2l.html
    

    视差快匹配代价函数:

     【1】对应像素差的绝对值和(SAD, Sum of Absolute Differences) 
    
     【2】对应像素差的平方和(SSD, Sum of Squared Differences)
    
     【3】图像的相关性(NCC, Normalized Cross Correlation) 归一化积相关算法
    
     【4】ADCensus 代价

     

     

    ==============================================

    双目匹配

    手工设计的特征   匹配代价  

    1. 像素差的绝对值(SAD, Sum of Absolute Differences) 
    2. 像素差的平方和(SSD, Sum of Squared Differences)
    3. 图像的相关性(NCC, Normalized Cross Correlation) 
    4. Census 局部空间结构 汉明距离 匹配代价 
    5. AD + Census
    6. SD + Census
    7. ...
    

    卷积网络学习的特征 匹配代价

    Stereo Matching by Training a Convolutional Neural Network to Compare Image Patches 
    

    卷积网络双目匹配

    输入:两个图像块
    输出:匹配代价 Match Cost
    

    Network I

    two img --->two CNN ----> 连接(concatenate)----> 全连接 ----->相似性得分(similarity score)
    
    Small patch size 
    “Big” network(~600K) 
    Binary prediction
    

    Network II

    two img --->two CNN ---->标准化(normalizer)----->点乘(dot product) ----->相似性得分(similarity score)
    
    Dot-product 
    Small network
    Hinge loss
    

    Network III

    two img --->two CNN(共享权重)---------->相关性----->
    Full content 
    Dot-product 
    Larger patch 
    Log loss
    

    Dataset 数据集 Stereo Datasets

    middlebury数据集

    Middlebury 数据集

    KITTI Vision Benchmark Suite数据集

    KITTI 数据集

    训练

    1. 预处理,数据增强  Preprocessing, data-augmentation
    2. 网络:  梯度聚合  network: gradient aggregated 
    3. SGD;  Batch Normalization 批量化 
    

    Refinement in practice Smoothing 平滑

    代价聚合  Cost-aggregation 
        1.平均邻近位置 Averaging neighboring locations
        2.奇特的“邻居” 外点(遮挡点+不稳定)
    全局能量函数
    SGM(Stereo Processing by Semi-Global Matching and Mutual Information) 
    
    CRF  
    dynamic programming
    
    Border fixing(CNN) 
    Left-right consistency 
    Further smooth 
    Outlier detector
    

    三角测量

    深度与视差成反比 Depth is inversely proportional to disparity

    Z = fB/d 
      z:深度
      f:相机焦距
      d:像素点视差
    Y = (u - cy)*Z/f
    X = (v - cx)*Z/f
    展开全文
  • 双目相机驱动

    2018-08-06 09:31:16
    双目相机驱动用于驱动双目相机,此程序经实践好使,稳定运行
  • 双目相机标定.rar

    2021-01-30 16:44:37
    双目相机标定
  • 双目相机模型

    2020-11-03 09:53:47
    近期想研究一下 双目相机 的内容,故先把 理论 弄清楚! 一、双目相机模型 针孔相机模型描述了 单个相机 的成像模型。然而,仅根据一个像素,我们是无法确定 这个空间点的具体位置的。这是因为,从相机光心到...

    近期想研究一下 双目相机 的内容,故先把 理论 弄清楚!

     

    一、双目相机模型

    针孔相机模型描述了 单个相机 的成像模型。然而,仅根据一个像素,我们是无法确定 这个空间点的具体位置的。
    这是因为,从相机光心到归一化平面连线上的所有点,都可以 投影至该像素上。只有当 P 的深度确定时(比如通过双目或 RGB-D 相机),
    我们才能确 切地知道它的空间位置。

     

    测量像素距离(或深度)的方式有很多种,像人眼就可以根据左右眼看到的景物差异 (或称视差)来判断物体与我们的距离。

    双目相机的原理亦是如此。通过同步采集左右相机的图像,计算图像间视差,来估计每一个像素的深度。

    下面我们简单讲讲双目相机的成像 原理(图 5-6

     
     
     
    双目相机一般由左眼和右眼两个水平放置的相机组成(前期需要标定)。当然也可以做成上下两个目, 但我们见到的主流双目都是做成左右的。
    在左右双目的相机中,我们可以把两个相机都看 作针孔相机。它们是水平放置的,意味两个相机的光圈中心都位于 x 轴上。
    它们的距离称 为双目相机的 基线Baseline, 记作 b),是双目的重要参数。 现在,考虑一个空间点 P,它在左眼和右眼各成一像,记作 PL, PR
    由于相机基线的 存在,这两个成像位置是不同的。理想情况下,由于左右相机只有在 x 轴上有位移,因此  的像也只在 x 轴(对应图像的 u 轴)上有差异 (y轴相等)。
    我们记它在左侧的坐标为 uL,右侧坐标 为 uR。那么,它们的几何关系如图5-6右侧所示。 
    根据三角形 P -PL -PR P -OL -OR 的相似关系,有:
     
    稍加整理,得:
     
    这里 d 为左右图的横坐标之差,称为视差Disparity);根据视差,我们可以估计一 个像素离相机的距离;f,b 都是已经知道的!
    视差与距离成反比:视差越大,距离越近。同时,由于视差最小为 一个像素,于是双目的深度存在一个理论上的最大值,由 fb 确定。
    我们看到,当基线越长 时,双目最大能测到的距离就会变远;反之,小型双目器件则只能测量很近的距离。 虽然由视差计算深度的公式很简洁,
    但视差 d 本身的计算却比较困难。我们需要确切 地知道左眼图像某个像素出现在右眼图像的哪一个位置(即对应关系),
    这件事亦属于“人 类觉得容易而计算机觉得困难”的事务。当我们想计算每个像素的深度时,其计算量与精 度都将成为问题,
    而且只有在图像纹理变化丰富的地方才能计算视差。由于计算量的原因, 双目深度估计仍需要使用 GPU FPGA 来计算。
     
     
     

    二、理解

     
    从上面的相机模型可知,要想求出特征点的深度(距离),需要知道特征点在 左右 两个相机 成像平面坐标系下的位置 uL, uR
    目前我知道的有两种方法;
    第一种:根据模型分别求特征点在左右相机的位置,然后进行匹配,并去除错误匹配点,根据得到的匹配点进行特征点距离的求解;
     
    第二种:根据相机模型,获得特征点在左相机的像素位置,然后根据KLT光流法追踪 左相机特征点 在 右相机的位置,得到匹配的特征点,再进行 三角化!
     

                           左相机                     右相机
    K   帧           prev_img

                                |

    K+1 帧       cur_img    ------>   rightImg
    ----------------------------------------------------------------

     
    思考:
    想一下VINS-MONO程序的思路,单目+IMU;对于单目相机而言,需要通过不同位置对同一个路标点进行观察,从观察到的位置推断路标点的距离;
    在此之前,需要利用 2D-2D 对极约束 估计两帧图像的旋转和平移;得到特征点后,再利用3D-2D的思路求解相机的位姿;本人感觉求出特征点的距离后,
    其他的内容应该别无二致,优化、滑动窗口等;
     
    对于相机运动的估计,可总结如下:
    1. 当相机为单目时,我们只知道 2D 的像素坐标,因而问题是根据两组 2D 估计运 动。该问题用对极几何来解决
    2. 当相机为双目、RGB-D ,或者我们通过某种方法得到了距离信息,那问题就是根 据两组 3D 估计运动。该问题通常用 ICP 来解决
    3. 如果我们有 3D 点和它们在相机的投影位置,也能估计相机的运动。该问题通过 PnP 求解
     
     

    双目+imu的作用是什么呢?

    (1)追踪中提供较好的初始位姿

    (2)提供重力方向

    (3)提供一个时间误差项以供优化

    举例:

    OKVIS 的算法流程是通过  IMU测量值  对当前状态做预测,根据预测进行特征提取和特征匹配,3D点特征和二维图像特征构成优化中重投影,同时预测的
    IMU 的状态量和优化的参数之间构成 IMU 测量误差,这两项误差放在一起做优化。
     
     
    展开全文
  • 双目相机标定代码

    2018-06-14 15:26:28
    该资源主要是针对双目相机标定,可以进行计算机视觉的下一步工作
  • 目的:参考ros的stereo_iamge_proc,采用两个一样的usb相机,来搭建双目相机。 实验步骤记录: 1. 根据usb相机的ros驱动,ros_usb_cam,修改一下launch文件,同时启动两个usb相机。 <launch> <node ...

    目的:参考ros的stereo_iamge_proc,采用两个一样的usb相机,来搭建双目相机。

     


    实验步骤记录:

    1. 根据usb相机的ros驱动,ros_usb_cam,修改一下launch文件,同时启动两个usb相机。

    <launch>
      <node name="left" pkg="usb_cam" type="usb_cam_node" output="screen" >
        <param name="video_device" value="/dev/video1" />
        <param name="image_width" value="640" />
        <param name="image_height" value="480" />
        <param name="pixel_format" value="yuyv" />
        <param name="camera_frame_id" value="left" />
        <param name="camera_name" value="left" />
        <param name="io_method" value="mmap"/>
        <param name="framerate" value="30" />
        <!-- file://${ROS_HOME}/camera_info/${NAME}.yaml -->
        <param name="camera_info_url" value="file:///home/nan/dev/cam_ws/src/usb_cam/config/left.yaml"/>
        <remap from="/left/camera_info" to="/stereo/left/camera_info"/>
        <remap from="/left/image_raw" to="/stereo/left/image_raw"/>
      </node>
    
      <node name="right" pkg="usb_cam" type="usb_cam_node" output="screen" >
        <param name="video_device" value="/dev/video2" />
        <param name="image_width" value="640" />
        <param name="image_height" value="480" />
        <param name="pixel_format" value="yuyv" />
        <param name="camera_frame_id" value="right" />
        <param name="camera_name" value="right" />
        <param name="io_method" value="mmap"/>
        <param name="framerate" value="30" />
        <param name="camera_info_url" value="file:///home/nan/dev/cam_ws/src/usb_cam/config/right.yaml"/>
        <remap from="/right/camera_info" to="/stereo/right/camera_info"/>
        <remap from="/right/image_raw" to="/stereo/right/image_raw"/>
      </node>
    
      <!-- <node name="image_view" pkg="image_view" type="image_view" respawn="false" output="screen">
        <remap from="image" to="/usb_cam/image_raw"/>
        <param name="autosize" value="true" />
      </node> -->
    </launch>

    这一步需要注意的有:

    ①需要提前标定好左右两个单目相机,可以直接采用ros标定单目相机,然后记得存储相机的参数文件

    ②给camera_info_url赋值,这里需要注意的是file:后有三道斜杠

    ③为了方便后续运行stereo_image_proc,这里将话题进行了映射,增加了一个ROS_NAMESPACE,也就是stereo

    2. 运行stereo_image_proc

    这一步首先

    $ ROS_NAMESPACE=stereo rosrun stereo_image_proc stereo_image_proc

     然后就可以输出矫正后的rect_img了

    可以在rviz中进行订阅查看,也可以通过命令

    rosrun image_view stereo_view image:=image_rect

    由于这里的namespace就是stereo,上述命令省略了替换namespace的命令 :

    $ rosrun image_view stereo_view stereo:=narrow_stereo_textured image:=image_rect
    

    不出意外的话能够见到不错的结果,参考链接wiki之选择合适的参数


    然而博主这里报错了:

    [ WARN] [1568596225.043242571]: 'stereo' has not been remapped! Example command-line usage:
    	$ rosrun image_view stereo_view stereo:=narrow_stereo image:=image_color
    [ INFO] [1568596225.240910723]: Subscribing to:
    	* /stereo/left/image_rect
    	* /stereo/right/image_rect
    	* /stereo/disparity
    [ WARN] [1568596240.295962861]: [stereo_view] Low number of synchronized left/right/disparity triplets received.
    Left images received:      437 (topic '/stereo/left/image_rect')
    Right images received:     437 (topic '/stereo/right/image_rect')
    Disparity images received: 0 (topic '/stereo/disparity')
    Synchronized triplets: 0
    Possible issues:
    	* stereo_image_proc is not running.
    	  Does `rosnode info /stereo_view_1568596225043150738` show any connections?
    	* The cameras are not synchronized.
    	  Try restarting stereo_view with parameter _approximate_sync:=True
    	* The network is too slow. One or more images are dropped from each triplet.
    	  Try restarting stereo_view, increasing parameter 'queue_size' (currently 5)
    

    对应的仅启动usb驱动时的rostopiclist结果:

    /rosout
    /rosout_agg
    /stereo/left/camera_info
    /stereo/left/image_raw
    /stereo/left/image_raw/compressed
    /stereo/left/image_raw/compressed/parameter_descriptions
    /stereo/left/image_raw/compressed/parameter_updates
    /stereo/left/image_raw/compressedDepth
    /stereo/left/image_raw/compressedDepth/parameter_descriptions
    /stereo/left/image_raw/compressedDepth/parameter_updates
    /stereo/left/image_raw/theora
    /stereo/left/image_raw/theora/parameter_descriptions
    /stereo/left/image_raw/theora/parameter_updates
    /stereo/right/camera_info
    /stereo/right/image_raw
    /stereo/right/image_raw/compressed
    /stereo/right/image_raw/compressed/parameter_descriptions
    /stereo/right/image_raw/compressed/parameter_updates
    /stereo/right/image_raw/compressedDepth
    /stereo/right/image_raw/compressedDepth/parameter_descriptions
    /stereo/right/image_raw/compressedDepth/parameter_updates
    /stereo/right/image_raw/theora
    /stereo/right/image_raw/theora/parameter_descriptions
    /stereo/right/image_raw/theora/parameter_updates
    

     在启动了stereo_image_proc后的结果:

    /rosout
    /rosout_agg
    /stereo/disparity
    /stereo/left/camera_info
    /stereo/left/image_color
    /stereo/left/image_color/compressed
    /stereo/left/image_color/compressed/parameter_descriptions
    /stereo/left/image_color/compressed/parameter_updates
    /stereo/left/image_color/compressedDepth
    /stereo/left/image_color/compressedDepth/parameter_descriptions
    /stereo/left/image_color/compressedDepth/parameter_updates
    /stereo/left/image_color/theora
    /stereo/left/image_color/theora/parameter_descriptions
    /stereo/left/image_color/theora/parameter_updates
    /stereo/left/image_mono
    /stereo/left/image_mono/compressed
    /stereo/left/image_mono/compressed/parameter_descriptions
    /stereo/left/image_mono/compressed/parameter_updates
    /stereo/left/image_mono/compressedDepth
    /stereo/left/image_mono/compressedDepth/parameter_descriptions
    /stereo/left/image_mono/compressedDepth/parameter_updates
    /stereo/left/image_mono/theora
    /stereo/left/image_mono/theora/parameter_descriptions
    /stereo/left/image_mono/theora/parameter_updates
    /stereo/left/image_raw
    /stereo/left/image_raw/compressed
    /stereo/left/image_raw/compressed/parameter_descriptions
    /stereo/left/image_raw/compressed/parameter_updates
    /stereo/left/image_raw/compressedDepth
    /stereo/left/image_raw/compressedDepth/parameter_descriptions
    /stereo/left/image_raw/compressedDepth/parameter_updates
    /stereo/left/image_raw/theora
    /stereo/left/image_raw/theora/parameter_descriptions
    /stereo/left/image_raw/theora/parameter_updates
    /stereo/left/image_rect
    /stereo/left/image_rect/compressed
    /stereo/left/image_rect/compressed/parameter_descriptions
    /stereo/left/image_rect/compressed/parameter_updates
    /stereo/left/image_rect/compressedDepth
    /stereo/left/image_rect/compressedDepth/parameter_descriptions
    /stereo/left/image_rect/compressedDepth/parameter_updates
    /stereo/left/image_rect/theora
    /stereo/left/image_rect/theora/parameter_descriptions
    /stereo/left/image_rect/theora/parameter_updates
    /stereo/left/image_rect_color
    /stereo/left/image_rect_color/compressed
    /stereo/left/image_rect_color/compressed/parameter_descriptions
    /stereo/left/image_rect_color/compressed/parameter_updates
    /stereo/left/image_rect_color/compressedDepth
    /stereo/left/image_rect_color/compressedDepth/parameter_descriptions
    /stereo/left/image_rect_color/compressedDepth/parameter_updates
    /stereo/left/image_rect_color/theora
    /stereo/left/image_rect_color/theora/parameter_descriptions
    /stereo/left/image_rect_color/theora/parameter_updates
    /stereo/points2
    /stereo/right/camera_info
    /stereo/right/image_color
    /stereo/right/image_color/compressed
    /stereo/right/image_color/compressed/parameter_descriptions
    /stereo/right/image_color/compressed/parameter_updates
    /stereo/right/image_color/compressedDepth
    /stereo/right/image_color/compressedDepth/parameter_descriptions
    /stereo/right/image_color/compressedDepth/parameter_updates
    /stereo/right/image_color/theora
    /stereo/right/image_color/theora/parameter_descriptions
    /stereo/right/image_color/theora/parameter_updates
    /stereo/right/image_mono
    /stereo/right/image_mono/compressed
    /stereo/right/image_mono/compressed/parameter_descriptions
    /stereo/right/image_mono/compressed/parameter_updates
    /stereo/right/image_mono/compressedDepth
    /stereo/right/image_mono/compressedDepth/parameter_descriptions
    /stereo/right/image_mono/compressedDepth/parameter_updates
    /stereo/right/image_mono/theora
    /stereo/right/image_mono/theora/parameter_descriptions
    /stereo/right/image_mono/theora/parameter_updates
    /stereo/right/image_raw
    /stereo/right/image_raw/compressed
    /stereo/right/image_raw/compressed/parameter_descriptions
    /stereo/right/image_raw/compressed/parameter_updates
    /stereo/right/image_raw/compressedDepth
    /stereo/right/image_raw/compressedDepth/parameter_descriptions
    /stereo/right/image_raw/compressedDepth/parameter_updates
    /stereo/right/image_raw/theora
    /stereo/right/image_raw/theora/parameter_descriptions
    /stereo/right/image_raw/theora/parameter_updates
    /stereo/right/image_rect
    /stereo/right/image_rect/compressed
    /stereo/right/image_rect/compressed/parameter_descriptions
    /stereo/right/image_rect/compressed/parameter_updates
    /stereo/right/image_rect/compressedDepth
    /stereo/right/image_rect/compressedDepth/parameter_descriptions
    /stereo/right/image_rect/compressedDepth/parameter_updates
    /stereo/right/image_rect/theora
    /stereo/right/image_rect/theora/parameter_descriptions
    /stereo/right/image_rect/theora/parameter_updates
    /stereo/right/image_rect_color
    /stereo/right/image_rect_color/compressed
    /stereo/right/image_rect_color/compressed/parameter_descriptions
    /stereo/right/image_rect_color/compressed/parameter_updates
    /stereo/right/image_rect_color/compressedDepth
    /stereo/right/image_rect_color/compressedDepth/parameter_descriptions
    /stereo/right/image_rect_color/compressedDepth/parameter_updates
    /stereo/right/image_rect_color/theora
    /stereo/right/image_rect_color/theora/parameter_descriptions
    /stereo/right/image_rect_color/theora/parameter_updates
    /stereo/stereo_image_proc/parameter_descriptions
    /stereo/stereo_image_proc/parameter_updates
    /stereo/stereo_image_proc_debayer_left/parameter_descriptions
    /stereo/stereo_image_proc_debayer_left/parameter_updates
    /stereo/stereo_image_proc_debayer_right/parameter_descriptions
    /stereo/stereo_image_proc_debayer_right/parameter_updates
    /stereo/stereo_image_proc_rectify_color_left/parameter_descriptions
    /stereo/stereo_image_proc_rectify_color_left/parameter_updates
    /stereo/stereo_image_proc_rectify_color_right/parameter_descriptions
    /stereo/stereo_image_proc_rectify_color_right/parameter_updates
    /stereo/stereo_image_proc_rectify_mono_left/parameter_descriptions
    /stereo/stereo_image_proc_rectify_mono_left/parameter_updates
    /stereo/stereo_image_proc_rectify_mono_right/parameter_descriptions
    /stereo/stereo_image_proc_rectify_mono_right/parameter_updates
    

     并且通过rviz可以观察到运行的image_rect,只是没有视差图。

    接下来解决视差图的问题。


    通过查阅相关资料,在该issue中找到了解决办法。其原因可能是使用了remap的缘故,在这里给usb相机的驱动前面加上namespace就可以了,去除最后的remap:

    <launch>
    <group ns="stereo">
      <node name="left" pkg="usb_cam" type="usb_cam_node" output="screen" >
        <param name="video_device" value="/dev/video1" />
        <param name="image_width" value="640" />
        <param name="image_height" value="480" />
        <param name="pixel_format" value="yuyv" />
        <param name="camera_frame_id" value="left" />
        <param name="camera_name" value="left" />
        <param name="io_method" value="mmap"/>
        <param name="framerate" value="30" />
        <!-- file://${ROS_HOME}/camera_info/${NAME}.yaml -->
        <param name="camera_info_url" value="file:///home/nan/dev/cam_ws/src/usb_cam/config/left.yaml"/>
    <!--    <remap from="/left/camera_info" to="/mystereo/left/camera_info"/>
        <remap from="/left/image_raw" to="/mystereo/left/image_raw"/>
    -->
      </node>
    
      <node name="right" pkg="usb_cam" type="usb_cam_node" output="screen" >
        <param name="video_device" value="/dev/video2" />
        <param name="image_width" value="640" />
        <param name="image_height" value="480" />
        <param name="pixel_format" value="yuyv" />
        <param name="camera_frame_id" value="right" />
        <param name="camera_name" value="right" />
        <param name="io_method" value="mmap"/>
        <param name="framerate" value="30" />
        <param name="camera_info_url" value="file:///home/nan/dev/cam_ws/src/usb_cam/config/right.yaml"/>
    <!--    <remap from="/right/camera_info" to="/mystereo/right/camera_info"/>
        <remap from="/right/image_raw" to="/mystereo/right/image_raw"/>
    -->
      </node>
    
      <node name="stereo_image_proc" pkg="stereo_image_proc" type="stereo_image_proc" output="screen">
        <param name="queue_size" value="2000" />
        <param name="approximate_sync" value="True" />
      </node>
    
    
      <!-- <node name="image_view" pkg="image_view" type="image_view" respawn="false" output="screen">
        <remap from="image" to="/usb_cam/image_raw"/>
        <param name="autosize" value="true" />
      </node> -->
    
      </group>
    
      <node name="stereo_cam" pkg="image_view" type="stereo_view" output="screen" >
        <param name="queue_size" value="2000" />
        <remap from="/image" to="/image_rect" />
        <param name="approximate_sync" value="True" />
      </node>
    </launch>
    

    然后就可以正常显示了!


    再次更新:

    目前通过拍摄同一个秒表,可以发现如下情况:

    每获取11帧图像 ,其中会有2帧图像的时间差异明显(大于10ms),显示为相差40ms左右,即相差了一帧图像。如何从软件算法上消除这种影响,是值得后续研究的内容。要不就直接换个可以硬件触发的设备吧...T_T...

    展开全文
  • Matlab 单双目相机标定+畸变校正2019年1月14日 2019年1月19日Matlab 单双目相机标定+畸变校正不管单目双目标定第1第2步都是必须的第3步为单目标定,第4步为双目标定1. 标定板您使用的棋盘图案不得为方形。一侧必须...

    Matlab 单双目相机标定+畸变校正

    2019年1月14日 2019年1月19日

    Matlab 单双目相机标定+畸变校正

    不管单目双目标定第1第2步都是必须的

    第3步为单目标定,第4步为双目标定

    1. 标定板

    您使用的棋盘图案不得为方形。一侧必须包含偶数个正方形,另一侧必须包含奇数个正方形。此条件使应用程序可以确定模式的方向。校准器将长边指定为x方向。

    直接用python生成国际象棋盘格图片再打印到A4纸上做为标定板,生成图片代码如下:

    Python

    import cv2

    import numpy as np

    #A4纸的标准大小为210*297mm,这里大小设为A4的三倍,格子边长为90

    width = 630

    height = 891

    length = 90

    image = np.zeros((height,width),dtype = np.uint8)

    print(image.shape[0],image.shape[1])

    for j in range(height):

    for i in range(width):

    if((int)(i/length) + (int)(j/length))%2:

    image[j,i] = 255;

    cv2.imwrite("chess.jpg",image)

    cv2.imshow("chess",image)

    cv2.waitKey(0)

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15

    16

    17

    importcv2

    importnumpyasnp

    #A4纸的标准大小为210*297mm,这里大小设为A4的三倍,格子边长为90

    width=630

    height=891

    length=90

    image=np.zeros((height,width),dtype=np.uint8)

    print(image.shape[0],image.shape[1])

    forjinrange(height):

    foriinrange(width):

    if((int)(i/length)+(int)(j/length))%2:

    image[j,i]=255;

    cv2.imwrite("chess.jpg",image)

    cv2.imshow("chess",image)

    cv2.waitKey(0)

    2. 拍照

    拍摄图片至少10张,我拍了35张,

    如果你标定的是单摄像头直接拍照就好了,

    如果你标定的是双目摄像头请阅读:

    ————————–

    3. 单目相机标定工具的使用

    ————————–

    打开工具方法有二,方法一:点击app在下拉列表找到“camera Calibrator”

    方法二:直接在MATLAB的Command Window里面输入cameraCalibrator即可调用标定应用

    点击“Add Images”添加我们用摄像头已拍好的照片

    最后会弹出“Checkerboard Square Size”对话框要我们输入标定板上小格子的实际边长

    这步很重要,我这里是用的尺子量的为29mm

    1. camera model : standard(标准) fisheye(鱼眼),我的摄像头是标准。

    2.options:选中径向畸变:“2 coefficients”并且选择偏差:“Skew“和切向畸变:“Tangential Distortion“

    径向畸变:通常,两个系数足以进行校准。对于严重失真,例如在广角镜头中,您可以选择3″“3 coefficients””个系数来包含k3。

    偏差: 选择Compute Skew 复选框时,校准器会估算图像轴偏斜。某些相机传感器包含缺陷,导致图像的x轴和y轴不垂直。您可以使用skew参数对此缺陷进行建模。如果不选中该复选框,则假定图像轴是垂直的,大多数现代相机都是这种情况。

    切向畸变: 当镜头和图像平面不平行时,发生切向畸变。切向失真系数模拟了这种类型的失真:

    综上所述,我的选项为:

    径向畸变:“2 coefficients” 因为我的单目摄像头不是广角

    偏差:“Skew”因为我的单目摄像头是老旧的那种

    切向畸变:”Tangential Distortion” 因为我拍照时是用手拿的摄像头很难和标定板平行

    关于畸变可参考:

    3.然后点击Calibrate等待一段时间即可完成标定

    4.点击show Undistorted即可看到无畸变的图像,点击Export Camera Parameters就可以导出数据,最后记得点击Save Session可保存整个工程*.mat

    导出数据后可以退出标定应用,在MATLAB主界面中的命令窗口可以查看到如下数据(或在右边的工作区双击“cameraParameters”查看):

    >>

    cameraParams =

    cameraParameters - 属性:

    Camera Intrinsics

    IntrinsicMatrix: [3×3 double]

    FocalLength: [762.6390 758.8221]

    PrincipalPoint: [314.3942 242.9882]

    Skew: 0.6420

    RadialDistortion: [-0.3241 0.2864]

    TangentialDistortion: [0.0082 -5.6938e-04]

    ImageSize: [480 640]

    Camera Extrinsics

    RotationMatrices: [3×3×35 double]

    TranslationVectors: [35×3 double]

    Accuracy of Estimation

    MeanReprojectionError: 0.1202

    ReprojectionErrors: [54×2×35 double]

    ReprojectedPoints: [54×2×35 double]

    Calibration Settings

    NumPatterns: 35

    WorldPoints: [54×2 double]

    WorldUnits: 'millimeters'

    EstimateSkew: 1

    NumRadialDistortionCoefficients: 2

    EstimateTangentialDistortion: 1

    estimationErrors =

    cameraCalibrationErrors - 属性:

    IntrinsicsErrors: [1×1 intrinsicsEstimationErrors]

    ExtrinsicsErrors: [1×1 extrinsicsEstimationErrors]

    >>

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15

    16

    17

    18

    19

    20

    21

    22

    23

    24

    25

    26

    27

    28

    29

    30

    31

    32

    33

    34

    35

    36

    37

    38

    39

    40

    41

    >>

    cameraParams=

    cameraParameters-属性:

    CameraIntrinsics

    IntrinsicMatrix:[3×3double]

    FocalLength:[762.6390758.8221]

    PrincipalPoint:[314.3942242.9882]

    Skew:0.6420

    RadialDistortion:[-0.32410.2864]

    TangentialDistortion:[0.0082-5.6938e-04]

    ImageSize:[480640]

    CameraExtrinsics

    RotationMatrices:[3×3×35double]

    TranslationVectors:[35×3double]

    AccuracyofEstimation

    MeanReprojectionError:0.1202

    ReprojectionErrors:[54×2×35double]

    ReprojectedPoints:[54×2×35double]

    CalibrationSettings

    NumPatterns:35

    WorldPoints:[54×2double]

    WorldUnits:'millimeters'

    EstimateSkew:1

    NumRadialDistortionCoefficients:2

    EstimateTangentialDistortion:1

    estimationErrors=

    cameraCalibrationErrors-属性:

    IntrinsicsErrors:[1×1intrinsicsEstimationErrors]

    ExtrinsicsErrors:[1×1extrinsicsEstimationErrors]

    >>

    ————————–

    4. 双目相机标定工具的使用

    ————————–

    打开立体相机校准器

    MATLAB工具条:在“ app”选项卡上的“ 图像处理和计算机视觉”部分中,单击“ Stereo Camera Calibrator”图标。

    MATLAB命令提示符:输入 stereoCameraCalibrator

    如下图1为相机镜头1拍摄的图片目录,2为相机镜头2拍摄的图片目录,3为标定板小格子实际边长

    其他选项:

    径向畸变:“2 coefficients” 因为我的单目摄像头不是广角

    偏差:“Skew”因为我的双目摄像头是现代摄像头所以这一项不选

    切向畸变:”Tangential Distortion” 因为我拍照时是用手拿的摄像头很难和标定板平行

    然后点击Calibrate等待一段时间即可完成标定,点击Export Camera Parameters就可以导出数据,最后记得点击Save Session可保存整个工程*.mat

    stereoParams =

    stereoParameters - 属性:

    Parameters of Two Cameras

    CameraParameters1: [1×1 cameraParameters]

    CameraParameters2: [1×1 cameraParameters]

    Inter-camera Geometry

    RotationOfCamera2: [3×3 double]

    TranslationOfCamera2: [-62.0630 -1.3048 9.7289]

    FundamentalMatrix: [3×3 double]

    EssentialMatrix: [3×3 double]

    Accuracy of Estimation

    MeanReprojectionError: 0.1107

    Calibration Settings

    NumPatterns: 93

    WorldPoints: [54×2 double]

    WorldUnits: 'millimeters'

    estimationErrors =

    stereoCalibrationErrors - 属性:

    Camera1IntrinsicsErrors: [1×1 intrinsicsEstimationErrors]

    Camera1ExtrinsicsErrors: [1×1 extrinsicsEstimationErrors]

    Camera2IntrinsicsErrors: [1×1 intrinsicsEstimationErrors]

    RotationOfCamera2Error: [2.4278e-04 3.9806e-04 2.4674e-05]

    TranslationOfCamera2Error: [0.1999 0.1391 1.0925]

    >>

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15

    16

    17

    18

    19

    20

    21

    22

    23

    24

    25

    26

    27

    28

    29

    30

    31

    32

    33

    34

    stereoParams=

    stereoParameters-属性:

    ParametersofTwoCameras

    CameraParameters1:[1×1cameraParameters]

    CameraParameters2:[1×1cameraParameters]

    Inter-cameraGeometry

    RotationOfCamera2:[3×3double]

    TranslationOfCamera2:[-62.0630-1.30489.7289]

    FundamentalMatrix:[3×3double]

    EssentialMatrix:[3×3double]

    AccuracyofEstimation

    MeanReprojectionError:0.1107

    CalibrationSettings

    NumPatterns:93

    WorldPoints:[54×2double]

    WorldUnits:'millimeters'

    estimationErrors=

    stereoCalibrationErrors-属性:

    Camera1IntrinsicsErrors:[1×1intrinsicsEstimationErrors]

    Camera1ExtrinsicsErrors:[1×1extrinsicsEstimationErrors]

    Camera2IntrinsicsErrors:[1×1intrinsicsEstimationErrors]

    RotationOfCamera2Error:[2.4278e-043.9806e-042.4674e-05]

    TranslationOfCamera2Error:[0.19990.13911.0925]

    >>

    5. 评估校准结果

    通过可视化界面可以查看相机和标定板的距离为2500mm(2.5米)左右

    如果和你的拍摄时实际情况不符请看第6步

    6. 改善校准

    要改进校准,您可以删除高错误图像对,添加更多图像对或修改校准器设置。

    发表评论

    要发表评论,您必须先登录。

    展开全文
  • 双目相机和深度相机

    千次阅读 2019-07-15 16:28:22
    相机可以分为单目相机(Monocular)、双目相机(Stereo)和深度相机(RGB-D)三大类 由于单目相机拍摄的图像只是三维空间的二维投影,所以,如果真想恢复三维结构,必须改变相机的视角。在单目SLAM中也是同样...
  • 视觉SLAM ORB-SLAM2 双目相机实时实验 双目相机矫正 配置文件 博文末尾支持二维码赞赏哦_ 一 ORB-SLAM2 安装 ORBSLAM2在Ubuntu14.04上详细配置流程 参考安装 1 安装必要工具 首先,有两个工具是需要提前安装...
  • matlab工具箱,可完成单目相机的标定、双目相机的标定,调用方便。
  • 这段时间在做双目相机的标定,从MATLAB帮助文档中找到了有关双目相机的标定方法,花了一点时间翻译了一下,希望需要的人能借鉴一下!像很多博文一样,首先要列出原文:...
  • 双目相机采集找票

    2017-08-05 13:32:13
    软件上对双目相机进行图像采集,主要用在相机标定的图像采集过程中
  • 双目相机的标定程序,值得参考。里面还有标定的参考图片
  • 双目相机标定

    2017-12-28 14:07:00
    双目相机标定在OpenCV中提供了示例程序,本来是非常简单的事情,但是当标定自己的双目相机的时候却发现同样的程序最后标出的结果却很差劲,直接表现就是最后进行行对齐的时候获得图像根本不能看,所以从新梳理了双...
  • ZED双目相机开发

    千次阅读 2019-06-02 16:40:13
    ZED双目相机 一、UbuntuSDK安装与运行 Jetson TX2入门之ZED双目摄像头 二、安装ROS包zed-ros-wrapper ros与深度相机入门教程-在ROS使用zed双目相机 编译报错,上一步提示有最新版本,安装最新版SDK后编译通过 ...
  • 双目相机一般由左眼和右眼两个水平放置的相机组成。当然也可以做成上下两个目,但我们见到的主流双目都是做成左右的。在左右双目的相机中,我们可以把两个相机都看作针孔相机。它们是水平放置的,意味两个相机的光圈...
  • 双目相机标定的原理可太多了,反而对于标定结果的解析却很少。在这里对相机的内参和双目标定的内参详细解释。 拍图时要注意:1)双目标定拍照时,要保证标定板精度高,我用的12×9,每个格25mm。 2)标定板图像占...
  • 前言 本博客为主要学习《视觉SLAM十四讲》第5...2、双目相机模型、RGBD相机原理 2、双目相机与RGBD相机对比 1、单目相机模型 1.1 针孔相机模型 1.2 相机畸变 1.3 相机标定(张正友标定) 1.4 鱼眼相机模型 2、立体相...
  • 双目相机标定Matlab

    千次阅读 2019-05-28 13:39:07
    在之前的博客上已经介绍了如何使用opencv进行双目相机的标定,今天使用MATLAB进行双目相机的标定。 首先需要参考这篇博客将双目拍摄的图片分割成左右两部分: ...下面讲解MATLAB双目标定具体过程: ...
  • 双目相机基本概念

    2020-07-23 20:48:22
    双目视觉中有两个摄像机,双目相机标定时不仅需要完成两个单目摄像机的所有标定任务(内参矩阵、畸变系数、外参矩阵),还需要计算与左右两个相机的坐标系变换相关的参数,这个变换同样也是一种刚体变换;...
  • 双目相机标定图片拍摄规范 文章目录双目相机标定图片拍摄规范前言一、双目相机的布置二、标定板的选用三、图片采集的规范四、进行标定的软件(选看)五、靶标布置(选看)总结 前言 相机标定是进行视觉测量和定位...
  • 个人整理的vs2017读取彩色双目相机程序,亲测可用,并带有截图保存功能。欢迎学友相互指教。
  • 01 前言双目相机标定,从广义上讲,其实它包含两个部分内容:两台相机各自误差的标定(单目标定)两台相机之间相互位置的标定(狭义,双目标定)在这里我们所说的双目标定是狭义的,讲解理论的时候仅...
  • 双目相机标定matlab

    2020-03-15 17:53:48
    首先要有一个双目相机,我的是一个vr眼镜。 1.1采集图片 采集过程中要使棋盘格尽量大的呈现再图片中,之后需要将图片分割成左相机和右相机图片。 1.2 图片分割 这里我采用python import cv2 import os path = r'./...
  • 相机模型(二):双目相机 双目测距原理 摘自论文:(自己敲实在太费时费力啦) [1]徐宽. 融合IMU信息的双目视觉SLAM研究[D].哈尔滨工业大学,2018.
  • 双目相机计算稠密深度点云(一)

    万次阅读 多人点赞 2020-08-28 14:57:59
    这篇博客主要记录如何使用双目相机计算点云数据 双目计算深度点云的ROS包有两个: stereo_image_proc 和 LIBELAS(: Library for Efficient Large-scale Stereo Matching)两个库,其中LIBELAS提供了一个ROS环境下的...
  • 双目视觉的目标测距主要任务为利用双目相机完成对场景中物体或障碍物距离的计算,提供场景深度信息。 双目视觉的目标测距流程主要包括以下几个步骤:图像的获取、图像的矫正、立体匹配和距离计算。其中立体匹配是...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 2,081
精华内容 832
关键字:

双目相机