42 this->GetDistorsionCoeffsAsPoint4D() &&
44 this->GetFocalPoint() &&
46 == this->GetPrincipalPoint();
58 std::lock_guard<std::mutex> lock(m_Mutex);
62vnl_matrix_fixed<mitk::ScalarType, 3, 3>
65 vnl_matrix_fixed<mitk::ScalarType, 3, 3> mat;
69 std::lock_guard<std::mutex> lock(m_Mutex);
70 mat(0,0) = m_CameraMatrix.at<
double>(0,0);
71 mat(1,1) = m_CameraMatrix.at<
double>(1,1);
73 mat(0,2) = m_CameraMatrix.at<
double>(0,2);
74 mat(1,2) = m_CameraMatrix.at<
double>(1,2);
81 const vnl_matrix_fixed<mitk::ScalarType, 3, 3>& _CameraMatrix )
83 std::lock_guard<std::mutex> lock(m_Mutex);
84 m_CameraMatrix.at<
double>(0,0) = _CameraMatrix(0,0);
85 m_CameraMatrix.at<
double>(1,1) = _CameraMatrix(1,1);
87 m_CameraMatrix.at<
double>(0,2) = _CameraMatrix(0,2);
88 m_CameraMatrix.at<
double>(1,2) = _CameraMatrix(1,2);
91vnl_matrix_fixed<mitk::ScalarType, 3, 4>
94 vnl_matrix_fixed<mitk::ScalarType, 3, 4> mat;
96 mat.update( this->GetVnlCameraMatrix().as_matrix() );
102 ,
const cv::Mat& _DistorsionCoeffs)
105 std::lock_guard<std::mutex> lock(m_Mutex);
106 if( _CameraMatrix.cols != 3 || _CameraMatrix.rows != 3)
107 throw std::invalid_argument(
"Wrong format of camera matrix. Should be 3x3"
111 _DistorsionCoeffs.rows == 1,
"Wrong format of distorsion coefficients"
112 " vector. Should be 5x1 double.");
114 m_CameraMatrix = _CameraMatrix.clone();
115 m_DistorsionCoeffs = _DistorsionCoeffs.clone();
123 const mitk::Point3D& principalPoint,
124 const mitk::Point4D& distortionCoefficients)
128 std::lock_guard<std::mutex> lock(m_Mutex);
129 m_CameraMatrix.at<
double>(0,0) = focalPoint[0];
130 m_CameraMatrix.at<
double>(1,1) = focalPoint[1];
132 m_CameraMatrix.at<
double>(0,2) = principalPoint[0];
133 m_CameraMatrix.at<
double>(1,2) = principalPoint[1];
135 m_DistorsionCoeffs.at<
double>(0,0) = distortionCoefficients[0];
136 m_DistorsionCoeffs.at<
double>(0,1) = distortionCoefficients[1];
137 m_DistorsionCoeffs.at<
double>(0,2) = distortionCoefficients[2];
138 m_DistorsionCoeffs.at<
double>(0,3) = distortionCoefficients[3];
146 std::lock_guard<std::mutex> lock(m_Mutex);
147 m_CameraMatrix.at<
double>(0,0) = x;
148 m_CameraMatrix.at<
double>(1,1) = y;
156 std::lock_guard<std::mutex> lock(m_Mutex);
157 m_CameraMatrix.at<
double>(0,2) = x;
158 m_CameraMatrix.at<
double>(1,2) = y;
164 double p1,
double p2 )
168 std::lock_guard<std::mutex> lock(m_Mutex);
170 m_DistorsionCoeffs.at<
double>(0,0) = k1;
171 m_DistorsionCoeffs.at<
double>(0,1) = k2;
172 m_DistorsionCoeffs.at<
double>(0,2) = p1;
173 m_DistorsionCoeffs.at<
double>(0,3) = p2;
180 std::lock_guard<std::mutex> lock(m_Mutex);
181 return m_CameraMatrix.clone();
186 std::lock_guard<std::mutex> lock(m_Mutex);
187 return m_DistorsionCoeffs.clone();
198 std::lock_guard<std::mutex> lock(m_Mutex);
199 std::ostringstream s; s.precision(12);
200 const cv::Mat& CameraMatrix = m_CameraMatrix;
201 const cv::Mat& DistorsionCoeffs = m_DistorsionCoeffs;
203 s.str(
""); s << this->GetNameOfClass() <<
": ";
204 s <<
"fx = " << CameraMatrix.at<
double>(0,0);
205 s <<
", fy = " << CameraMatrix.at<
double>(1,1);
206 s <<
", cx = " << CameraMatrix.at<
double>(0,2);
207 s <<
", cy = " << CameraMatrix.at<
double>(1,2);
209 s <<
", k1 = " << DistorsionCoeffs.at<
double>(0,0);
210 s <<
", k2 = " << DistorsionCoeffs.at<
double>(0,1);
211 s <<
", p1 = " << DistorsionCoeffs.at<
double>(0,2);
212 s <<
", p2 = " << DistorsionCoeffs.at<
double>(0,3);
220 std::lock_guard<std::mutex> lock(m_Mutex);
221 elem->SetValue(this->GetNameOfClass());
222 std::ostringstream s; s.precision(12);
223 const cv::Mat& CameraMatrix = m_CameraMatrix;
224 s.str(
""); s << CameraMatrix.at<
double>(0,0);
225 elem->SetAttribute(
"fx", s.str().c_str() );
226 s.str(
""); s << CameraMatrix.at<
double>(1,1);
227 elem->SetAttribute(
"fy", s.str().c_str());
228 s.str(
""); s << CameraMatrix.at<
double>(0,2);
229 elem->SetAttribute(
"cx", s.str().c_str());
230 s.str(
""); s << CameraMatrix.at<
double>(1,2);
231 elem->SetAttribute(
"cy", s.str().c_str());
233 const cv::Mat& DistorsionCoeffs = m_DistorsionCoeffs;
234 s.str(
""); s << DistorsionCoeffs.at<
double>(0,0);
235 elem->SetAttribute(
"k1", s.str().c_str());
236 s.str(
""); s << DistorsionCoeffs.at<
double>(0,1);
237 elem->SetAttribute(
"k2", s.str().c_str());
238 s.str(
""); s << DistorsionCoeffs.at<
double>(0,2);
239 elem->SetAttribute(
"p1", s.str().c_str());
240 s.str(
""); s << DistorsionCoeffs.at<
double>(0,3);
241 elem->SetAttribute(
"p2", s.str().c_str());
242 elem->SetAttribute(
"Valid",
static_cast<int>(m_Valid));
250 assert( std::string(elem->Value()) ==
"results" );
251 cv::Mat CameraMatrix = cv::Mat::zeros(3, 3, cv::DataType<double>::type);
252 CameraMatrix.at<
double>(2,2) = 1.0;
253 cv::Mat DistorsionCoeffs = cv::Mat::zeros(1, 5, cv::DataType<double>::type);
255 const auto* focus_lenXElem = elem->FirstChildElement(
"focus_lenX");
257 CameraMatrix.at<
double>(0,0) = atof( focus_lenXElem->GetText() );
259 const auto* focus_lenYElem = elem->FirstChildElement(
"focus_lenY");
261 CameraMatrix.at<
double>(1,1) = atof( focus_lenYElem->GetText() );
263 const auto* PrincipalXElem = elem->FirstChildElement(
"PrincipalX");
265 CameraMatrix.at<
double>(0,2) = atof( PrincipalXElem->GetText() );
267 const auto* PrincipalYElem = elem->FirstChildElement(
"PrincipalY");
269 CameraMatrix.at<
double>(1,2) = atof( PrincipalYElem->GetText() );
273 const auto* Dist1Elem = elem->FirstChildElement(
"Dist1");
275 DistorsionCoeffs.at<
double>(0,0) = atof( Dist1Elem->GetText() );
277 const auto* Dist2Elem = elem->FirstChildElement(
"Dist2");
279 DistorsionCoeffs.at<
double>(0,1) = atof( Dist2Elem->GetText() );
281 const auto* Dist3Elem = elem->FirstChildElement(
"Dist3");
283 DistorsionCoeffs.at<
double>(0,2) = atof( Dist3Elem->GetText() );
285 const auto* Dist4Elem = elem->FirstChildElement(
"Dist4");
287 DistorsionCoeffs.at<
double>(0,3) = atof( Dist4Elem->GetText() );
290 elem->QueryIntAttribute(
"Valid", &valid);
293 std::lock_guard<std::mutex> lock(m_Mutex);
294 m_Valid =
static_cast<bool>(valid);
295 m_CameraMatrix = CameraMatrix;
296 m_DistorsionCoeffs = DistorsionCoeffs;
305 MITK_DEBUG << elem->Value();
306 const char* filename = elem->Attribute(
"file");
307 if(
nullptr != filename)
309 this->FromXMLFile(filename);
312 else if(
strcmp(elem->Value(),
"CalibrationProject") == 0)
314 this->FromGMLCalibrationXML(elem->FirstChildElement(
"results"));
319 if(
strcmp(elem->Value(), this->GetNameOfClass()) != 0)
320 elem = elem->FirstChildElement(this->GetNameOfClass());
322 std::ostringstream err;
324 cv::Mat CameraMatrix = cv::Mat::zeros(3, 3, cv::DataType<double>::type);
325 CameraMatrix.at<
double>(2,2) = 1.0;
327 if(elem->QueryDoubleAttribute(
"fx", &val) == tinyxml2::XML_SUCCESS)
328 CameraMatrix.at<
double>(0,0) = val;
332 if(elem->QueryDoubleAttribute(
"fy", &val) == tinyxml2::XML_SUCCESS)
333 CameraMatrix.at<
double>(1,1) = val;
337 if(elem->QueryDoubleAttribute(
"cx", &val) == tinyxml2::XML_SUCCESS)
338 CameraMatrix.at<
double>(0,2) = val;
342 if(elem->QueryDoubleAttribute(
"cy", &val) == tinyxml2::XML_SUCCESS)
343 CameraMatrix.at<
double>(1,2) = val;
348 endodebug(
"creating DistorsionCoeffs from XML file")
349 cv::Mat DistorsionCoeffs = cv::Mat::zeros(1, 5, cv::DataType<double>::type);
350 if(elem->QueryDoubleAttribute(
"k1", &val) == tinyxml2::XML_SUCCESS)
351 DistorsionCoeffs.at<
double>(0,0) = val;
355 if(elem->QueryDoubleAttribute(
"k2", &val) == tinyxml2::XML_SUCCESS)
356 DistorsionCoeffs.at<
double>(0,1) = val;
360 if(elem->QueryDoubleAttribute(
"p1", &val) == tinyxml2::XML_SUCCESS)
361 DistorsionCoeffs.at<
double>(0,2) = val;
365 if(elem->QueryDoubleAttribute(
"p2", &val) == tinyxml2::XML_SUCCESS)
366 DistorsionCoeffs.at<
double>(0,3) = val;
370 DistorsionCoeffs.at<
double>(0,4) = 0.0;
377 std::string errorStr = err.str();
378 int errLength = errorStr.length();
381 errorStr = errorStr.substr(0, errLength-2);
382 errorStr.append(
" not found");
383 throw std::invalid_argument(err.str());
387 elem->QueryIntAttribute(
"Valid", &valid);
390 std::lock_guard<std::mutex> lock(m_Mutex);
391 m_Valid =
static_cast<bool>(valid);
392 m_CameraMatrix = CameraMatrix;
393 m_DistorsionCoeffs = DistorsionCoeffs;
401 std::lock_guard<std::mutex> lock(m_Mutex);
402 double FocalLengthX = m_CameraMatrix.at<
double>(0,0);
408 std::lock_guard<std::mutex> lock(m_Mutex);
409 double FocalLengthY = m_CameraMatrix.at<
double>(1,1);;
414 std::lock_guard<std::mutex> lock(m_Mutex);
415 double PrincipalPointX = m_CameraMatrix.at<
double>(0,2);
416 return PrincipalPointX;
420 std::lock_guard<std::mutex> lock(m_Mutex);
421 double PrincipalPointY = m_CameraMatrix.at<
double>(1,2);
422 return PrincipalPointY;
426 std::lock_guard<std::mutex> lock(m_Mutex);
427 mitk::Point4D coeffs;
429 coeffs[0] = m_DistorsionCoeffs.at<
double>(0,0);
430 coeffs[1] = m_DistorsionCoeffs.at<
double>(0,1);
431 coeffs[2] = m_DistorsionCoeffs.at<
double>(0,2);
432 coeffs[3] = m_DistorsionCoeffs.at<
double>(0,3);
440 p[0] = this->GetFocalLengthX();
441 p[1] = this->GetFocalLengthY();
449 p[0] = this->GetPrincipalPointX();
450 p[1] = this->GetPrincipalPointY();
455vnl_vector_fixed<mitk::ScalarType, 2>
458 vnl_vector_fixed<mitk::ScalarType, 2> vec;
459 vec[0] = this->GetFocalLengthX();
460 vec[1] = this->GetFocalLengthY();
464vnl_vector_fixed<mitk::ScalarType, 2>
467 vnl_vector_fixed<mitk::ScalarType, 2> vec;
468 vec[0] = this->GetPrincipalPointX();
469 vec[1] = this->GetPrincipalPointY();
473std::ostream&
operator<< (std::ostream& os, mitk::CameraIntrinsics::Pointer p)
481 return this->ToString();
485 const std::string& varName)
487 std::ostringstream s;
488 s << varName <<
" = [" << this->GetFocalLengthX() <<
" 0 "
489 << this->GetPrincipalPointX() <<
"; 0 " <<
490 this->GetFocalLengthY() <<
" " << this->GetPrincipalPointY() <<
";"
497 std::lock_guard<std::mutex> lock(m_Mutex);
501itk::LightObject::Pointer mitk::CameraIntrinsics::InternalClone()
const
503 itk::LightObject::Pointer result(
new Self(*
this));
504 result->UnRegister();
class representing camera intrinsics and related functions
cv::Mat GetDistorsionCoeffs()
std::string ToOctaveString(const std::string &varName="CameraIntrinsics")
void SetFocalLength(double x, double y)
void SetDistorsionCoeffs(double k1, double k2, double p1, double p2)
cv::Mat m_DistorsionCoeffs
double GetPrincipalPointX() const
double GetPrincipalPointY() const
double GetFocalLengthY() const
void ToXML(tinyxml2::XMLElement *elem) const override
void SetCameraMatrix(const vnl_matrix_fixed< mitk::ScalarType, 3, 3 > &_CameraMatrix)
~CameraIntrinsics() override
double GetFocalLengthX() const
mitk::Point3D GetPrincipalPoint() const
cv::Mat GetCameraMatrix() const
mitk::Point3D GetFocalPoint() const
void SetIntrinsics(const cv::Mat &_CameraMatrix, const cv::Mat &_DistorsionCoeffs)
void SetValid(bool valid)
void SetPrincipalPoint(double x, double y)
vnl_matrix_fixed< mitk::ScalarType, 3, 4 > GetVnlCameraMatrix3x4() const
std::string ToString() const
bool Equals(const CameraIntrinsics *other) const
void FromXML(const tinyxml2::XMLElement *elem) override
void FromGMLCalibrationXML(const tinyxml2::XMLElement *elem)
vnl_vector_fixed< mitk::ScalarType, 2 > GetFocalPointAsVnlVector() const
void Copy(const CameraIntrinsics *other)
mitk::Point4D GetDistorsionCoeffsAsPoint4D() const
vnl_matrix_fixed< mitk::ScalarType, 3, 3 > GetVnlCameraMatrix() const
vnl_vector_fixed< mitk::ScalarType, 2 > GetPrincipalPointAsVnlVector() const
interface for all classes able to write themselves to XML files
std::ostream & operator<<(std::ostream &os, mitk::CameraIntrinsics::Pointer p)
#define endoAssertMsg(a, msg)
int strcmp(const String &s1, const String &s2)