14 #include <itkMutexLockHolder.h> 19 : m_Valid(false), m_Mutex(
itk::FastMutexLock::New())
63 vnl_matrix_fixed<mitk::ScalarType, 3, 3>
66 vnl_matrix_fixed<mitk::ScalarType, 3, 3> mat;
82 const vnl_matrix_fixed<mitk::ScalarType, 3, 3>& _CameraMatrix )
92 vnl_matrix_fixed<mitk::ScalarType, 3, 4>
95 vnl_matrix_fixed<mitk::ScalarType, 3, 4> mat;
103 ,
const cv::Mat& _DistorsionCoeffs)
107 if( _CameraMatrix.cols != 3 || _CameraMatrix.rows != 3)
108 throw std::invalid_argument(
"Wrong format of camera matrix. Should be 3x3" 112 _DistorsionCoeffs.rows == 1,
"Wrong format of distorsion coefficients" 113 " vector. Should be 5x1 double.");
165 double p1,
double p2 )
200 std::ostringstream s; s.precision(12);
205 s <<
"fx = " << CameraMatrix.at<
double>(0,0);
206 s <<
", fy = " << CameraMatrix.at<
double>(1,1);
207 s <<
", cx = " << CameraMatrix.at<
double>(0,2);
208 s <<
", cy = " << CameraMatrix.at<
double>(1,2);
210 s <<
", k1 = " << DistorsionCoeffs.at<
double>(0,0);
211 s <<
", k2 = " << DistorsionCoeffs.at<
double>(0,1);
212 s <<
", p1 = " << DistorsionCoeffs.at<
double>(0,2);
213 s <<
", p2 = " << DistorsionCoeffs.at<
double>(0,3);
223 std::ostringstream s; s.precision(12);
225 s.str(
""); s << CameraMatrix.at<
double>(0,0);
226 elem->SetAttribute(
"fx", s.str() );
227 s.str(
""); s << CameraMatrix.at<
double>(1,1);
228 elem->SetAttribute(
"fy", s.str() );
229 s.str(
""); s << CameraMatrix.at<
double>(0,2);
230 elem->SetAttribute(
"cx", s.str() );
231 s.str(
""); s << CameraMatrix.at<
double>(1,2);
232 elem->SetAttribute(
"cy", s.str() );
235 s.str(
""); s << DistorsionCoeffs.at<
double>(0,0);
236 elem->SetAttribute(
"k1", s.str() );
237 s.str(
""); s << DistorsionCoeffs.at<
double>(0,1);
238 elem->SetAttribute(
"k2", s.str() );
239 s.str(
""); s << DistorsionCoeffs.at<
double>(0,2);
240 elem->SetAttribute(
"p1", s.str() );
241 s.str(
""); s << DistorsionCoeffs.at<
double>(0,3);
242 elem->SetAttribute(
"p2", s.str() );
243 elem->SetAttribute(
"Valid",
m_Valid);
251 assert( elem->ValueStr() ==
"results" );
252 cv::Mat CameraMatrix = cv::Mat::zeros(3, 3, cv::DataType<double>::type);
253 CameraMatrix.at<
double>(2,2) = 1.0;
254 cv::Mat DistorsionCoeffs = cv::Mat::zeros(1, 5, cv::DataType<double>::type);
256 TiXmlElement* focus_lenXElem = elem->FirstChildElement(
"focus_lenX");
258 CameraMatrix.at<
double>(0,0) = atof( focus_lenXElem->GetText() );
260 TiXmlElement* focus_lenYElem = elem->FirstChildElement(
"focus_lenY");
262 CameraMatrix.at<
double>(1,1) = atof( focus_lenYElem->GetText() );
264 TiXmlElement* PrincipalXElem = elem->FirstChildElement(
"PrincipalX");
266 CameraMatrix.at<
double>(0,2) = atof( PrincipalXElem->GetText() );
268 TiXmlElement* PrincipalYElem = elem->FirstChildElement(
"PrincipalY");
270 CameraMatrix.at<
double>(1,2) = atof( PrincipalYElem->GetText() );
274 TiXmlElement* Dist1Elem = elem->FirstChildElement(
"Dist1");
276 DistorsionCoeffs.at<
double>(0,0) = atof( Dist1Elem->GetText() );
278 TiXmlElement* Dist2Elem = elem->FirstChildElement(
"Dist2");
280 DistorsionCoeffs.at<
double>(0,1) = atof( Dist2Elem->GetText() );
282 TiXmlElement* Dist3Elem = elem->FirstChildElement(
"Dist3");
284 DistorsionCoeffs.at<
double>(0,2) = atof( Dist3Elem->GetText() );
286 TiXmlElement* Dist4Elem = elem->FirstChildElement(
"Dist4");
288 DistorsionCoeffs.at<
double>(0,3) = atof( Dist4Elem->GetText() );
291 elem->QueryIntAttribute(
"Valid", &valid);
295 m_Valid =
static_cast<bool>(valid);
307 std::string filename;
308 if(elem->QueryStringAttribute(
"file", &filename) == TIXML_SUCCESS)
313 else if(strcmp(elem->Value(),
"CalibrationProject") == 0)
323 std::ostringstream err;
325 cv::Mat CameraMatrix = cv::Mat::zeros(3, 3, cv::DataType<double>::type);
326 CameraMatrix.at<
double>(2,2) = 1.0;
328 if(elem->QueryDoubleAttribute(
"fx", &val) == TIXML_SUCCESS)
329 CameraMatrix.at<
double>(0,0) = val;
333 if(elem->QueryDoubleAttribute(
"fy", &val) == TIXML_SUCCESS)
334 CameraMatrix.at<
double>(1,1) = val;
338 if(elem->QueryDoubleAttribute(
"cx", &val) == TIXML_SUCCESS)
339 CameraMatrix.at<
double>(0,2) = val;
343 if(elem->QueryDoubleAttribute(
"cy", &val) == TIXML_SUCCESS)
344 CameraMatrix.at<
double>(1,2) = val;
349 endodebug(
"creating DistorsionCoeffs from XML file")
350 cv::Mat DistorsionCoeffs = cv::Mat::zeros(1, 5, cv::DataType<double>::type);
351 if(elem->QueryDoubleAttribute(
"k1", &val) == TIXML_SUCCESS)
352 DistorsionCoeffs.at<
double>(0,0) = val;
356 if(elem->QueryDoubleAttribute(
"k2", &val) == TIXML_SUCCESS)
357 DistorsionCoeffs.at<
double>(0,1) = val;
361 if(elem->QueryDoubleAttribute(
"p1", &val) == TIXML_SUCCESS)
362 DistorsionCoeffs.at<
double>(0,2) = val;
366 if(elem->QueryDoubleAttribute(
"p2", &val) == TIXML_SUCCESS)
367 DistorsionCoeffs.at<
double>(0,3) = val;
371 DistorsionCoeffs.at<
double>(0,4) = 0.0;
378 std::string errorStr = err.str();
379 int errLength = errorStr.length();
382 errorStr = errorStr.substr(0, errLength-2);
383 errorStr.append(
" not found");
384 throw std::invalid_argument(err.str());
388 elem->QueryIntAttribute(
"Valid", &valid);
392 m_Valid =
static_cast<bool>(valid);
417 return PrincipalPointX;
423 return PrincipalPointY;
456 vnl_vector_fixed<mitk::ScalarType, 2>
459 vnl_vector_fixed<mitk::ScalarType, 2> vec;
465 vnl_vector_fixed<mitk::ScalarType, 2>
468 vnl_vector_fixed<mitk::ScalarType, 2> vec;
474 std::ostream&
operator<< (std::ostream& os, mitk::CameraIntrinsics::Pointer p)
486 const std::string& varName)
488 std::ostringstream s;
502 itk::LightObject::Pointer mitk::CameraIntrinsics::InternalClone()
const 504 itk::LightObject::Pointer result(
new Self(*
this));
505 result->UnRegister();
vnl_vector_fixed< mitk::ScalarType, 2 > GetFocalPointAsVnlVector() const
mitk::Point3D GetFocalPoint() const
std::string ToString() const
void FromXML(TiXmlElement *elem) override
bool Equals(const CameraIntrinsics *other) const
class representing camera intrinsics and related functions
void FromGMLCalibrationXML(TiXmlElement *elem)
std::string ToOctaveString(const std::string &varName="CameraIntrinsics")
double GetPrincipalPointY() const
vnl_matrix_fixed< mitk::ScalarType, 3, 3 > GetVnlCameraMatrix() const
double GetPrincipalPointX() const
virtual void FromXMLFile(const std::string &file, const std::string &elemName="")
#define endoAssertMsg(a, msg)
DataCollection - Class to facilitate loading/accessing structured data.
double GetFocalLengthX() const
mitk::Point3D GetPrincipalPoint() const
void SetFocalLength(double x, double y)
void SetIntrinsics(const cv::Mat &_CameraMatrix, const cv::Mat &_DistorsionCoeffs)
virtual const char * GetNameOfClass() const =0
itk::FastMutexLock::Pointer m_Mutex
vnl_matrix_fixed< mitk::ScalarType, 3, 4 > GetVnlCameraMatrix3x4() const
void SetDistorsionCoeffs(double k1, double k2, double p1, double p2)
~CameraIntrinsics() override
cv::Mat m_DistorsionCoeffs
void SetValid(bool valid)
void SetPrincipalPoint(double x, double y)
interface for all classes able to write themselves to XML files
void Copy(const CameraIntrinsics *other)
cv::Mat GetDistorsionCoeffs()
void ToXML(TiXmlElement *elem) const override
vnl_vector_fixed< mitk::ScalarType, 2 > GetPrincipalPointAsVnlVector() const
mitk::Point4D GetDistorsionCoeffsAsPoint4D() const
void SetCameraMatrix(const vnl_matrix_fixed< mitk::ScalarType, 3, 3 > &_CameraMatrix)
double GetFocalLengthY() const
MITKCORE_EXPORT std::ostream & operator<<(std::ostream &o, DataNode::Pointer &dtn)
cv::Mat GetCameraMatrix() const