鱼眼相机模型-MEI

参考文献: Single View Point Omnidirectional Camera Calibration from Planar Grids

1. 相机模型如下:

   // 相机坐标系下的点投影到畸变图像
   // 输入:相机坐标系点坐标cam  输出: 畸变图像素点坐标disPt
   void FisheyeCamAdapter::cam2DistImg(cv::Point3f &cam, cv::Point2f &disPt)
    {
        double r = cv::norm(cam);
        double dx_u = 0, dy_u = 0;
        if (r != 0)
        {
            cv::Point3f ps = cam / r;
            double x = ps.x / (ps.z + camInt.fXi);
            double y = ps.y / (ps.z + camInt.fXi);
            distortion(x, y, &dx_u, &dy_u);
            x += dx_u;
            y += dy_u;
            disPt.x = x * camInt.fGammaX + camInt.fCx;
            disPt.y = y * camInt.fGammaY + camInt.fC
<think>好的,用户想在Ubuntu系统下使用OpenCV进行鱼眼镜头的标定,需要详细的教程。首先,我需要整理相关的步骤和注意事项,确保回答准确且符合用户的需求。 首先,用户的问题涉及到鱼眼相机标定,根据提供的引用内容,特别是引用[1]、[2]、[4],这些提到了OpenCV中的鱼眼模型以及标定方法。需要确认OpenCV的安装和配置,特别是contrib模块,因为鱼眼标定可能在opencv_contrib里。引用[2]提到Mei模型的实现在ccalib模块中,所以用户需要安装带有contrib的OpenCV版本。 接下来,步骤方面,应该包括安装OpenCV和contrib,准备标定板,采集图像,运行标定程序。安装部分需要指导用户如何正确编译OpenCV,包括必要的依赖项,比如CMake、Python等。这里要提醒用户注意版本兼容性,避免出现问题。 关于标定板的制作,用户可能需要知道棋盘格或圆点标定板的规格,例如常见的棋盘格尺寸,比如9x6,每个方块的物理尺寸。这部分需要明确说明,因为标定效果依赖于标定板的质量和正确使用。 图像采集部分,需要指导用户如何用摄像头拍摄多角度的图像,确保覆盖整个视野,尤其是鱼眼镜头边缘畸变较大的区域。建议采集足够数量的图片,比如20-30张,以提高标定精度。 然后,标定程序部分,用户可能需要示例代码。根据引用[4],CamOdoCal库和OpenCV使用的是8参数模型,但要注意参数对应关系。在代码中,需要使用cv2.fisheye模块的相关函数,比如calibrate。需要确保代码正确使用这些函数,并处理返回的参数。 标定后的验证部分,用户需要知道如何应用去畸变参数,测试标定效果。引用[1]提到OpenCV的鱼眼去畸变方法,这里可以引用示例代码展示如何应用undistortImage。 此外,用户可能遇到的问题包括安装OpenCV contrib时的编译错误,标定参数的理解错误(如引用[4]中提到的参数顺序问题),以及标定结果不准确。需要给出常见问题的解决方法,例如确保足够的图像数量,正确覆盖视野等。 最后,生成的相关问题需要围绕标定后的应用、参数意义、不同模型的区别以及标定失败处理等,帮助用户进一步了解相关知识。 总结:需要分步骤详细说明安装、准备、采集、标定和验证的过程,提供代码示例,注意事项,并引用相关的参考资料确保准确性。同时,语言要简洁明了,适合Ubuntu用户操作。</think>在Ubuntu系统下使用OpenCV进行鱼眼相机标定的步骤如下: --- ### 1. 安装OpenCV及Contrib模块 鱼眼相机标定需要安装包含`opencv_contrib`模块的OpenCV: ```bash # 安装依赖项 sudo apt-get install build-essential cmake git libgtk2.0-dev pkg-config libavcodec-dev libavformat-dev libswscale-dev git clone https://github.com/opencv/opencv.git git clone https://github.com/opencv/opencv_contrib.git # 编译安装 cd opencv && mkdir build && cd build cmake -D CMAKE_BUILD_TYPE=RELEASE \ -D CMAKE_INSTALL_PREFIX=/usr/local \ -D OPENCV_EXTRA_MODULES_PATH=../../opencv_contrib/modules .. make -j$(nproc) sudo make install ``` --- ### 2. 准备标定板 使用棋盘格或圆点标定板(推荐棋盘格),例如打印$9 \times 6$的棋盘格,每个方格边长$30\ \text{mm}$(需实际测量)[^1]。 --- ### 3. 采集标定图像 通过鱼眼相机拍摄**20-30张**不同角度和位置的标定板图像,确保覆盖整个鱼眼视野(尤其是边缘畸变区域)[^3]。 --- ### 4. 运行标定程序 使用以下Python代码进行标定: ```python import cv2 import numpy as np # 标定板参数 CHECKERBOARD = (8, 11) # 内部角点数(行,列) objp = np.zeros((1, CHECKERBOARD[0]*CHECKERBOARD[1], 3), np.float32) objp[0,:,:2] = np.mgrid[0:CHECKERBOARD[0],0:CHECKERBOARD[1]].T.reshape(-1, 2) # 存储对象点与图像点 objpoints = [] # 3D点 imgpoints = [] # 2D点 images = glob.glob('calibration_images/*.jpg') # 图像路径 for fname in images: img = cv2.imread(fname) gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) ret, corners = cv2.findChessboardCorners(gray, CHECKERBOARD, cv2.CALIB_CB_ADAPTIVE_THRESH + cv2.CALIB_CB_FAST_CHECK) if ret: objpoints.append(objp) corners2 = cv2.cornerSubPix(gray, corners, (11,11), (-1,-1), (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 30, 0.001)) imgpoints.append(corners2) # 鱼眼标定(注意使用fisheye模块) K = np.zeros((3, 3)) D = np.zeros((4, 1)) rvecs = [np.zeros((1, 1, 3), dtype=np.float64) for _ in range(len(objpoints))] tvecs = [np.zeros((1, 1, 3), dtype=np.float64) for _ in range(len(objpoints))] ret, K, D, _, _ = cv2.fisheye.calibrate( objpoints, imgpoints, gray.shape[::-1], K, D, rvecs, tvecs, cv2.fisheye.CALIB_RECOMPUTE_EXTRINSIC + cv2.fisheye.CALIB_CHECK_COND ) print("内参矩阵 K:\n", K) print("畸变系数 D:\n", D) ``` --- ### 5. 验证标定结果 使用去畸变函数验证: ```python # 去畸变示例 img = cv2.imread("test_image.jpg") h, w = img.shape[:2] map1, map2 = cv2.fisheye.initUndistortRectifyMap( K, D, np.eye(3), K, (w, h), cv2.CV_16SC2 ) undistorted_img = cv2.remap(img, map1, map2, interpolation=cv2.INTER_LINEAR) cv2.imshow("Undistorted", undistorted_img) cv2.waitKey(0) ``` --- ### 注意事项 1. OpenCV的鱼眼模型参数顺序为$k_2, k_3, k_4, k_5$,而非原文的$k_1$起始[^4]。 2. 标定失败时检查图像是否覆盖足够视角,或尝试更多样本。 3. 可使用`cv2.omnidir`模块处理更复杂的全向模型[^2]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值