版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/fb_help/article/details/88069295
影像畸变矫正带扭曲参数s(skew)像素比例ρ
OpenCV自带纠正方法不能矫正扭曲参数s和ρ。因此自己写代码来完成纠正。包括OpenCV的畸变模型,和Smart3D的畸变模型,其原理见影像畸变纠正详解
remap()不懂的可以看remap详解
Mat src_cpu = imread(in_filename);
cv::Mat mapx, mapy;
mapx.create(src_cpu.size(), CV_32FC1);
mapy.create(src_cpu.size(), CV_32FC1);
float u0 = src_cpu.size().width / 2 + cx;
float v0 = src_cpu.size().height / 2 + cy;
double u0 = src_cpu.size().width / 2 + cx;
double v0 = src_cpu.size().height / 2 + cy;
double k1, k2, k3, p1, p2;
// Smart3d model
//k1 = distortionArr[0];
//k2 = distortionArr[1];
//k3 = distortionArr[2];
//p1 = distortionArr[3];
//p2 = distortionArr[4];
//for (int i = 0; i<src_cpu.cols; ++i)
// for (int j = 0; j < src_cpu.rows; ++j)
// {
// double x = (i - u0) / f, y = (j - v0) / f;
// double x2 = x*x, y2 = y*y;
// double r2 = x2 + y2, _2xy = 2 * x*y;
// double kr = (1 + ((k3*r2 + k2)*r2 + k1)*r2);
// double xd = (x*kr + p2*_2xy + p1*(r2 + 2 * x2));
// double yd = (y*kr + p2*(r2 + 2 * y2) + p1*_2xy);
// double u = f*xd + u0 + skew*yd;
// double v = f*pixelRadio*yd + v0;
// mapx.at<float>(j, i) = u;
// mapy.at<float>(j, i) = v;
// }
// OpenCV model
k1 = distortionArr[0];
k2 = distortionArr[1];
p1 = distortionArr[2];
p2 = distortionArr[3];
k3 = distortionArr[4];
for(int i = 0;i<src_cpu.cols;++i)
for (int j = 0; j < src_cpu.rows; ++j)
{
double x = (i-u0)/f, y = (j - v0) / f;
double x2 = x*x, y2 = y*y;
double r2 = x2 + y2, _2xy = 2 * x*y;
double kr = (1 + ((k3*r2 + k2)*r2 + k1)*r2);
double xd = (x*kr + p1*_2xy + p2*(r2 + 2 * x2));
double yd = (y*kr + p1*(r2 + 2 * y2) + p2*_2xy);
double u = f*xd + u0 + skew*yd;
double v = f*pixelRadio*yd + v0;
mapx.at<float>(j, i) = u;
mapy.at<float>(j, i) = v;
}
// GPU version
cv::cuda::GpuMat src(src_cpu);
cv::cuda::GpuMat distortion(src.size(), src.type());
cv::Mat result;
::cv::cuda::GpuMat m_mapx;
::cv::cuda::GpuMat m_mapy;
m_mapx = ::cv::cuda::GpuMat(mapx);
m_mapy = ::cv::cuda::GpuMat(mapy);
::cv::cuda::remap(src, distortion, m_mapx, m_mapy, INTER_LINEAR);
distortion.download(result);
imshow("img", src_cpu);
imshow("undistort", result);
waitKey(0);