鱼眼图像去畸变python / c++

#鱼眼模型参考链接

本文假设去畸变后的图像与原图大小一样大。由于去畸变后的图像符合针孔投影模型,因此不同的去畸变焦距得到不同的视场大小,且物体的分辨率也不同。可以见上图,当焦距缩小为一半时,相同大小的图像(横向投影距离一样长),对应的视场角不同。所以为了扩大视野,需要缩小焦距,作为相机坐标系到去畸变图像的投影内参焦距。

理论方面不再多说,直接上代码:

C++ 版本

cpp 复制代码
#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.4108215568312232e+02, 0.0, 1.0318237337253406e+03, 0, 5.4083086444334469e+02, 1.0225293088570558e+03, 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.at<double>(0, 0) *= 0.4;      //注意数据类型,非常重要
	new_intrinsic_mat.at<double>(1, 1) *= 0.4; 
    //调整输出校正图的中心
    new_intrinsic_mat.at<double>(0, 2) *= 1.0;   
	new_intrinsic_mat.at<double>(1, 2) *= 1.0;
	// new_intrinsic_mat.at<double>(0, 2) += 0.0;   
	// new_intrinsic_mat.at<double>(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 版本

python 复制代码
import cv2 as cv
import numpy as np

def 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, newK


def 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.4108215568312232e+02, 0.0, 1.0318237337253406e+03],
                    [0, 5.4083086444334469e+02, 1.0225293088570558e+03],
                    [0, 0, 1]], dtype=np.float32)
#畸变系数
D = np.array([[1.0926628389307196e-01],
                    [-6.5713320780575097e-04],
                    [8.4866561354316559e-03],
                    [-4.2045330300667406e-03]], dtype=np.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)
相关推荐
泡茶喝茶写代码几秒前
A股量化数据工程:从 REST 接口到策略信号(第 5 篇):板块成分股映射与对齐
java·python·股票数据api·股票数据·股票数据api接口·股票api数据接口·股票量化数据接口
vx_Biye_Design1 分钟前
django就业信息推荐系统61953-计算机课程设计、毕业设计
java·vue.js·spring boot·python·架构·django·课程设计
零基础12311 分钟前
VoiceStudio 开源项目深度解析:特性、对比与实战测试
人工智能·经验分享·python·开源
2601_9628857215 分钟前
如何用 Python 做均线粘合选股?(多头发散前的变盘候选)
开发语言·python
zhangzeyuaaa17 分钟前
Ruby 方法参数完全指南:默认值、可变参数与关键字参数
前端·python·ruby
小小张说故事23 分钟前
pytest 写了用例却不跑、fixture 不生效、参数化全失效?9 个高频坑对照表
python
外收内放34 分钟前
08 | 优化篇③ 60 张动作立绘和 50 张特效贴图是怎么进游戏的
python·游戏·pygame
(Charon)1 小时前
【C++面试】RAII到底是什么:从资源管理理解C++对象生命周期
c++·算法·面试
计算机毕业编程指导师1 小时前
【计算机毕设推荐】基于Hadoop+Django的LLM多维度性能评估分析系统源码 毕业设计 选题推荐 毕设选题 数据分析 机器学习 深度学习
大数据·hadoop·python·django·毕业设计·课程设计·llm性能
无名猿1 小时前
成员初始化列表与初始化顺序陷阱:按声明顺序,不是书写顺序
c++·现代c++·语法基础