Avoid division by zero in jacobian calculation
							parent
							
								
									1640f172e6
								
							
						
					
					
						commit
						8df2c70866
					
				|  | @ -76,28 +76,32 @@ Point2 Cal3Fisheye::uncalibrate(const Point2& p, OptionalJacobian<2, 9> H1, | ||||||
| 
 | 
 | ||||||
|   // Derivative for points in intrinsic coords (2 by 2)
 |   // Derivative for points in intrinsic coords (2 by 2)
 | ||||||
|   if (H2) { |   if (H2) { | ||||||
|     const double dtd_dt = |     if (r2==0) { | ||||||
|         1 + 3 * k1_ * t2 + 5 * k2_ * t4 + 7 * k3_ * t6 + 9 * k4_ * t8; |       *H2 = DK; | ||||||
|     const double dt_dr = 1 / (1 + r2); |     } else { | ||||||
|     const double rinv = 1 / r; |       const double dtd_dt = | ||||||
|     const double dr_dxi = xi * rinv; |           1 + 3 * k1_ * t2 + 5 * k2_ * t4 + 7 * k3_ * t6 + 9 * k4_ * t8; | ||||||
|     const double dr_dyi = yi * rinv; |       const double dt_dr = 1 / (1 + r2); | ||||||
|     const double dtd_dxi = dtd_dt * dt_dr * dr_dxi; |       const double rinv = 1 / r; | ||||||
|     const double dtd_dyi = dtd_dt * dt_dr * dr_dyi; |       const double dr_dxi = xi * rinv; | ||||||
|  |       const double dr_dyi = yi * rinv; | ||||||
|  |       const double dtd_dxi = dtd_dt * dt_dr * dr_dxi; | ||||||
|  |       const double dtd_dyi = dtd_dt * dt_dr * dr_dyi; | ||||||
| 
 | 
 | ||||||
|     const double td = t * K.dot(T); |       const double td = t * K.dot(T); | ||||||
|     const double rrinv = 1 / r2; |       const double rrinv = 1 / r2; | ||||||
|     const double dxd_dxi = |       const double dxd_dxi = | ||||||
|         dtd_dxi * dr_dxi + td * rinv - td * xi * rrinv * dr_dxi; |           dtd_dxi * dr_dxi + td * rinv - td * xi * rrinv * dr_dxi; | ||||||
|     const double dxd_dyi = dtd_dyi * dr_dxi - td * xi * rrinv * dr_dyi; |       const double dxd_dyi = dtd_dyi * dr_dxi - td * xi * rrinv * dr_dyi; | ||||||
|     const double dyd_dxi = dtd_dxi * dr_dyi - td * yi * rrinv * dr_dxi; |       const double dyd_dxi = dtd_dxi * dr_dyi - td * yi * rrinv * dr_dxi; | ||||||
|     const double dyd_dyi = |       const double dyd_dyi = | ||||||
|         dtd_dyi * dr_dyi + td * rinv - td * yi * rrinv * dr_dyi; |           dtd_dyi * dr_dyi + td * rinv - td * yi * rrinv * dr_dyi; | ||||||
| 
 | 
 | ||||||
|     Matrix2 DR; |       Matrix2 DR; | ||||||
|     DR << dxd_dxi, dxd_dyi, dyd_dxi, dyd_dyi; |       DR << dxd_dxi, dxd_dyi, dyd_dxi, dyd_dyi; | ||||||
| 
 | 
 | ||||||
|     *H2 = DK * DR; |       *H2 = DK * DR; | ||||||
|  |     } | ||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
|   return uv; |   return uv; | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue