94 lines
		
	
	
		
			3.2 KiB
		
	
	
	
		
			C++
		
	
	
			
		
		
	
	
			94 lines
		
	
	
		
			3.2 KiB
		
	
	
	
		
			C++
		
	
	
/*
 | 
						|
 * SimpleCamera.cpp
 | 
						|
 *
 | 
						|
 *  Created on: Aug 16, 2009
 | 
						|
 *      Author: dellaert
 | 
						|
 */
 | 
						|
 | 
						|
#include "SimpleCamera.h"
 | 
						|
#include "CalibratedCamera.h"
 | 
						|
 | 
						|
using namespace std;
 | 
						|
 | 
						|
namespace gtsam {
 | 
						|
 | 
						|
	/* ************************************************************************* */
 | 
						|
 | 
						|
	SimpleCamera::SimpleCamera(const Cal3_S2& K,
 | 
						|
			const CalibratedCamera& calibrated) :
 | 
						|
		calibrated_(calibrated), K_(K) {
 | 
						|
	}
 | 
						|
 | 
						|
	SimpleCamera::SimpleCamera(const Cal3_S2& K, const Pose3& pose) :
 | 
						|
		calibrated_(pose), K_(K) {
 | 
						|
	}
 | 
						|
 | 
						|
	SimpleCamera::~SimpleCamera() {
 | 
						|
	}
 | 
						|
 | 
						|
	pair<Point2, bool> SimpleCamera::projectSafe(const Point3& P) const {
 | 
						|
		Point3 cameraPoint = transform_to(calibrated_.pose(), P);
 | 
						|
		Point2 intrinsic = project_to_camera(cameraPoint);
 | 
						|
		Point2 projection = uncalibrate(K_, intrinsic);
 | 
						|
		return pair<Point2, bool>(projection, cameraPoint.z() > 0);
 | 
						|
	}
 | 
						|
 | 
						|
	Point2 SimpleCamera::project(const Point3 & P) const {
 | 
						|
		pair<Point2, bool> projected = projectSafe(P);
 | 
						|
		return projected.first;
 | 
						|
	}
 | 
						|
 | 
						|
	SimpleCamera SimpleCamera::level(const Cal3_S2& K, const Pose2& pose2, double height) {
 | 
						|
		return SimpleCamera(K, CalibratedCamera::level(pose2, height));
 | 
						|
	}
 | 
						|
 | 
						|
	/* ************************************************************************* */
 | 
						|
	// measurement functions and derivatives
 | 
						|
	/* ************************************************************************* */
 | 
						|
 | 
						|
	pair<Point2, bool> projectSafe(const SimpleCamera& camera, const Point3& point) {
 | 
						|
		return camera.projectSafe(point);
 | 
						|
	}
 | 
						|
 | 
						|
	Point2 project(const SimpleCamera& camera, const Point3& point) {
 | 
						|
		return camera.project(point);
 | 
						|
	}
 | 
						|
 | 
						|
	/* ************************************************************************* */
 | 
						|
	Matrix Dproject_pose(const SimpleCamera& camera, const Point3& point) {
 | 
						|
		Point2 intrinsic = project(camera.calibrated_, point);
 | 
						|
		Matrix D_intrinsic_pose = Dproject_pose(camera.calibrated_, point);
 | 
						|
		Matrix D_projection_intrinsic = Duncalibrate2(camera.K_, intrinsic);
 | 
						|
		Matrix D_projection_pose = D_projection_intrinsic * D_intrinsic_pose;
 | 
						|
		return D_projection_pose;
 | 
						|
	}
 | 
						|
 | 
						|
	/* ************************************************************************* */
 | 
						|
	Matrix Dproject_point(const SimpleCamera& camera, const Point3& point) {
 | 
						|
		Point2 intrinsic = project(camera.calibrated_, point);
 | 
						|
		Matrix D_intrinsic_point = Dproject_point(camera.calibrated_, point);
 | 
						|
		Matrix D_projection_intrinsic = Duncalibrate2(camera.K_, intrinsic);
 | 
						|
		Matrix D_projection_point = D_projection_intrinsic * D_intrinsic_point;
 | 
						|
		return D_projection_point;
 | 
						|
	}
 | 
						|
 | 
						|
	/* ************************************************************************* */
 | 
						|
	Point2 Dproject_pose_point(const SimpleCamera& camera, const Point3& point,
 | 
						|
			Matrix& D_projection_pose, Matrix& D_projection_point) {
 | 
						|
 | 
						|
		Point2 intrinsic = project(camera.calibrated_, point);
 | 
						|
		Matrix D_intrinsic_pose = Dproject_pose(camera.calibrated_, point);
 | 
						|
		Matrix D_intrinsic_point = Dproject_point(camera.calibrated_, point);
 | 
						|
 | 
						|
		Point2 projection = uncalibrate(camera.K_, intrinsic);
 | 
						|
		Matrix D_projection_intrinsic = Duncalibrate2(camera.K_, intrinsic);
 | 
						|
 | 
						|
		D_projection_pose = D_projection_intrinsic * D_intrinsic_pose;
 | 
						|
		D_projection_point = D_projection_intrinsic * D_intrinsic_point;
 | 
						|
 | 
						|
		return projection;
 | 
						|
	}
 | 
						|
 | 
						|
/* ************************************************************************* */
 | 
						|
}
 |