project_to_camera for Unit3 (points at infinity)

release/4.3a0
dellaert 2015-03-05 20:26:47 -08:00
parent 95e00d3052
commit f3f09b17a7
3 changed files with 40 additions and 3 deletions

View File

@ -94,6 +94,19 @@ Point2 PinholeBase::project_to_camera(const Point3& pc,
return Point2(u, v);
}
/* ************************************************************************* */
Point2 PinholeBase::project_to_camera(const Unit3& pc,
OptionalJacobian<2, 2> Dpoint) {
if (Dpoint) {
Matrix32 Dpoint3_pc;
Matrix23 Duv_point3;
Point2 uv = project_to_camera(pc.point3(Dpoint3_pc), Duv_point3);
*Dpoint = Duv_point3 * Dpoint3_pc;
return uv;
} else
return project_to_camera(pc.point3());
}
/* ************************************************************************* */
pair<Point2, bool> PinholeBase::projectSafe(const Point3& pw) const {
const Point3 pc = pose().transform_to(pw);

View File

@ -167,6 +167,14 @@ public:
static Point2 project_to_camera(const Point3& pc, //
OptionalJacobian<2, 3> Dpoint = boost::none);
/**
* Project from 3D point at infinity in camera coordinates into image
* Does *not* throw a CheiralityException, even if pc behind image plane
* @param pc point in camera coordinates
*/
static Point2 project_to_camera(const Unit3& pc, //
OptionalJacobian<2, 2> Dpoint = boost::none);
/// Project a point into the image and check depth
std::pair<Point2, bool> projectSafe(const Point3& pw) const;

View File

@ -88,12 +88,28 @@ TEST( CalibratedCamera, project)
}
/* ************************************************************************* */
static Point2 project_to_camera1(const Point3& point) {
return PinholeBase::project_to_camera(point);
}
TEST( CalibratedCamera, Dproject_to_camera1) {
Point3 pp(155,233,131);
Point3 pp(155, 233, 131);
Matrix test1;
CalibratedCamera::project_to_camera(pp, test1);
Matrix test2 = numericalDerivative11<Point2,Point3>(
boost::bind(CalibratedCamera::project_to_camera, _1, boost::none), pp);
Matrix test2 = numericalDerivative11<Point2, Point3>(project_to_camera1, pp);
CHECK(assert_equal(test1, test2));
}
/* ************************************************************************* */
static Point2 project_to_camera2(const Unit3& point) {
return PinholeBase::project_to_camera(point);
}
TEST( CalibratedCamera, Dproject_to_cameraInfinity) {
Unit3 pp(0, 0, 1000);
Matrix test1;
CalibratedCamera::project_to_camera(pp, test1);
Matrix test2 = numericalDerivative11<Point2, Unit3>(project_to_camera2, pp);
CHECK(assert_equal(test1, test2));
}