00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00024
00025
00026 #include "mitkUndistortCameraImage.h"
00027 #include "itkTimeProbe.h"
00028
00029 #include "highgui.h"
00030
00031 mitk::UndistortCameraImage::UndistortCameraImage()
00032 {
00033 m_tempImage = NULL;
00034
00035 }
00036 mitk::UndistortCameraImage::~UndistortCameraImage()
00037 {
00038 if(m_tempImage != NULL)
00039 cvReleaseImageHeader(&m_tempImage);
00040 }
00041
00042
00044 mitk::Point2D mitk::UndistortCameraImage::UndistortPixel(mitk::Point2D src)
00045 {
00046 float k1, k2, p1, p2;
00047 float k_radial;
00048 float x, y;
00049 float delta_x, delta_y;
00050 float r_2;
00051 float distx, disty;
00052 mitk::Point2D desPnt;
00053 mitk::Point2D dstd, dst;
00054 mitk::Point2D old_src = src;
00055
00056
00057 k1 = m_distortionMatrixData[0];
00058 k2 = m_distortionMatrixData[1];
00059 p1 = m_distortionMatrixData[2];
00060 p2 = m_distortionMatrixData[3];
00061
00062
00063 dstd[0] = (src[0] - m_ccX) / m_fcX;
00064 dstd[1] = (src[1] - m_ccY) / m_fcY;
00065 desPnt[0] = dstd[0];
00066 desPnt[1] = dstd[1];
00067
00068
00069 x = dstd[0];
00070 y = dstd[1];
00071
00072 for (int iter = 0; iter < 5; iter++)
00073 {
00074 r_2 = x*x + y*y;
00075 k_radial = 1 + k1 * r_2 + k2 * r_2 * r_2;
00076 delta_x = 2 * p1*x*y + p2 * (r_2 + 2*x*x);
00077 delta_y = 2 * p2*x*y + p1 * (r_2 + 2*y*y);
00078 x = (desPnt[0] - delta_x) / k_radial;
00079 y = (desPnt[1] - delta_y) / k_radial;
00080 }
00081 dstd[0] = x;
00082 dstd[1] = y;
00083 dstd[0] *= m_fcX;
00084 dstd[1] *= m_fcY;
00085 dstd[0] += m_ccX;
00086 dstd[1] += m_ccY;
00087
00088
00089 dst[0] = (float)dstd[0];
00090 dst[1] = (float)dstd[1];
00091
00092
00093
00094 x = dstd[0] - m_ccX;
00095 y = dstd[1] - m_ccY;
00096 x /= m_fcX;
00097 y /= m_fcY;
00098 r_2 = x*x + y*y;
00099 distx = x + x*(k1*r_2 + k2*r_2*r_2) + (2*p1*x*y + p2*(r_2 + 2*x*x));
00100 disty = y + y*(k1*r_2 + k2*r_2*r_2) + (2*p2*x*y + p1*(r_2 + 2*y*y));
00101 distx *= m_fcX;
00102 disty *= m_fcY;
00103 distx += m_ccX;
00104 disty += m_ccY;
00105
00106
00107 float diffx = old_src[0] - distx;
00108 float diffy = old_src[1] - disty;
00109 if (fabs(diffx) > .1 || fabs(diffy) > .1)
00110 {
00111 std::cout << "undistort sanity check error: diffx =" << diffx << " , diffy = " << diffy;
00112
00113 }
00114 return dst;
00115 }
00116
00117 void mitk::UndistortCameraImage::UndistortImage(IplImage *src, IplImage *dst)
00118 {
00119
00120 m_intrinsicMatrixData[0] = (double)m_fcX;
00121 m_intrinsicMatrixData[1] = 0.0;
00122 m_intrinsicMatrixData[2] = (double)m_ccX;
00123 m_intrinsicMatrixData[3] = 0.0;
00124 m_intrinsicMatrixData[4] = (double)m_fcY;
00125 m_intrinsicMatrixData[5] = (double)m_ccY;
00126 m_intrinsicMatrixData[6] = 0.0;
00127 m_intrinsicMatrixData[7] = 0.0;
00128 m_intrinsicMatrixData[8] = 1.0;
00129 m_intrinsicMatrix = cvMat(3, 3, CV_32FC1, m_intrinsicMatrixData);
00130
00131
00132 m_distortionMatrix = cvMat(1, 4, CV_32F, m_distortionMatrixData);
00133
00134
00135 cvUndistort2(src,dst, &m_intrinsicMatrix, &m_distortionMatrix);
00136 }
00137
00138
00139
00140
00141 void mitk::UndistortCameraImage::UndistortImageFast(IplImage * src, IplImage* dst)
00142 {
00143
00144
00145
00146
00147
00148
00149
00150
00151
00152
00153
00154
00155
00156
00157
00158
00159
00160
00161
00162
00163
00164
00165
00166
00167
00168
00169
00170
00171
00172 if(!dst)
00173 {
00174 if(m_tempImage)
00175 cvReleaseImageHeader(&m_tempImage);
00176 m_tempImage = cvCreateImage(cvSize(src->width,src->height),src->depth
00177 ,src->nChannels);
00178 m_tempImage->origin = src->origin;
00179 cvRemap(src, m_tempImage, m_mapX, m_mapY, CV_INTER_CUBIC);
00180 cvReleaseImageData(src);
00181 src->imageData = m_tempImage->imageData;
00182
00183
00184 }
00185 else
00186 {
00187 cvRemap(src, dst, m_mapX, m_mapY, CV_INTER_CUBIC);
00188 }
00189
00190
00191
00192
00193
00194
00195
00196
00197
00198
00199 }
00200
00201
00202
00203 void mitk::UndistortCameraImage::SetUndistortImageFastInfo(float in_dF1, float in_dF2,
00204 float in_dPrincipalX, float in_dPrincipalY,
00205 float in_Dist[4], float ImageSizeX, float ImageSizeY)
00206 {
00207
00208 m_DistortionCoeffs = cvCreateMat(4, 1, CV_64FC1);
00209 m_CameraMatrix = cvCreateMat(3, 3, CV_64FC1);
00210
00211
00212
00213 cvSetReal2D(m_CameraMatrix, 0, 0, in_dF1);
00214 cvSetReal2D(m_CameraMatrix, 0, 1, 0.0);
00215 cvSetReal2D(m_CameraMatrix, 0, 2, in_dPrincipalX);
00216
00217 cvSetReal2D(m_CameraMatrix, 1, 0, 0.0);
00218 cvSetReal2D(m_CameraMatrix, 1, 1, in_dF2);
00219 cvSetReal2D(m_CameraMatrix, 1, 2, in_dPrincipalY);
00220
00221 cvSetReal2D(m_CameraMatrix, 2, 0, 0.0);
00222 cvSetReal2D(m_CameraMatrix, 2, 1, 0.0);
00223 cvSetReal2D(m_CameraMatrix, 2, 2, 1.0);
00224
00225
00226 cvSetReal1D(m_DistortionCoeffs, 0, in_Dist[0]);
00227 cvSetReal1D(m_DistortionCoeffs, 1, in_Dist[1]);
00228 cvSetReal1D(m_DistortionCoeffs, 2, in_Dist[2]);
00229 cvSetReal1D(m_DistortionCoeffs, 3, in_Dist[3]);
00230
00231 m_mapX = cvCreateMat(ImageSizeY, ImageSizeX, CV_32FC1);
00232 m_mapY = cvCreateMat(ImageSizeY, ImageSizeX, CV_32FC1);
00233
00234
00235 cvInitUndistortMap(m_CameraMatrix, m_DistortionCoeffs, m_mapX, m_mapY);
00236 }
00237
00238
00239
00240