影像畸变矫正带扭曲参数s(skew)像素比例ρ

版权声明:本文为博主原创文章,未经博主允许不得转载。 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);

猜你喜欢

转载自blog.csdn.net/fb_help/article/details/88069295