41 const mitk::Point2D old_src = src;
44 float k1 = m_distortionMatrixData[0];
45 float k2 = m_distortionMatrixData[1];
46 float p1 = m_distortionMatrixData[2];
47 float p2 = m_distortionMatrixData[3];
51 dstd[0] = (src[0] - m_ccX) / m_fcX;
52 dstd[1] = (src[1] - m_ccY) / m_fcY;
53 mitk::Point2D desPnt = dstd;
59 for (
int iter = 0; iter < 5; iter++)
62 const float k_radial = 1 + k1 * r_2 + k2 * r_2 * r_2;
63 const float delta_x = 2 * p1*x*y + p2 * (r_2 + 2*x*x);
64 const float delta_y = 2 * p2*x*y + p1 * (r_2 + 2*y*y);
65 x = (desPnt[0] - delta_x) / k_radial;
66 y = (desPnt[1] - delta_y) / k_radial;
85 float distx = x + x*(k1*r_2 + k2*r_2*r_2) + (2*p1*x*y + p2*(r_2 + 2*x*x));
86 float disty = y + y*(k1*r_2 + k2*r_2*r_2) + (2*p2*x*y + p1*(r_2 + 2*y*y));
93 const float diffx = old_src[0] - distx;
94 const float diffy = old_src[1] - disty;
95 if (fabs(diffx) > .1 || fabs(diffy) > .1)
97 std::cout <<
"undistort sanity check error: diffx =" << diffx <<
" , diffy = " << diffy;
105 m_intrinsicMatrixData[0] = (double)m_fcX;
106 m_intrinsicMatrixData[1] = 0.0;
107 m_intrinsicMatrixData[2] = (double)m_ccX;
108 m_intrinsicMatrixData[3] = 0.0;
109 m_intrinsicMatrixData[4] = (double)m_fcY;
110 m_intrinsicMatrixData[5] = (double)m_ccY;
111 m_intrinsicMatrixData[6] = 0.0;
112 m_intrinsicMatrixData[7] = 0.0;
113 m_intrinsicMatrixData[8] = 1.0;
114 m_intrinsicMatrix = cvMat(3, 3, CV_32FC1, m_intrinsicMatrixData);
117 m_distortionMatrix = cvMat(1, 4, CV_32F, m_distortionMatrixData);
120 auto srcMat = cv::cvarrToMat(src);
121 auto dstMat = cv::cvarrToMat(dst);
122 auto intrinsicMat = cv::cvarrToMat(&m_intrinsicMatrix);
123 auto distortionMat = cv::cvarrToMat(&m_distortionMatrix);
124 cv::undistort(srcMat, dstMat, intrinsicMat, distortionMat);
166 m_tempImage = cvCloneImage( src );
167 cvRemap(m_tempImage, src, m_mapX, m_mapY, CV_INTER_CUBIC);
168 cvReleaseImage( &m_tempImage );
169 m_tempImage =
nullptr;
175 cvRemap(src, dst, m_mapX, m_mapY, CV_INTER_CUBIC);
192 float in_dPrincipalX,
float in_dPrincipalY,
193 float in_Dist[4],
float ImageSizeX,
float ImageSizeY)
196 m_DistortionCoeffs = cvCreateMat(4, 1, CV_64FC1);
197 m_CameraMatrix = cvCreateMat(3, 3, CV_64FC1);
201 cvSetReal2D(m_CameraMatrix, 0, 0, in_dF1);
202 cvSetReal2D(m_CameraMatrix, 0, 1, 0.0);
203 cvSetReal2D(m_CameraMatrix, 0, 2, in_dPrincipalX);
205 cvSetReal2D(m_CameraMatrix, 1, 0, 0.0);
206 cvSetReal2D(m_CameraMatrix, 1, 1, in_dF2);
207 cvSetReal2D(m_CameraMatrix, 1, 2, in_dPrincipalY);
209 cvSetReal2D(m_CameraMatrix, 2, 0, 0.0);
210 cvSetReal2D(m_CameraMatrix, 2, 1, 0.0);
211 cvSetReal2D(m_CameraMatrix, 2, 2, 1.0);
214 cvSetReal1D(m_DistortionCoeffs, 0, in_Dist[0]);
215 cvSetReal1D(m_DistortionCoeffs, 1, in_Dist[1]);
216 cvSetReal1D(m_DistortionCoeffs, 2, in_Dist[2]);
217 cvSetReal1D(m_DistortionCoeffs, 3, in_Dist[3]);
219 m_mapX = cvCreateMat(ImageSizeY, ImageSizeX, CV_32FC1);
220 m_mapY = cvCreateMat(ImageSizeY, ImageSizeX, CV_32FC1);
222 auto cameraMat = cv::cvarrToMat(m_CameraMatrix);
223 auto distortionCoeffs = cv::cvarrToMat(m_DistortionCoeffs);
224 auto mapX = cv::cvarrToMat(m_mapX);
225 auto mapY = cv::cvarrToMat(m_mapY);
226 cv::initUndistortRectifyMap(cameraMat, distortionCoeffs, cv::Mat(), cameraMat, mapX.size(), mapX.type(), mapX, mapY);