OpenCV——将针孔相机模型图片转换成鱼眼相机模型图片

本文介绍了如何使用OpenCV将针孔相机模型的图片转换为鱼眼相机模型的图片。理论基础涉及鱼眼相机模型的等距投影和针孔相机模型的透视投影,通过求解映射关系实现转换。OpenCV实现中,文章强调了pow()函数求平方、初始化目标图像及读取图像路径的注意事项。
摘要由CSDN通过智能技术生成

一 理论基础

        关于针孔相机模型,参考博客

        关于鱼眼相机模型,参考参考文献[1][2]。

        这里只需要知道我们这里使用的鱼眼相机模型是等距投影的鱼眼相机模型,即r=fθ(1),而针孔相机模型是透视投影,即r=ftanθ(2)。其中f是焦距focus,r是成像平面内某像素点到主光点principal point的距离,principal point是成像平面和主光轴的焦点,θ是入射光线和主光轴的夹角。根据(1)和(2),可以得到从正常图像上某点P(xc,yc)到鱼眼相机上某点P(xf,yf)的映射关系:

rf = f*arctan(rc/f)

二 OpenCV实现

#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <iostream>
#include <cmath>

int main() {
	cv::Mat srcImg;
	srcImg = cv::imread("E:/Data Sets/ORIGINAL/data_road/training/image_2/um_000000.png");
	if (srcImg.data != nullptr) {
		std::cout << "Load Image Successfully" << std::endl;
	}
	const int f = 200;
	std::cout << srcImg.
  • 1
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
### 回答1: OpenCV提供了一种简单的针孔模型标定方法,可以用来标定相机的内部参数。可以使用下面的示例代码来调用针孔模型:cv::Mat intrinsic = cv::Mat::eye(3, 3, CV_64F); cv::Mat distCoeffs; std::vector<cv::Point2f> imagePoints;cv::calibrateCamera(objectPoints, imagePoints, imageSize, intrinsic, distCoeffs, rvecs, tvecs); ### 回答2: 下面是一个使用OpenCV相机标定针孔模型的示例: 首先,我们需要准备一些相机标定的图片。这些图片应该包括一些具有明确角点的棋盘格图像。确保摄像机在不同的位置和角度下拍摄足够数量的图像。 在代码中,我们首先导入必要的库: import cv2 import numpy as np 接下来,我们定义几个参数: pattern_size = (6, 9) # 棋盘格内角点数量 square_size = 1.0 # 棋盘格边长(单位:厘米) 然后,我们创建一个空的列表用于存储图像中检测到的角点: obj_points = [] # 世界坐标系中的角点 img_points = [] # 图像坐标系中的角点 接下来,我们加载图像并进行标定: for i in range(num_images): # num_images指图像数量 img = cv2.imread(f'calibration{i}.jpg') # 加载图像 gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 转换为灰度图像 # 检测图像中的棋盘格角点 ret, corners = cv2.findChessboardCorners(gray, pattern_size, None) if ret == True: obj_points.append(np.zeros((pattern_size[0] * pattern_size[1], 3), np.float32)) obj_points[-1][:, :2] = np.mgrid[0:pattern_size[0], 0:pattern_size[1]].T.reshape(-1, 2) img_points.append(corners) # 在图像上绘制角点 cv2.drawChessboardCorners(img, pattern_size, corners, ret) cv2.imshow('img', img) cv2.waitKey(500) cv2.destroyAllWindows() 最后,我们使用收集到的角点进行相机的标定: ret, mtx, dist, rvecs, tvecs = cv2.calibrateCamera(obj_points, img_points, gray.shape[::-1], None, None) 其中,ret返回一个标志,表示标定是否成功,mtx、dist、rvecs、tvecs分别是相机内参矩阵、畸变系数、旋向量和平移向量。 这就是一个使用OpenCV相机标定针孔模型的示例。在实际应用中,你可以根据自己的需求调整参数和代码。 ### 回答3: 要使用OpenCV进行相机标定,首先需要准备一组已知的世界坐标系下的标定板图像,标定板上的角点需要已知其真实世界坐标。然后通过拍摄这组标定板图像,并提取出每幅图像中的角点,即图像坐标。 以下是一个使用OpenCV进行相机标定的代码示例: ```python import cv2 import numpy as np # 定义标定板参数 num_corners_x = 9 num_corners_y = 6 square_size = 25 # 每个角点的实际大小,单位为毫米 # 准备角点的真实世界坐标 objp = np.zeros((num_corners_x * num_corners_y, 3), np.float32) objp[:, :2] = np.mgrid[0:num_corners_x, 0:num_corners_y].T.reshape(-1, 2) * square_size # 初始化存储角点的数组 objpoints = [] # 真实世界坐标 imgpoints = [] # 图像坐标 # 拍摄标定板图像,提取角点 for filename in glob.glob('calibration_images/*.jpg'): # 修改为存储标定板图像的路径 img = cv2.imread(filename) gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 查找角点 ret, corners = cv2.findChessboardCorners(gray, (num_corners_x, num_corners_y), None) # 如果找到角点,则添加到数组中 if ret == True: objpoints.append(objp) imgpoints.append(corners) # 可视化角点 cv2.drawChessboardCorners(img, (num_corners_x, num_corners_y), corners, ret) cv2.imshow('img', img) cv2.waitKey(500) cv2.destroyAllWindows() # 进行相机标定 ret, camera_matrix, distortion_coeff, rvecs, tvecs = cv2.calibrateCamera(objpoints, imgpoints, gray.shape[::-1], None, None) # 打印结果 print("相机内参数矩阵:") print(camera_matrix) print("\n相机畸变系数:") print(distortion_coeff) # 对测试图像进行矫正 img = cv2.imread('test_image.jpg') # 替换为待校正的图像路径 h, w = img.shape[:2] new_camera_matrix, roi = cv2.getOptimalNewCameraMatrix(camera_matrix, distortion_coeff, (w, h), 1, (w, h)) dst = cv2.undistort(img, camera_matrix, distortion_coeff, None, new_camera_matrix) # 显示校正前后的图像 cv2.imshow('Original Image', img) cv2.imshow('Undistorted Image', dst) cv2.waitKey(0) cv2.destroyAllWindows() ``` 以上代码会利用OpenCV提供的`findChessboardCorners`函数在标定板图像中查找角点,然后使用`calibrateCamera`函数进行相机标定,最后通过`undistort`函数对待校正的图像进行畸变矫正。在代码中需要根据实际情况修改标定板图像的路径和待校正的图像路径。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值