00001 /* 00002 * Camera.h 00003 * 00004 * Created on: Oct 17, 2010 00005 * Author: ethan 00006 */ 00007 00008 #ifndef CAMERA_H_ 00009 #define CAMERA_H_ 00010 00011 #include <opencv2/core/core.hpp> 00012 00013 #include <pano_core/pano_interfaces.h> 00014 namespace pano 00015 { 00016 00017 class Camera : public serializable 00018 { 00019 00020 public: 00021 Camera(); 00022 ~Camera(); 00023 00024 explicit Camera(const std::string& camera_file); 00025 00026 void setCameraIntrinsics(const std::string& filename); 00027 void setCameraIntrinsics(const cv::Mat& K, const cv::Mat& D, const cv::Size& img_size); 00028 00029 void initUndistort(); 00030 00031 void undistort(const cv::Mat& image, cv::Mat& uimage) const; 00032 00033 void ptsToRays(const std::vector<cv::Point2f>& pts, std::vector<cv::Point3f>& rays) const; 00034 void raysToPts(const std::vector<cv::Point3f>& rays, std::vector<cv::Point2f>& pts) const; 00035 00036 float fovX() const 00037 { 00038 return fov_x_; 00039 } 00040 float fovY() const 00041 { 00042 return fov_y_; 00043 } 00044 float fov_max() const 00045 { 00046 return fov_x_ < fov_y_ ? fov_y_ : fov_x_; 00047 } 00048 const cv::Size& img_size() const 00049 { 00050 return img_size_; 00051 } 00052 const cv::Mat& K() const 00053 { 00054 return K_; 00055 } 00056 const cv::Mat& Kinv() const 00057 { 00058 return Kinv_; 00059 } 00060 const cv::Mat & D() const 00061 { 00062 return D_; 00063 } 00064 00065 void scale(float x, float y); 00066 /* 00067 * serializable functions 00068 */ 00069 virtual int version() const 00070 { 00071 return 0; 00072 } 00073 00074 void write(const std::string& file_name) const; 00075 virtual void serialize(cv::FileStorage& fs) const; 00076 virtual void deserialize(const cv::FileNode& fn); 00077 00078 static void KtoFOV(const cv::Mat& K, float & fovx, float & fovy); 00079 00080 private: 00081 void setupK(); 00082 cv::Mat K_; 00083 cv::Mat Kinv_; 00084 00085 cv::Mat D_; 00086 00087 cv::Size img_size_; 00088 00089 float fov_x_; 00090 float fov_y_; 00091 00092 cv::Mat P_; 00093 cv::Mat Pinv_; 00094 cv::Mat u_rm1_, u_rm2_; 00095 00096 }; 00097 00098 } 00099 00100 #endif /* CAMERA_H_ */