精华内容
下载资源
问答
  • 单目视觉程序 通过对摄像机进行简单标定求出世界坐标犀利图像坐标系转换的必要参数,进而实现对固定平面内物体的位置定位及长度测量。针对该方法的特点,本文选取了4个点为标定点.
  • 单目视觉定位测距的两种方式

    万次阅读 多人点赞 2017-05-05 16:12:55
    单目定位双目定位的选择,我觉得主要还是成本和时间的考虑。之前也尝试过双目定位,感觉要更精准些,但双目测距需要对两幅图像进行图像变换和极线匹配,稍微耗时了一些。这几天尝试了一下单摄像头进行测距定位,...

      单目定位和双目定位的选择,我觉得主要还是成本和时间的考虑。之前也尝试过双目定位,感觉要更精准些,但双目测距需要对两幅图像进行图像变换和极线匹配,稍微耗时了一些。这几天尝试了一下单摄像头进行测距定位,主要有两个思路:
      1.定位测量插值得到每个像素的实际坐标  
      该方法总觉得有很大的问题:一个是摄像头安装后就必须固定不动,稍微的旋转都会导致之间测量的像素点对应的坐标偏移。另一个是人工测量的工程量之大,对于1024*1280像素的摄像头,准确的测量就应该是130万个点,而就算我们按米来分割地面,10*20m2的地面也要测量200个点,就算可以通过算法自动识别,做200个标志就算测量画线也是令人头疼的。考虑到针孔成像模型的等比例放大,我们通过直接打印布满等距阵列圆点的纸来进行测量。
      其原理如下:
            几何
      根据相似三角形的等比例关系,有:

    EGBD=AGAD  

    GFDC=AGAD  
       
      同时又有:
    EGEB=AEAB  
      
      通过等式传递有:
    EGBD=GFDC=AEAB  
      

      如此一来,可以在较高距离测量等距阵列点(如标定板),经过插值,再进行等比例放大即可得到每个像素点对应的实际地面的坐标。
      
      处理的示意图如下:


    几何

      这样操作可以省去人工在地面测量绘画标志。测量好纸上的点距后再进行H/h的放大就可以得到像素对应实际地面的坐标。但实际操作过程中遇到的问题是图像上边缘的梯形失真过于严重,导致打印纸上的标志点不容易识别,因此还需要准备不同距离的等距阵列圆点图。

      2.根据相似三角比例计算出对应像素点的实际坐标  
      这个方法对摄像机标定的要求比较高,同时要求镜头本身造成的畸变就比较小,但总体来说这种方法的可移植性和实用性都较强。其主要的思路还是小孔成像的模型。
       模型一:假设测量的点都在Y轴上,此时无X轴分量  
    这里写图片描述
      该图主要有三个坐标系,分别是图像坐标系 UO1V ,以 O2 为原点的摄像机坐标系,世界坐标系 XO3Y 。(相关的内容我就不复述了,不懂的百度和知乎上都有,搜搜相机标定的知识)
      我们可以看到,世界坐标中的点通过光轴成像在图像坐标的点是成比例的,其比例媒介就是相机镜头中心在图像上的像素点O1与其在世界坐标中的实际点M,通过推导可以求解 O3P 的长度。(注意,由于相机安装一般都有误差,所以镜头中心点不一定是图像的中点,所以ucenter,vcenter不一定为0) 

      一步步推导如下:
      已知量:摄像机高度H
          图像坐标中心对应的世界坐标点与摄像头在y轴上的距离 O3M
          镜头中心点的图像坐标 (ucentervcenter)
          测量像素点的图像坐标 P1(u0       
          实际像素的长度xpix
          实际像素的宽度ypix。
          摄像头焦距f
          (镜头中心点图像坐标,焦距,像素长宽都可以由标定直接求解出来,通过halcon的标定助手可以很容易的得到,openCV也有相应的程序)
           α=arctan(HO3M)

           γ=arctan(O1P1×ypixf)=(vvcenter)ypixf

           β=αγ

           O3P=Htan(β)
      
      这样就可以得到垂直方向的坐标  Y=O3P
      
       模型二:假设测量的点有X轴、Y轴分量  

      针对以下模型图我们将进行说明:
    这里写图片描述
      一步步推导如下:
      已知量:摄像机高度H
          图像坐标中心对应的世界坐标点与摄像头在y轴上的距离 O3M
          镜头中心点的图像坐标 O1(ucentervcenter)
          测量像素点的图像坐标 P1(u0Q1uv       
          实际像素的长度xpix
          实际像素的宽度ypix
          摄像头焦距f
    (y轴方向计算和上一个模型相同,x轴计算是y轴坐标通过比例计算得到)
           α=arctan(HO3M)

           γ=arctan(O1P1×ypixf)=(vvcenter)ypixf

           β=αγ

           O3P=Htan(β)
      
      这样就可以得到垂直方向的坐标  Y=O3P

           O2P1=(vvcenter)xpix)2+f2

           O2P=Hsin(β)

      由 PQP1Q1=O2PO2P1  得到  PQ=O2P×P1Q1O2P1
      
      这样就可以得到垂直方向的坐标  X=PQ
       模型三:假设测量的点有X轴、Y轴分量,且物体有高度h    
      
      针对以下模型图我们将进行说明:
    这里写图片描述
      由于物体有高度,因此还需要进行一个投影变换,其实也还是相似变换 
      
      设真实的坐标 (X,Y) ,模型二求出的坐标 (X,Y)
      
      则 (X,Y)=(X,Y)×(1hH)
       模型评价    

      实际操作过程中,发现该模型在畸变较小的图像中误差较小,且在矫正畸变后的图像中测量的图像坐标可以得到更准确的值。另一方面,在实际操作过程中,发现由于镜头有稍微歪曲或者内置感光区域安装歪了,可能导致我们找不到真正的X,Y轴,所以在测量验证的时候会有稍许误差,但即便如此,在10米的定位下,误差也不到5%,效果还是可以接受的。如果有人知道如何找到真正的X,Y轴,请博客留言告知一下,先谢谢了。

    展开全文
  • OpenCV单目视觉定位(测量),能检测识别出自定义的物体标签,并计算出自定义物体距离摄像头光心的X,Y方向距离, 用于无人机/机器人视觉定位
  • 单目/双目与imu的融合(一)

    千次阅读 2017-05-25 14:14:36
    目前单目slam存在初始化的尺度问题和追踪的尺度漂移问题,而双目也存在精度不高和鲁棒性不好的问题。针对这些问题,提出了融合imu的想法。 那么imu的作用是什么呢? 单目 (1)解决初始化尺度问题 (2)追踪中提供...

    目前单目slam存在初始化的尺度问题和追踪的尺度漂移问题,而双目也存在精度不高和鲁棒性不好的问题。针对这些问题,提出了融合imu的想法。

    那么imu的作用是什么呢?

    单目

    (1)解决初始化尺度问题

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

    (3)提供重力方向

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

    双目

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

    (2)提供重力方向

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

    目前做这方面融合论文很多,但开源的比较少,这里给出几个比较好的开源code和论文

    开源code:

    (1)imu和单目的数据融合开源代码(EKF)

    https://github.com/ethz-asl/rovio

    (2)imu和单目的数据融合开源代码

    https://github.com/ethz-asl/okvis_ros(非线性优化)

    (3)orbslam+imu(立体相机)

    https://github.com/JzHuai0108/ORB_SLAM

    论文:

    (1)Keyframe-based visual–inertial odometry(okvis的论文)

    (2) IMU Preintegration on Manifold for Efficient Visual-Inertial Maximum-a-Posteriori Estimation(预积分)

    (3)Visual-Inertial Monocular SLAM with Map Reuse (orb+imu)

    (4)Robust Visual Inertial Odometry Using a Direct EKF-Based Approach(eth的rovio)

    (5)On-Manifold Preintegration for Real-Time Visual-Inertial Odometry(gtsam)

    由于是初学比较详细看得就是以上5篇,而且自认为还不错的论文。

    本人研究的是基于非线性优化的视觉和imu融合的算法研究,那么这里先引出融合的方式:

    滤波方法:

    (1)紧耦合

    (2)松耦合

    非线性优化:

    (1)紧耦合(本人研究方向)

    (2)松耦合

    imu'和视觉是怎样融合的呢?

    仅仅视觉的时候我们优化的只是重投影误差项:

    以上的公式我就不解释了。

    而imu+视觉优化的是重投影误差项+imu的时间误差项:

    其中imu时间误差项:

    其中为:


    这里:imu时间误差项要求的主要有5个变量:eR,ev,ep,eb,W。即求(R ,v,p,b,W)

    这里先给出一张非线性优化视觉+imu融合的图:

    下面我们就开始用与积分的方式求以上的6个变量,下面给出预积分的code

    1. Eigen::Matrix4d Tracking::propagate(const double time_frame)  
    2. {  
    3.     bool is_meas_good=getObservation(time_frame);  
    4.     assert(is_meas_good);  
    5.     time_pair[0]=time_pair[1];  
    6.     time_pair[1]=time_frame;  
    7.     Eigen::Vector3d tempVs0inw;  
    8.     Eigen::Matrix<double, 15,15>* holder=NULL;  
    9.     if(bPredictCov)  
    10.         holder= &P_;  
    11.     predictStates(T_s1_to_w, speed_bias_1, time_pair,  
    12.                                  measurement, imu_.gwomegaw, imu_.q_n_aw_babw,  
    13.                                  &pred_T_s2_to_w, &tempVs0inw);  
    14.     pred_speed_bias_2.head<3>()=tempVs0inw;//速度偏差  
    15.     pred_speed_bias_2.tail<6>()=speed_bias_1.tail<6>();     //biases do not change in propagation  
    16.    Eigen::Matrix4d pred_Tr_delta=pred_T_s2_to_w*imu_.T_imu_from_cam;//camera-imu-world(矩阵的乘法从左开始)  
    17.    cam_to_w=pred_Tr_delta;  
    18.    pred_Tr_delta=pred_Tr_delta.inverse()*(T_s1_to_w*imu_.T_imu_from_cam);//由imu计算(预测)上一帧-》当前帧的变换关  
    19.   // T_s1_to_w=pred_T_s2_to_w;  
    20.    speed_bias_1=pred_speed_bias_2;  
    21.    return pred_Tr_delta;  
    22. }  
    1. void Tracking::predictStates(const Eigen::Matrix4d  &T_sk_to_w, const Eigen::Matrix<double, 9,1>& speed_bias_k,  
    2.                    const double * time_pair,  
    3.                    std::vector<Eigen::Matrix<double, 7,1> >& measurements, const Eigen::Matrix<double, 6,1> & gwomegaw,  
    4.                    const Eigen::Matrix<double, 12, 1>& q_n_aw_babw,  
    5.                    Eigen::Matrix4d  * pred_T_skp1_to_w, Eigen::Matrix<double, 3,1>* pred_speed_kp1,  
    6.                    Eigen::Matrix<double, 15,15> *covariance,  
    7.                    Eigen::Matrix<double, 15,15>  *jacobian)  
    8. {  
    9.     double time=time_pair[0],end = time_pair[1];  
    10.     // the eventual covariance has little to do with this param as long as it remains small  
    11.     Eigen::Matrix<double, 3,1>  r_0(T_sk_to_w.topRightCorner<3, 1>());  
    12.     Eigen::Matrix<double,3,3> C_WS_0(T_sk_to_w.topLeftCorner<3, 3>());  
    13.     Eigen::Quaternion<double>  q_WS_0(C_WS_0);  
    14.   
    15.     Eigen::Quaterniond Delta_q(1,0,0,0);  
    16.     Eigen::Matrix3d C_integral = Eigen::Matrix3d::Zero();  
    17.     Eigen::Matrix3d C_doubleintegral = Eigen::Matrix3d::Zero();  
    18.     Eigen::Vector3d acc_integral = Eigen::Vector3d::Zero();  
    19.     Eigen::Vector3d acc_doubleintegral = Eigen::Vector3d::Zero();  
    20.   
    21.     Eigen::Matrix3d cross = Eigen::Matrix3d::Zero();  
    22.   
    23.     // sub-Jacobians  
    24.     Eigen::Matrix3d dalpha_db_g = Eigen::Matrix3d::Zero();  
    25.     Eigen::Matrix3d dv_db_g = Eigen::Matrix3d::Zero();  
    26.     Eigen::Matrix3d dp_db_g = Eigen::Matrix3d::Zero();  
    27.   
    28.     // the Jacobian of the increment (w/o biases)  
    29.     Eigen::Matrix<double,15,15> P_delta = Eigen::Matrix<double,15,15>::Zero();  
    30.     double Delta_t = 0;  
    31.     bool hasStarted = false;  
    32.     int i = 0;  
    33.     for (int it=0;it<measurements.size();it++)  
    34.     {  
    35.         Eigen::Vector3d omega_S_0 =measurements[it].block<3,1>(4,0);//角速度  
    36.         Eigen::Vector3d acc_S_0 = measurements[it].block<3,1>(1,0);//线加速度  
    37.         Eigen::Vector3d omega_S_1 = measurements[it+1].block<3,1>(4,0);  
    38.         Eigen::Vector3d acc_S_1 = measurements[it+1].block<3,1>(1,0);  
    39.         ave_omega_S=ave_omega_S+omega_S_0;  
    40.         ave_omega_S=ave_omega_S/(it+1);  
    41.         // time delta  
    42.         double nexttime;  
    43.        if ((it + 1) == (measurements.size()-1)) {  
    44.           nexttime = end;  
    45.         }  
    46.         else  
    47.           nexttime =measurements [it + 1][0];  
    48.         double dt = (nexttime - time);  
    49.   
    50.         if ( end < nexttime) {  
    51.           double interval = (nexttime - measurements[it][0]);  
    52.           nexttime = end;  
    53.           dt = (nexttime - time);  
    54.           const double r = dt / interval;  
    55.           omega_S_1 = ((1.0 - r) * omega_S_0 + r * omega_S_1).eval();  
    56.           acc_S_1 = ((1.0 - r) * acc_S_0 + r * acc_S_1).eval();  
    57.         }  
    58.       /* if ( it+1==measurements.size()) { 
    59.           double interval = last_dt; 
    60.           nexttime = end; 
    61.           double dt = (nexttime - time); 
    62.           const double r = dt / interval; 
    63.           omega_S_1 = ((1.0 - r) * omega_S_0 + r * omega_S_1).eval(); 
    64.           acc_S_1 = ((1.0 - r) * acc_S_0 + r * acc_S_1).eval(); 
    65.         } 
    66.         else 
    67.         nexttime =measurements [it + 1][0]; 
    68.           double dt = (nexttime - time);*/  
    69.       if (dt <= 0.0) {  
    70.           continue;  
    71.         }  
    72.         Delta_t += dt;  
    73.   
    74.     if (!hasStarted) {  
    75.       hasStarted = true;  
    76.       const double r = dt / (nexttime -measurements[it][0]);  
    77.       omega_S_0 = (r * omega_S_0 + (1.0 - r) * omega_S_1).eval();//求开始是加权的角速度和线加速度  
    78.       acc_S_0 = (r * acc_S_0 + (1.0 - r) * acc_S_1).eval();  
    79.     }  
    80.     // ensure integrity  
    81.     double sigma_g_c = q_n_aw_babw(3);//Gyroscope noise density.  
    82.     double sigma_a_c = q_n_aw_babw(1);  
    83.     // actual propagation  
    84.     // orientation:  
    85.     Eigen::Quaterniond dq;  
    86.     const Eigen::Vector3d omega_S_true = (0.5*(omega_S_0+omega_S_1) - speed_bias_k.segment<3>(3));//w  
    87.     const double theta_half = omega_S_true.norm() * 0.5 * dt;  
    88.     const double sinc_theta_half = ode(theta_half);  
    89.     const double cos_theta_half = cos(theta_half);  
    90.     dq.vec() = sinc_theta_half * omega_S_true * 0.5 * dt;  
    91.     dq.w() = cos_theta_half;  
    92.     Eigen::Quaterniond Delta_q_1 = Delta_q * dq;  
    93.     // rotation matrix integral:  
    94.     const Eigen::Matrix3d C = Delta_q.toRotationMatrix();  
    95.     const Eigen::Matrix3d C_1 = Delta_q_1.toRotationMatrix();  
    96.     const Eigen::Vector3d acc_S_true = (0.5*(acc_S_0+acc_S_1) - speed_bias_k.segment<3>(6));  
    97.     const Eigen::Matrix3d C_integral_1 = C_integral + 0.5*(C + C_1)*dt;  
    98.     const Eigen::Vector3d acc_integral_1 = acc_integral + 0.5*(C + C_1)*acc_S_true*dt;  
    99.     // rotation matrix double integral:  
    100.     C_doubleintegral += C_integral*dt + 0.25*(C + C_1)*dt*dt;  
    101.     acc_doubleintegral += acc_integral*dt + 0.25*(C + C_1)*acc_S_true*dt*dt;  
    102.     // Jacobian parts  
    103.     dalpha_db_g += dt*C_1;  
    104.     const Eigen::Matrix3d cross_1 = dq.inverse().toRotationMatrix()*cross +  
    105.     okvis::kinematics::rightJacobian(omega_S_true*dt)*dt;  
    106.     const Eigen::Matrix3d acc_S_x = crossMx(acc_S_true);  
    107.     Eigen::Matrix3d dv_db_g_1 = dv_db_g + 0.5*dt*(C*acc_S_x*cross + C_1*acc_S_x*cross_1);  
    108.     dp_db_g += dt*dv_db_g + 0.25*dt*dt*(C*acc_S_x*cross + C_1*acc_S_x*cross_1);  
    109.   
    110.     // covariance propagation  
    111.     if (covariance) {  
    112.       Eigen::Matrix<double,15,15> F_delta = Eigen::Matrix<double,15,15>::Identity();  
    113.       // transform  
    114.       F_delta.block<3,3>(0,3) = -crossMx(acc_integral*dt + 0.25*(C + C_1)*acc_S_true*dt*dt);  
    115.       F_delta.block<3,3>(0,6) = Eigen::Matrix3d::Identity()*dt;  
    116.       F_delta.block<3,3>(0,9) = dt*dv_db_g + 0.25*dt*dt*(C*acc_S_x*cross + C_1*acc_S_x*cross_1);  
    117.       F_delta.block<3,3>(0,12) = -C_integral*dt + 0.25*(C + C_1)*dt*dt;  
    118.       F_delta.block<3,3>(3,9) = -dt*C_1;  
    119.       F_delta.block<3,3>(6,3) = -crossMx(0.5*(C + C_1)*acc_S_true*dt);  
    120.       F_delta.block<3,3>(6,9) = 0.5*dt*(C*acc_S_x*cross + C_1*acc_S_x*cross_1);  
    121.       F_delta.block<3,3>(6,12) = -0.5*(C + C_1)*dt;  
    122.       P_delta = F_delta*P_delta*F_delta.transpose();  
    123.       // add noise. Note that transformations with rotation matrices can be ignored, since the noise is isotropic.  
    124.       //F_tot = F_delta*F_tot;  
    125.       const double sigma2_dalpha = dt * sigma_g_c * sigma_g_c;  
    126.       P_delta(3,3) += sigma2_dalpha;  
    127.       P_delta(4,4) += sigma2_dalpha;  
    128.       P_delta(5,5) += sigma2_dalpha;  
    129.       const double sigma2_v = dt * sigma_a_c * q_n_aw_babw(1);  
    130.       P_delta(6,6) += sigma2_v;  
    131.       P_delta(7,7) += sigma2_v;  
    132.       P_delta(8,8) += sigma2_v;  
    133.       const double sigma2_p = 0.5*dt*dt*sigma2_v;  
    134.       P_delta(0,0) += sigma2_p;  
    135.       P_delta(1,1) += sigma2_p;  
    136.       P_delta(2,2) += sigma2_p;  
    137.       const double sigma2_b_g = dt * q_n_aw_babw(9) * q_n_aw_babw(9);  
    138.       P_delta(9,9)   += sigma2_b_g;  
    139.       P_delta(10,10) += sigma2_b_g;  
    140.       P_delta(11,11) += sigma2_b_g;  
    141.       const double sigma2_b_a = dt * q_n_aw_babw(6) * q_n_aw_babw(6);  
    142.       P_delta(12,12) += sigma2_b_a;  
    143.       P_delta(13,13) += sigma2_b_a;  
    144.       P_delta(14,14) += sigma2_b_a;  
    145.     }  
    146.   
    147.     // memory shift  
    148.     Delta_q = Delta_q_1;  
    149.     C_integral = C_integral_1;  
    150.     acc_integral = acc_integral_1;  
    151.     cross = cross_1;  
    152.     dv_db_g = dv_db_g_1;  
    153.     time = nexttime;  
    154.     interval_time=Delta_t;  
    155.      last_dt=dt;  
    156.   
    157.     ++i;  
    158.   
    159.     if (nexttime == end)  
    160.       break;  
    161.   
    162.   }  
    163. // actual propagation output:  
    164. const Eigen::Vector3d g_W = gwomegaw.head<3>();  
    165. const Eigen::Vector3d  t=r_0+speed_bias_k.head<3>()*Delta_t+ C_WS_0*(acc_doubleintegral)+0.5*g_W*Delta_t*Delta_t;  
    166. const  Eigen::Quaterniond q=q_WS_0*Delta_q;  
    167. (*pred_T_skp1_to_w)=rt_to_T(t,q.toRotationMatrix());  
    168.   
    169. (*pred_speed_kp1)=speed_bias_k.head<3>() + C_WS_0*(acc_integral)+g_W*Delta_t;//???语法曾有错误  
    170. if (jacobian) {  
    171.   Eigen::Matrix<double,15,15> & F = *jacobian;  
    172.   F.setIdentity(); // holds for all states, including d/dalpha, d/db_g, d/db_a  
    173.   F.block<3,3>(0,3) = -okvis::kinematics::crossMx(C_WS_0*acc_doubleintegral);  
    174.   F.block<3,3>(0,6) = Eigen::Matrix3d::Identity()*Delta_t;  
    175.   F.block<3,3>(0,9) = C_WS_0*dp_db_g;  
    176.   F.block<3,3>(0,12) = -C_WS_0*C_doubleintegral;  
    177.   F.block<3,3>(3,9) = -C_WS_0*dalpha_db_g;  
    178.   F.block<3,3>(6,3) = -okvis::kinematics::crossMx(C_WS_0*acc_integral);  
    179.   F.block<3,3>(6,9) = C_WS_0*dv_db_g;  
    180.   F.block<3,3>(6,12) = -C_WS_0*C_integral;  
    181. }  
    182.   
    183. // overall covariance, if requested  
    184. if (covariance) {  
    185.   Eigen::Matrix<double,15,15> & P = *covariance;  
    186.   // transform from local increments to actual states  
    187.   Eigen::Matrix<double,15,15> T = Eigen::Matrix<double,15,15>::Identity();  
    188.   T.topLeftCorner<3,3>() = C_WS_0;  
    189.   T.block<3,3>(3,3) = C_WS_0;  
    190.   T.block<3,3>(6,6) = C_WS_0;  
    191.   P = T * P_delta * T.transpose();  
    192. }  
    193. }  

    以上code来自以下公式:

    其中认为角速度w和加速度a在连续两次imu测量之间是匀速的,因此上式可写成:


    其中上式的角速度和加速度:

    因此最终公式:


    上面公式给出5个变量(R,V,P,b,W)中的3个最重要的变量:R,V,P。

    而偏差变量b我们可以初始化的时候可以设为0(其实最好是要求出来的,这里就不给出推倒公式了)。

    下面的们就是有关W(权重)的公式了。


    其中

    是有关R,P,V,b的协方差矩阵

    到此为止已经把imu时间误差项求完。

    下一篇将是怎样把时间误差项融合到目标函数里(主要是局部地图的优化)


    展开全文
  • 单目双目及深度相机比较

    万次阅读 2019-01-10 21:11:11
    单目双目,深度相机比较 1.mono 优点: 结构简单,成本低 缺点: 在单张图片里,无法确定一个物体的真实大小。它可能是一个很大但很远的物体,也可能是一个很近很小的物体。通过相机的运动形成视差,可以测量...

    单目,双目,深度相机比较
    1.mono
    优点:
    结构简单,成本低,便于标定和识别
    缺点:
    在单张图片里,无法确定一个物体的真实大小。它可能是一个很大但很远的物体,也可能是一个很近很小的物体。通过相机的运动形成视差,可以测量物体相对深度。但是单目SLAM估计的轨迹和地图将与真实的轨迹和地图相差一个因子,也就是尺度(scale),单凭图像无法确定这个真实尺度,所以称尺度不确定性。
    基于单目手眼相机和激光测距仪,提出了一种尺寸未知的空间矩形平面的位姿测量算法

    单目视觉测量的原理和实现方法,得出采用线激光器、单CCD 相机、小孔成像和激光面约束模型的单目视觉测量方法。

    2.stereo
    优点:
    基线距离越大,能够测量的距离就越远;并且可以运用到室内和室外。
    缺点:
    配置与标定较为复杂
    深度量程和精度受到双目基线与分辨率限制
    视差计算非常消耗计算资源,需要GPU/FPGA设备加速
    用两部相机来定位。对物体上一个特征点,用两部固定于不同位置的相机摄得物体的像,分别获得该点在两部相机像平面上的坐标。只要知道两部相机精确的相对位置,就可用几何的方法得到该特征点在固定一部相机的坐标系中的坐标,即确定了特征点的位置。

    3.RGB-D
    通过结构光或ToF(time of fly)的物理方法测量物体深度信息。
    典型代表Kinect/xtion pro/RealSense。
    测量范围窄,噪声大,视野小,易受日光干扰,无法测量透射材质等问题,主要用在室内,室外很难应用。
    所谓的深度相机主要用来三维成像,和距离的测量。

    展开全文
  • 图像双目视觉定位

    千次阅读 2019-01-07 19:14:29
    今天大家分享一下关于图像的双目定位法,对于实际工程有很大参考意义!! 顾名思义:双目定位就是用两部相机来定位。双目定位过程中,两部相机在同一平面上,并且光轴互相平行,就像是人的两只眼睛一样,针对物体...

    今天与大家分享一下关于图像的双目定位法,对于实际工程有很大参考意义!!

    顾名思义:双目定位就是用两部相机来定位。双目定位过程中,两部相机在同一平面上,并且光轴互相平行,就像是人的两只眼睛一样,针对物体上某一个或某些特征点,用两部固定于不同位置的相机摄得物体的像,分别获得该点在两部相机像平面上的坐标。只要知道两部相机精确的相对位置,就可用几何的方法得到该特征点在固定一部相机的坐标系中的坐标,即确定了特征点的位置。

    双目视觉图像定位系统是Microvision(维视图像)开发的一套针对芯片压焊过程中对芯片位置进行识别定位,以便更好的将芯片固化在想要的位置上。双目视觉图像定位系统,双目定位系统利用两台Microvision MV-808H工业相机、VS-M1024工业连续放大变倍镜头、MV-8002两路高清图像采集卡,同时对图像进行获取,在安装中,对芯片点焊位置进行准确定位。

    双目视觉检测系统通过图像分析处理和图像测量的方式精确获取电路板上的安装或加工位置的坐标信息,计算出位置坐标,提供给机械臂运行控制。双目视觉图像定位系统,双目定位广泛用于丝网印刷机械、贴合、切割、PS打孔机、PCB补线机、PCB打孔机、玻璃割片机、点胶机、SMT检测、贴版机等工业精密对位、定位、零件确认、尺寸测量、工业显微等CCD视觉对位、测量装置等领域,主要应用,IC、芯片、电路板的位置识别定位、视觉图像定位系统上。如:打孔机定位、绑定机定位、晶体管吸取定位、IC贴片机对位、机器坐标定位、机器手定位、方向辨别定位。

    双目相机系统主要的任务就是测距,而视差求距离公式是在双目系统处于理想情况下推导的,所以在解算特征点深度信息时需要保证左右摄像机在数学上对准到同一观察平面上。但是在现实的双目立体视觉系统中,是不存在完全共面且行对准的两个摄像机图像平面的。所以对于在单独标定左右两个摄像头之后还需要进行双目立体校正,得到两个摄像头之间的相对位置,从而对双目图像进行共面且行对准。

     

    展开全文
  • 单目视觉定位方法研究综述

    万次阅读 2017-04-18 11:10:07
    根据单目视觉定位所用图像帧数不同把定位方法分为基于单帧图像的定位和基于双帧或多帧图像的定位两类。单帧图像定位常利用已知的点特征、直线特征或曲线特征与其在图像上的投影关系进行定位,其中用点特征和直线特征...
  • 单目定位双目定位的选择,我觉得主要还是成本和时间的考虑。之前也尝试过双目定位,感觉要更精准些,但双目测距需要对两幅图像进行图像变换和极线匹配,稍微耗时了一些。这几天尝试了一下单摄像头进行测距定位,...
  • 单目相机标定与双目相机标定是进行视觉测量,视觉定位的关键步骤之一,对于其具体的理论部分的理解可以参考: https://blog.csdn.net/Kano365/article/details/90721424 ... 这些文章都写的非常好了,因此就不在进行...
  • 众所周知,利用双目摄像头可以方便...为了解决室内移动机器人的实时自定位问题,本文提出了采用单目摄像头对机器人进行室内定位的方法。文中首先分析了世界坐标系、摄像机坐标系、图像坐标系以及计算机像素坐标系之间的
  • 单目视觉的运动目标跟踪定位

    万次阅读 2017-04-12 08:10:00
    欢创科技CEO周琨,详细讲解单目定位技术
  • 单目摄像头: 识别目标 — 测距 需要大量的数据,并且不断更新和维护 应用于自动驾驶的路况判断 双目摄像头: 通过两幅图像的视差计算来确定距离,类似人的双眼,不需要知道障碍物是什么。 靠计算来进行测距,...
  • 无论单目双目还是RGB-D,首先是将从摄像头或者数据集中读入的图像封装成Frame类型对象: 首先都需要将彩色图像处理成灰度图像,继而将图片封装成帧。 (1) 单目 mCurrentFrame = Frame(mImGray, timestamp, ...
  • 针对当前基于单目视觉的室内移动机器人全局定位算法复杂度大等问题,提出一种室内移动机器人双目视觉全局定位方法。双目视觉下,为保证室内移动机器人在运动过程中能够保持稳定的特征提取,提出基于标定板的全局定位...
  • 目前,视觉SLAM(SLAM是“Simultaneous Localization And Mapping”的缩写,可译为同步定位与建图)可分为单目双目(多目)、RGBD这三类,另还有鱼眼、全景等特殊相机,但目前在研究和产品中还属于少数。从实现难度...
  • 项目实战——基于计算机视觉的物体位姿定位及机械臂抓取(单目标定)         请各位读者朋友注意,这里面很多东西涉及到我的毕设,写作辛苦,请勿滥用,转载请务必注明...
  • 下载2 在「3D视觉工坊」公众号后台回复:3D视觉github资源汇总,即可下载包括结构光、标定源码、缺陷检测源码、深度估计深度补全源码、点云处理相关源码、立体匹配源码、单目双目3D检测、基于点云的3D检测、6D...
  • ORB-SLAM2的最大贡献就是把原来的系统扩展到了双目,rgbd上,这一篇也主要讲的是怎么使用双目或者深度相机的信息,以及他们和单目的区别。 I.INTRODUCTION Place Recognition是SLAM中一个对回环很重要的模块,作用...
  • 点击上方“3D视觉工坊”,选择“星标”干货第一时间送达编辑丨当SLAM遇见小王同学声明: 本文只是个人学习记录,侵权可删。论文版权著作权等全归原作者所有,小王自觉遵守《中华人民共和国著作...
  • 点击上方“3D视觉工坊”,选择“星标”干货第一时间送达编辑丨当SLAM遇见小王同学声明: 本文只是个人学习记录,侵权可删。论文版权著作权等全归原作者所有,小王自觉遵守《中华人民共和国著...
  • <p> 单目定位双目定位的选择,我觉得主要还是成本和时间的考虑。之前也尝试过双目定位,感觉要更精准些,但双目测距需要对两幅图像进行图像变换和极线匹配,稍微耗时了一些。这几天尝试了一下单摄像头进行测距...
  • 1、ORB_SLAM2利用笔记本摄像头跑单目 1、下载usb_cam源码并配置环境: cd catkin_ws/src git clone https://github.com/bosch-ros-pkg/usb_cam.git cd .. ctakin_make 注意这里我的catkin_ws是之前编译过的,如果...
  • 摘要----我们提出的ORB-SLAM2是一个完整的SLAM系统,它支持单目双目和RGB-D相机。它包括地图重用、闭环和重定位功能。这个系统可以实时运行在标准版的CPU上,适应于各种场景,从小的便携设备拍摄的室内环境到工业...
  • 同时,单目视觉是其他类型视觉系统的基础,如双目立体视觉、多目视觉等都是在单目视觉系统的基础上,通过附加其他手段和措施而实现的。 双目立体视觉。双目视觉系统由两个摄像机组成,利用三角测量原理获得场景的...
  • ORB-SLAM2 ORB特征点法SLAM 支持单目双目、rgbd相机 安装测试 本文github链接 orbslam2 + imu ORB-SLAM是一个基于特征点的实时单目SLAM系统,在大规模的、小规模的、室内室外的环境都可以运行。 该...
  • 宁远电子提供的人脸识别模组可支持双目摄像头和3D结构光摄像头,在客户咨询中经常有被问到双目的为什么会比单目的成本高,区别在哪里,他们的适用于哪些场景呢?在此,宁远电子技术工程师就为大家详细解析,帮助大家...
  • 计算机双目视觉----摄像机单目标定

    千次阅读 2014-04-07 19:58:17
    一、摄像机单目标定 OpenCV对标定的处理是这样的: 1.打印一幅棋盘图贴到一个平板上,转动该模板,用摄像机拍摄20张(一般多于6张即可,多了结果可以更精确)图片 2.对于每一张图片都用cvFindChessboardCorners提取...
  • #重新打开一个终端,输入: roscore 三个节点的用法 其中注意Stereo节点最后一个参数意为是否矫正,一般设为false就可以了,更深入的细节可以按需查看文档: #单目 Usage: rosrun ORB_SLAM2 Mono path_to_vocabulary ...
  • 单目视觉测距

    2018-04-18 15:36:21
    单目测距是利用一个摄像头进行视频...这一系列动作,涉及到了物体的识别,相机的结构,坐标变换的一些知识,距离的获取是一个很广泛的课题,用摄像头来测距是其中一个方向,包括单目测距、双目测距、结构光测距等方法。

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 3,651
精华内容 1,460
热门标签
关键字:

单目定位与双目定位