Genius823 2021-12-04 15:08 采纳率: 0%
浏览 36
已结题

我在做一个单目相机标定的东西,但是不论是我打印棋盘标定还是直接用屏幕拍的照片,标定后的结果反而变成了“标准的桶形畸变”,怎么解决呐??

首先放上代码,其中一些注释DL们可以忽略:

import cv2 as cv
import sys
import numpy as np


def compute_points(img):
    
    gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY)
    
    board_size = (9, 6)
    
    _, points = cv.findChessboardCorners(gray, board_size)
    
    _, points = cv.find4QuadCornerSubpix(gray, points, (5, 5))
    
    # image = cv.drawChessboardCorners(img, board_size, points, True)
    # cv.imshow("coner", image)
    
    return points


if __name__ == '__main__':
    obj_points = np.zeros((54, 3), np.float32)
    obj_points[:, :2] = np.mgrid[0:9, 0:6].T.reshape(-1, 2)
    obj_points = np.reshape(obj_points, (54, 1, 3))
    # print(obj_points)

    all_obj_points = []
    all_points = []
    for i in range(1, 6):
        image = cv.imread("screen ({}).jpg" .format(i))
        if image is None:
            print("Failed to read 1")
            sys.exit()
        
        h, w = image.shape[:2]
        all_obj_points.append(obj_points)   # 三维坐标,世界坐标
        all_points.append(compute_points(image))
    
    _, cameraMatrix, distCoeffs, rvecs, tvecs = cv.calibrateCamera(all_obj_points, all_points, (w, h), None, None)

    # print("内参矩阵:\n{}" .format(cameraMatirx))
    # print("畸变系数:\n{}" .format(distCoeffs))
    
    # print("旋转向量:\n{}" .format(rvecs))
    # print("平移向量:\n{}" .format(tvecs))
    
    for i in range(1, 6):
        img = cv.imread("screen ({}).jpg" .format(i))
        if img is None:
            print("Failed to read")
            sys.exit()
            
        h, w = img.shape[:2]
        
        # result = cv.undistort(img, cameraMatirx, distCoeffs, newCameraMatrix=None)
        map1, map2 = cv.initUndistortRectifyMap(cameraMatrix, distCoeffs, None, None, (w, h), 5)
        result = cv.remap(img, map1, map2, cv.INTER_LINEAR)
        
        
        cv.imshow("origin_{}" .format(i), img)
        cv.imshow("result_{}" .format(i), result)
        # cv.imwrite('F:/images/result{}.jpg'.format(i),result)
        k = cv.waitKey(0)
        
        if k == 13:
            cv.destroyAllWindows()
        else:
            sys.exit()

然后是结果图片:

img


这是第一张的原始图

img


这是对应矫正之后的图片

img

这是第二张

img

它的矫正图

img


第三张

img


第三张的矫正图

img


第四张

img


矫正的图

img


第五张

img


第五张的矫正图

它的结果都是反而变成了一个标准的桶形畸变图了。。
qwq,DL的帮助!

  • 写回答

1条回答 默认 最新

  • 有问必答小助手 2021-12-06 11:23
    关注

    你好,我是有问必答小助手,非常抱歉,本次您提出的有问必答问题,技术专家团超时未为您做出解答


    本次提问扣除的有问必答次数,将会以问答VIP体验卡(1次有问必答机会、商城购买实体图书享受95折优惠)的形式为您补发到账户。


    因为有问必答VIP体验卡有效期仅有1天,您在需要使用的时候【私信】联系我,我会为您补发。

    评论

报告相同问题?

问题事件

  • 系统已结题 12月12日
  • 创建了问题 12月4日

悬赏问题

  • ¥15 如何在scanpy上做差异基因和通路富集?
  • ¥20 关于#硬件工程#的问题,请各位专家解答!
  • ¥15 关于#matlab#的问题:期望的系统闭环传递函数为G(s)=wn^2/s^2+2¢wn+wn^2阻尼系数¢=0.707,使系统具有较小的超调量
  • ¥15 FLUENT如何实现在堆积颗粒的上表面加载高斯热源
  • ¥30 截图中的mathematics程序转换成matlab
  • ¥15 动力学代码报错,维度不匹配
  • ¥15 Power query添加列问题
  • ¥50 Kubernetes&Fission&Eleasticsearch
  • ¥15 報錯:Person is not mapped,如何解決?
  • ¥15 c++头文件不能识别CDialog