做pc网站排,企业宣传网站建设方案,网站构建器,购物网站开发用什么软件#鱼眼模型参考链接 本文假设去畸变后的图像与原图大小一样大。由于去畸变后的图像符合针孔投影模型#xff0c;因此不同的去畸变焦距得到不同的视场大小#xff0c;且物体的分辨率也不同。可以见上图#xff0c;当焦距缩小为一半时#xff0c;相同大小的图像#xff08;横…#鱼眼模型参考链接 本文假设去畸变后的图像与原图大小一样大。由于去畸变后的图像符合针孔投影模型因此不同的去畸变焦距得到不同的视场大小且物体的分辨率也不同。可以见上图当焦距缩小为一半时相同大小的图像横向投影距离一样长对应的视场角不同。所以为了扩大视野需要缩小焦距作为相机坐标系到去畸变图像的投影内参焦距。
理论方面不再多说直接上代码
C 版本
#include opencv2/opencv.hpp
#include string
#include math.h
using namespace std;//图像去畸变部分///
int main(){cv::Size img_sizea;std::string image_file test.jpeg;cv::Mat src cv::imread(image_file);cv::Mat distortiona(img_sizea,CV_8UC3);// 内参cv::Mat camera_matrixa (cv::Mat_double(3, 3) 5.4108215568312232e02, 0.0, 1.0318237337253406e03, 0, 5.4083086444334469e02, 1.0225293088570558e03, 0, 0, 1);cv::Mat distortion_coefficientsa(cv::Mat_double (1,4)1.0926628389307196e-01,-6.5713320780575097e-04,8.4866561354316559e-03,-4.2045330300667406e-03);cv::Mat new_intrinsic_mat(3, 3, CV_64FC1, cv::Scalar(0));camera_matrixa.copyTo(new_intrinsic_mat);//调整输出校正图的视场new_intrinsic_mat.atdouble(0, 0) * 0.4; //注意数据类型非常重要new_intrinsic_mat.atdouble(1, 1) * 0.4; //调整输出校正图的中心new_intrinsic_mat.atdouble(0, 2) * 1.0; new_intrinsic_mat.atdouble(1, 2) * 1.0;// new_intrinsic_mat.atdouble(0, 2) 0.0; // new_intrinsic_mat.atdouble(1, 2) 0.0;cv::fisheye::undistortImage(src, distortiona, camera_matrixa, distortion_coefficientsa, new_intrinsic_mat);cv::resize(distortiona, distortiona, cv::Size(1024,1024));cv::imshow(undistort, distortiona);cv::waitKey(0);imwrite(undistort.jpg, distortiona);
return 0;
}Python 版本
import cv2 as cv
import numpy as npdef fisheye_undistortion(img, K, D, fs):#一定要使用copy,作为不同的变量newK K.copy()#调整输出校正图的视场newK[0][0] fs * newK[0][0]newK[1][1] fs * newK[1][1]#调整输出校正图的中心newK[0][2] 1.0 * newK[0][2]newK[1][2] 1.0 * newK[1][2]undis_img cv.fisheye.undistortImage(img, K, D, None, newK)return undis_img, newKdef camera2undistortionimg(camera_point, newK):x camera_point[0] / camera_point[2]y camera_point[1] / camera_point[2]u x * newK[0][0] newK[0][2]v y * newK[1][1] newK[1][2]return [u, v]#内参
K np.array([[5.4108215568312232e02, 0.0, 1.0318237337253406e03],[0, 5.4083086444334469e02, 1.0225293088570558e03],[0, 0, 1]], dtypenp.float32)
#畸变系数
D np.array([[1.0926628389307196e-01],[-6.5713320780575097e-04],[8.4866561354316559e-03],[-4.2045330300667406e-03]], dtypenp.float32)#读取图像
srcimg cv.imread(./test.jpeg)#去畸变
fs 0.4 #焦距比例控制控制视场大小
undis_img, newK fisheye_undistortion(srcimg, K, D, fs)
print(newK)
#相机到去畸变图像映射
camera_p (-20, 20, 6)
[u, v] camera2undistortionimg(camera_p, newK)
print([u, v])
#显示验证
cv.circle(undis_img,(int(u), int(v)), 10, (0,0,255), -1)
undis_img cv.resize(undis_img,(1024, 1024))
cv.imshow(undis_img,undis_img)
cv.waitKey(0)