前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >GoPro 镜头失真消除

GoPro 镜头失真消除

作者头像
云深无际
发布于 2021-07-23 05:05:01
发布于 2021-07-23 05:05:01
1.7K00
代码可运行
举报
文章被收录于专栏:云深之无迹云深之无迹
运行总次数:0
代码可运行
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
https://github.com/EminentCodfish/GoPro-Calibration-Distortion-Removal

GoPro 使用的鱼眼镜头提供了广阔的视野,但它也会扭曲图像。在这个项目中,我们将通过使用 Python 和 OpenCV 校准相机来消除失真。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
https://www.theeminentcodfish.com/gopro-calibration/

除了高端型号外,每台相机都会在图像上产生某种形式的失真。下边的图像是从 GoPro Hero 3 上拍摄的。正如你所看到的,图像中应该是直线的物体(红线),比如门框和橱柜,都是弯曲的。这主要是由于镜头的形状造成的,通常称为径向畸变。当你远离图像中心时,GoPro 相机中使用的鱼眼镜头会导致失真增加。有第二种失真形式称为平移失真,它源于这样一个事实,即镜头通常不会完美地居中并平行于成像传感器。

此脚本已在 GoPro Hero 2 和 GoPro Hero 3 black 上进行了测试。

现在是Py3.0多,其实代码不难,可以很方便的去移植

你需要打印这个图案来进行校准

校准相机系统依赖于收集已知尺寸的校准图案的图像。此脚本将收集此图案的图像并将图像中图案的尺寸与现实生活中的尺寸进行比较。这将使我们能够对整个视场中的图像失真进行建模并计算相机的失真参数。然后我们将根据这些值对图像或视频进行失真处理。

对于这个脚本,我们将使用可以在上面下载的棋盘模式。我通常在一张标准的 8.5" x 11" 纸上打印出这个图案,然后把它贴在一块有机玻璃上。任何刚性都可以,我们只是不希望校准图案变形。接下来,我们需要创建校准模式的视频。该脚本将播放此视频,您将能够保存用于校准的图案图像。使用 GoPro,如果没有两个人和 LCD 背包,这可能会有点困难,因为您看不到正在拍摄的内容。但是,我通常只用我自己来做。要录制视频,请确保相机位于稳定的平台上,使其保持静止。在录制时,将校准图案至少距离相机约 2 英尺,并在视野周围移动图案。由于我通常看不到视频,我慢慢地左右移动图案,上下移动以将其定位在许多不同的位置。缓慢移动图案,任何运动模糊都会降低校准的准确性。您希望能够在摄像机视场周围的许多不同位置拉取具有该图案的视频帧。确保将图案放置在至少 20 个独特的位置,尝试获取外围,因为这是扭曲最明显的地方。随意前后移动图案,图案的旋转不是问题。下图显示了用于校准的马赛克图像。由于我通常看不到视频,我慢慢地左右移动图案,上下移动以将其定位在许多不同的位置。缓慢移动图案,任何运动模糊都会降低校准的准确性。您希望能够在摄像机视场周围的许多不同位置拉取具有该图案的视频帧。确保将图案放置在至少 20 个独特的位置,尝试获取外围,因为这是扭曲最明显的地方。随意前后移动图案,图案的旋转不是问题。下图显示了用于校准的马赛克图像。由于我通常看不到视频,我慢慢地左右移动图案,上下移动以将其定位在许多不同的位置。缓慢移动图案,任何运动模糊都会降低校准的准确性。您希望能够在摄像机视场周围的许多不同位置拉取具有该图案的视频帧。确保将图案放置在至少 20 个独特的位置,尝试获取外围,因为这是扭曲最明显的地方。随意前后移动图案,图案的旋转不是问题。下图显示了用于校准的马赛克图像。任何运动模糊都会降低校准的准确性。您希望能够在摄像机视场周围的许多不同位置拉取具有该图案的视频帧。确保将图案放置在至少 20 个独特的位置,尝试获取外围,因为这是扭曲最明显的地方。随意前后移动图案,图案的旋转不是问题。下图显示了用于校准的马赛克图像。任何运动模糊都会降低校准的准确性。您希望能够在摄像机视场周围的许多不同位置拉取具有该图案的视频帧。确保将图案放置在至少 20 个独特的位置,尝试获取外围,因为这是扭曲最明显的地方。随意前后移动图案,图案的旋转不是问题。下图显示了用于校准的马赛克图像。图案的旋转不是问题。下图显示了用于校准的马赛克图像。图案的旋转不是问题。下图显示了用于校准的马赛克图像。

在本节中,我们将开始校准。首先打开脚本并检查校准参数部分

在这里,您需要将脚本定向到名为“filename”的校准视频文件。如果文件与脚本在同一个文件夹中,那么名称就足够了,如果不是,则需要添加文件目录(即“C:\Video\GoProVideo.MP4”)。接下来检查其余参数并根据需要进行更改。通常我使用 20 个校准图像。如果您使用提供的棋盘格,则应设置 board_w 和 board_h。检查棋盘格的尺寸并调整 board_dim 值。如果您以不同的分辨率录制,最后更改 image_size。如果您更改相机的分辨率或 FOV 设置,则会更改失真模型,应重新校准。

设置好脚本后,运行程序。视频将开始播放。按空格键保存视频帧以进行校准。视频将一直运行,直到视频结束或收集到上面列出的校准图像的数量为止。您可以通过按 esc 按钮中止程序。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import cv2, sys
import numpy as np

#Import Information
filename = 'GOPR005.MP4'
#Input the number of board images to use for calibration (recommended: ~20)
n_boards = 20
#Input the number of squares on the board (width and height)
board_w = 9
board_h = 6
#Board dimensions (typically in cm)
board_dim = 25
#Image resolution
image_size = (1920, 1080)

#The ImageCollect function requires two input parameters.  Filename is the name of the file
#in which checkerboard images will be collected from.  n_boards is the number of images of
#the checkerboard which are needed.  In the current writing of this function an additional 5
#images will be taken.  This ensures that the processing step has the correct number of images
#and can skip an image if the program has problems.

#This function loads the video file into a data space called video.  It then collects various
#meta-data about the file for later inputs.  The function then enters a loop in which it loops
#through each image, displays the image and waits for a fixed amount of time before displaying
#the next image.  The playback speed can be adjusted in the waitKey command.  During the loop
#checkerboard images can be collected by pressing the spacebar.  Each image will be saved as a
#*.png into the directory which stores this file.  The ESC key will terminate the function.
#The function will end once the correct number of images are collected or the video ends.
#For the processing step, try to collect all the images before the video ends.

def ImageCollect(filename, n_boards):
    #Collect Calibration Images
    print('-----------------------------------------------------------------')
    print('Loading video...')

    #Load the file given to the function
    video = cv2.VideoCapture(filename)
    #Checks to see if a the video was properly imported
    status = video.isOpened()

    if status == True:
        
        #Collect metadata about the file.
        FPS = video.get(cv2.cv.CV_CAP_PROP_FPS)
        FrameDuration = 1/(FPS/1000)
        width = video.get(cv2.cv.CV_CAP_PROP_FRAME_WIDTH)
        height = video.get(cv2.cv.CV_CAP_PROP_FRAME_HEIGHT)
        size = (int(width), int(height))
        total_frames = video.get(cv2.cv.CV_CAP_PROP_FRAME_COUNT)

        #Initializes the frame counter and collected_image counter
        current_frame = 0
        collected_images = 0

        #Video loop.  Press spacebar to collect images.  ESC terminates the function.
        while current_frame < total_frames:
            success, image = video.read()
            current_frame = video.get(cv2.cv.CV_CAP_PROP_POS_FRAMES)
            cv2.imshow('Video', image)
            k = cv2.waitKey(int(FrameDuration)) #You can change the playback speed here
            if collected_images == n_boards: 
                break
            if k == 32:
                collected_images += 1
                cv2.imwrite('Calibration_Image' + str(collected_images) + '.png', image)
                print(str(collected_images) + ' images collected.')
            if k == 27:
                break
    
        #Clean up
        video.release()
        cv2.destroyAllWindows()
    else:
        print('Error: Could not load video')
        sys.exit()


#The ImageProcessing function performs the calibration of the camera based on the images
#collected during ImageCollect function.  This function will look for the images in the folder
#which contains this file.  The function inputs are the number of boards which will be used for
#calibration (n_boards), the number of squares on the checkerboard (board_w, board_h) as
#determined by the inside points (i.e. where the black squares touch).  board_dim is the actual
#size of the square, this should be an integer.  It is assumed that the checkerboard squares are
#square.

#This function first initializes a series of variables. Opts will store the true object points
#(i.e. checkerboard points).  Ipts will store the points as determined by the calibration images.
#The function then loops through each image.  Each image is converted to grayscale, and the
#checkerboard corners are located.  If it is successful at finding the correct number of corners
#then the true points and the measured points are stored into opts and ipts, respectively. The
#image with the checkerboard points are then displays.  If the points are not found that image
#is skipped.  Once the desired number of checkerboard points are acquired the calibration
#parameters (intrinsic matrix and distortion coefficients) are calculated.

#The distortion parameter are saved into a numpy file (calibration_data.npz).  The total
#total reprojection error is calculated by comparing the "true" checkerboard points to the
#image measured points once the image is undistorted.  The total reprojection error should be
#close to zero.

#Finally the function will go through the calbration images and display the undistorted image.
    
def ImageProcessing(n_boards, board_w, board_h, board_dim):
    #Initializing variables
    board_n = board_w * board_h
    opts = []
    ipts = []
    npts = np.zeros((n_boards, 1), np.int32)
    intrinsic_matrix = np.zeros((3, 3), np.float32)
    distCoeffs = np.zeros((5, 1), np.float32)
    criteria = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 30, 0.1)

    # prepare object points based on the actual dimensions of the calibration board
    # like (0,0,0), (25,0,0), (50,0,0) ....,(200,125,0)
    objp = np.zeros((board_h*board_w,3), np.float32)
    objp[:,:2] = np.mgrid[0:(board_w*board_dim):board_dim,0:(board_h*board_dim):board_dim].T.reshape(-1,2)

    #Loop through the images.  Find checkerboard corners and save the data to ipts.
    for i in range(1, n_boards + 1):
    
        #Loading images
        print 'Loading... Calibration_Image' + str(i) + '.png' 
        image = cv2.imread('Calibration_Image' + str(i) + '.png')
    
        #Converting to grayscale
        grey_image = cv2.cvtColor(image, cv2.COLOR_RGB2GRAY)

        #Find chessboard corners
        found, corners = cv2.findChessboardCorners(grey_image, (board_w,board_h),cv2.cv.CV_CALIB_CB_ADAPTIVE_THRESH + cv2.cv.CV_CALIB_CB_NORMALIZE_IMAGE)
        print (found)

        if found == True:

            #Add the "true" checkerboard corners
            opts.append(objp)

            #Improve the accuracy of the checkerboard corners found in the image and save them to the ipts variable.
            cv2.cornerSubPix(grey_image, corners, (20, 20), (-1, -1), criteria)
            ipts.append(corners)

            #Draw chessboard corners
            cv2.drawChessboardCorners(image, (board_w, board_h), corners, found)
        
            #Show the image with the chessboard corners overlaid.
            cv2.imshow("Corners", image)

        char = cv2.waitKey(0)

    cv2.destroyWindow("Corners") 
    
    print ''
    print 'Finished processes images.'

    #Calibrate the camera
    print 'Running Calibrations...'
    print(' ')
    ret, intrinsic_matrix, distCoeff, rvecs, tvecs = cv2.calibrateCamera(opts, ipts, grey_image.shape[::-1],None,None)

    #Save matrices
    print('Intrinsic Matrix: ')
    print(str(intrinsic_matrix))
    print(' ')
    print('Distortion Coefficients: ')
    print(str(distCoeff))
    print(' ') 

    #Save data
    print 'Saving data file...'
    np.savez('calibration_data', distCoeff=distCoeff, intrinsic_matrix=intrinsic_matrix)
    print 'Calibration complete'

    #Calculate the total reprojection error.  The closer to zero the better.
    tot_error = 0
    for i in xrange(len(opts)):
        imgpoints2, _ = cv2.projectPoints(opts[i], rvecs[i], tvecs[i], intrinsic_matrix, distCoeff)
        error = cv2.norm(ipts[i],imgpoints2, cv2.NORM_L2)/len(imgpoints2)
        tot_error += error

    print "total reprojection error: ", tot_error/len(opts)

    #Undistort Images
    for i in range(1, n_boards + 1):
    
        #Loading images
        print 'Loading... Calibration_Image' + str(i) + '.png' 
        image = cv2.imread('Calibration_Image' + str(i) + '.png')

        # undistort
        dst = cv2.undistort(image, intrinsic_matrix, distCoeff, None)

        cv2.imshow('Undisorted Image',dst)

        char = cv2.waitKey(0)

    cv2.destroyAllWindows()


print("Starting camera calibration....")
print("Step 1: Image Collection")
print("We will playback the calibration video.  Press the spacebar to save")
print("calibration images.")
print(" ")
print('We will collect ' + str(n_boards) + ' calibration images.')

#ImageCollect(filename, n_boards)

print(' ')
print('All the calibration images are collected.')
print('------------------------------------------------------------------------')
print('Step 2: Calibration')
print('We will analyze the images take and calibrate the camera.')
print('Press the esc button to close the image windows as they appear.')
print(' ')

ImageProcessing(n_boards, board_w, board_h, board_dim)

上一步完成后,脚本将加载校准图像并尝试定位棋盘角。如果找到角,程序将返回 True 并显示与右侧相似的图像。检查图像以确保可以很好地识别角落。在进行校准过程时,多次尝试以了解最有效的方法有时很有用。你做的越多,你就越了解程序喜欢哪些图像以及哪些图像质量较差或被拒绝。

图像被选中后,按 esc 按钮移动到下一个图像。分析完所有图像后,脚本将运行校准功能。下面是输出示例。

对于相机校准,有两个重要的数据集,内在矩阵和失真系数。3x3 矩阵中的固有矩阵,其中包含有关焦距(矩阵中的位置 0,0 和 1,1)和主点(位置 2,0 和 2,1)的信息。主点是图像上位于镜头中心正下方的点。理想情况下,该值应位于图像的中心,但通常略微偏离中心。检查值以确保数字不会偏离。这些值应该大约是水平和垂直分辨率的一半。您将看到的下一个数据是失真系数。这些值是将进入失真模型的参数。这两个数据集都保存到一个 *.npz numpy 文件中,

是个二进制的文件

最后,程序将计算总重投影误差。该值越接近零越好。我通常喜欢 0.1 以下的值。尝试校准,看看什么有效,什么改进了它。

校准结果后,脚本将重新加载校准图像并消除失真。按 esc 按钮在图像之间移动。这是确保校准模型准确的另一个验证步骤。如果图像看起来不正确,则校准模型可能不准确,应重新校准相机。

由于 GoPro 中的鱼眼失真,外围的像素比应有的更分散。不失真方法获取这些像素并将它们移近图像的中心。缺少像素往往会出现在角落周围,因为失真非常严重,并且没有视频帧外的信息来填充这些区域。OpenCV 中的标准方法是裁剪图像,因此不会丢失像素。您会注意到边缘周围的信息丢失。在新的 OpenCV 3 版本中,脚本顶部有一个裁剪参数(第 29 行)。如果此值设置为 0,则程序将裁剪掉所有黑色像素。这将导致外围的一些信息丢失。值为 1 将利用所有可用像素。这将导致原始图像中没有信息的黑色区域,但如果在边缘和角落附近有重要信息,这将很有用。我发现这个值需要调整到中间的 ~0.5 以针对每种情况进行优化。

校准相机后,可以使用以下脚本来消除使用该相机收集的任何视频的失真。请记住,如果您更改分辨率、FOV 或环境(即水下),则会影响校准。

文章是搬运,出处在开头,大家玩的愉快,当然可以适用于别的镜头~

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import numpy as np
import cv2, time, sys

filename = 'GOPR0042.MP4'
crop = 0.5

print 'Loading data files'

npz_calib_file = np.load('calibration_data.npz')

distCoeff = npz_calib_file['distCoeff']
intrinsic_matrix = npz_calib_file['intrinsic_matrix']

npz_calib_file.close()

print('Finished loading files')
print(' ')
print('Starting to undistort the video....')

#Opens the video import and sets parameters
video = cv2.VideoCapture(filename)
#Checks to see if a the video was properly imported
status = video.isOpened()

if status == True:
    FPS = video.get(cv2.CAP_PROP_FPS)
    width = video.get(cv2.CAP_PROP_FRAME_WIDTH)
    height = video.get(cv2.CAP_PROP_FRAME_HEIGHT)
    size = (int(width), int(height))
    total_frames = video.get(cv2.CAP_PROP_FRAME_COUNT)
    frame_lapse = (1/FPS)*1000

    #Initializes the export video file
    codec = cv2.VideoWriter_fourcc(*'DIVX')
    video_out = cv2.VideoWriter(str(filename[:-4])+'_undistored.avi', codec, FPS, size, 1)

    #Initializes the frame counter
    current_frame = 0
    start = time.clock()
    
    newMat, ROI = cv2.getOptimalNewCameraMatrix(intrinsic_matrix, distCoeff, size, alpha = crop, centerPrincipalPoint = 1)
    mapx, mapy = cv2.initUndistortRectifyMap(intrinsic_matrix, distCoeff, None, newMat, size, m1type = cv2.CV_32FC1)

    while current_frame < total_frames:
        success, image = video.read()
        current_frame = video.get(cv2.CAP_PROP_POS_FRAMES)

        dst = cv2.remap(image, mapx, mapy, cv2.INTER_LINEAR)
        #dst = cv2.undistort(image, intrinsic_matrix, distCoeff, None)
    
        video_out.write(dst)
    
    video.release()
    video_out.release()
    duration = (time.clock()-float(start))/60

    print(' ')
    print('Finished undistorting the video')
    print('This video took:' + str(duration) + ' minutes')
else:
    print("Error: Video failed to load")
    sys.exit()
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-07-07,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 云深之无迹 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
使用OpenCV校准鱼眼镜头
当我们使用的鱼眼镜头视角大于160°时,OpenCV中用于校准镜头“经典”方法的效果可能就不是和理想了。即使我们仔细遵循OpenCV文档中的步骤,也可能会得到下面这个奇奇怪怪的照片:
小白学视觉
2022/04/06
1.9K0
使用OpenCV校准鱼眼镜头
【传感器标定】相机内参标定(c++、python代码)
读书猿
2024/02/05
8430
Python OpenCV3 计算机视觉秘籍:6~9
变量之间的线性相关性是所有可能选项中最简单的。 从近似和几何任务到数据压缩,相机校准和机器学习,它可以在许多应用中找到。 但是,尽管它很简单,但是当现实世界的影响发挥作用时,事情就会变得复杂。 从传感器收集的所有数据都包含一部分噪声,这可能导致线性方程组具有不稳定的解。 计算机视觉问题通常需要求解线性方程组。 即使在许多 OpenCV 函数中,这些线性方程也是隐藏的。 可以肯定的是,您将在计算机视觉应用中面对它们。 本章中的秘籍将使您熟悉线性代数的方法,这些方法可能有用并且实际上已在计算机视觉中使用。
ApacheCN_飞龙
2023/04/27
2.6K0
Python OpenCV3 计算机视觉秘籍:6~9
使用双目相机进行三维重建 第一部分:相机校准
引言:后续的一系列文章会尝试解释用于从2D图片提取3D信息的一些重要工具和技术。3D重建对于很多应用来说是一个非常有用的工具,他可以构建人脸、场景、或其他物体的3D模型。这种模型是通过计算2D图像像素中的深度信息得到的。
AI研习社
2019/05/15
2.7K0
使用双目相机进行三维重建 第一部分:相机校准
张正友相机标定Opencv实现以及标定流程&&标定结果评价&&图像矫正流程解析(附标定程序和棋盘图)
使用Opencv实现张正友法相机标定之前,有几个问题事先要确认一下,那就是相机为什么需要标定,标定需要的输入和输出分别是哪些?
用户1148525
2019/05/29
6.8K0
张正友相机标定Opencv实现以及标定流程&&标定结果评价&&图像矫正流程解析(附标定程序和棋盘图)
Camera Calibration 摄像头标定
Pinhole camera calibration calls camera vision from 3D objects in the real world and transforms them into a 2D image.
vanguard
2020/02/27
1.4K0
镜头畸变校正
之前介绍了镜头畸变,本文记录校正畸变的模型和方法。 背景 对于常见的镜头径向畸变和切向畸变,在硬件已经无法继续优化时,需要后处理进行校正 模型 一些针孔摄像机会对图像产生严重的畸变,主要有两种畸变: 径向畸变和切向畸变。 径向畸变 径向畸变导致直线看起来弯曲。点距图像中心越远,径向畸变越大。例如,下图显示了一个棋盘的两个边缘用红线标记的图像。但是,你可以看到棋盘的边界不是一条直线,与红线不匹配。所有预期的直线都凸出。 径向畸变可以表示为以下模型 切向畸变 类似地,切向畸变发生是因为摄像透
为为为什么
2022/11/24
2.1K0
镜头畸变校正
OpenCV在车道线查找中的使用
本篇是自动驾驶系列的第二篇,在后台留言索取代码会提供源码链接。这次的目标是编写一个软件流水线来识别汽车前置摄像头的视频中的车道边界。摄像机标定图像,试验路图像和视频项目都可以在这里储存。
刘盼
2018/03/01
3.3K5
OpenCV在车道线查找中的使用
OpenCV 畸变矫正映射
https://developer-public-1258344699.cos.ap-guangzhou.myqcloud.com/column/column/10335061/20230218-2d58b817.png
为为为什么
2023/02/18
1.6K0
OpenCV 畸变矫正映射
详解车道线检测算法之传统图像处理
车道线检测算法分为传统图像处理方法和深度学习方法。本文详细介绍用传统图像处理方法来解决车道线检测问题,后文的算法源于Udacity无人驾驶课程的项目(https://www.udacity.com/),仅做参考。
3D视觉工坊
2020/11/11
1.1K0
详解车道线检测算法之传统图像处理
自动驾驶视觉融合-相机校准与激光点云投影
多传感器融合一直是自动驾驶领域非常火的名词, 但是如何融合不同传感器的原始数据, 很多人对此都没有清晰的思路. 本文的目标是在KITTI数据集上实现激光雷达和相机的数据融合. 然而激光雷达得到的是3D点云, 而单目相机得到的是2D图像, 如何将3D空间中的点投影到图像平面上, 从而获得激光雷达与图像平面相交的区域, 是本文研究的重点. 其次本文会介绍相机这个大家常见的传感器, 以及讲解如何对相机进行畸变校准.
小白学视觉
2022/09/28
1.9K0
实战|OpenCV实时弯道检测(详细步骤+源码)
本文主要介绍如何使用 Python 和 OpenCV实现一个实时曲线道路检测系统。(公众号:OpenCV与AI深度学习)
Color Space
2022/09/26
2.1K0
OpenCV2 计算机视觉应用编程秘籍:6~10
滤波是信号和图像处理的基本任务之一。 它是一个过程,旨在有选择地提取图像的某些方面,这些方面被认为在给定应用的上下文中传达了重要信息。 过滤可以消除图像中的噪点,提取有趣的视觉特征,允许图像重采样等。 它起源于一般的信号和系统理论。 在此我们将不详细介绍该理论。 但是,本章将介绍一些与过滤有关的重要概念,并说明如何在图像处理应用中使用过滤器。 但首先,让我们先简要介绍一下频域分析的概念。
ApacheCN_飞龙
2023/04/27
1.2K0
OpenCV相机标定全过程
第一个参数是输入的棋盘格图像(可以是8位单通道或三通道图像); 第二个参数是棋盘格内部的角点的行列数(注意:不是棋盘格的行列数,如棋盘格的行列数分别为4、8,而内部角点的行列数分别是3、7,因此这里应该指定为cv::Size(3, 7)); 第三个参数是检测到的棋盘格角点,类型为std::vectorcv::Point2f。 第四个参数flag,用于指定在检测棋盘格角点的过程中所应用的一种或多种过滤方法,可以使用下面的一种或多种,如果都是用则使用OR: cv::CALIB_CB_ADAPTIVE_THRESH:使用自适应阈值将图像转化成二值图像 cv::CALIB_CB_NORMALIZE_IMAGE:归一化图像灰度系数(用直方图均衡化或者自适应阈值) cv::CALIB_CB_FILTER_QUADS:在轮廓提取阶段,使用附加条件排除错误的假设 cv::CALIB_CV_FAST_CHECK:快速检测
全栈程序员站长
2022/08/24
2.6K0
OpenCV相机标定全过程
OpenCV 标定摄像头(Python 版本代码,视频中标定,亲测可用)
P=[fx0cx0fycy001] P = \begin{bmatrix} f_{x} &amp; 0 &amp; c_{x} \\ 0 &amp; f_{y} &amp; c_{y}\\ 0 &amp; 0 &amp; 1 \end{bmatrix} P=⎣⎡​fx​00​0fy​0​cx​cy​1​⎦⎤​
Frank909
2019/01/28
3.9K0
OpenCV 标定摄像头(Python 版本代码,视频中标定,亲测可用)
Python OpenCV 蓝图:1~5
本章的目的是开发许多图像处理过滤器,并将其实时应用于网络摄像头的视频流。 这些过滤器将依靠各种 OpenCV 函数来通过拆分,合并,算术运算以及为复杂函数应用查找表来操纵矩阵。
ApacheCN_飞龙
2023/04/27
1.8K0
Python OpenCV 蓝图:1~5
使用计算机视觉实战项目精通 OpenCV:1~5
本章将向您展示如何为 Android 智能手机和平板电脑编写一些图像处理过滤器,该过滤器首先针对台式机(使用 C/C++)编写,然后移植到 Android(使用相同的 C/C++ 代码,但使用 Java GUI), 这是为移动设备开发时的推荐方案。 本章将涵盖:
ApacheCN_飞龙
2023/04/27
2.3K0
OpenCV中检测ChArUco的角点(2)
ArUCo标记板是非常有用的,因为他们的快速检测和多功能性。然而,ArUco标记的一个问题是,即使在应用亚像素细化后,其角点位置的精度也不太高。相反,棋盘图案的角点可以更精确地细化,因为每个角点被两个黑色正方形包围。然而,寻找棋盘图案并不像寻找aruco棋盘那样通用:它必须是完全可见的,并且不允许遮挡。
点云PCL博主
2022/02/10
3K0
OpenCV中检测ChArUco的角点(2)
七轴开源协作机械臂myArm视觉跟踪技术!
ArUco标记是一种基于二维码的标记,可以被用于高效的场景识别和位置跟踪。这些标记的简单性和高效性使其成为机器视觉领域的理想选择,特别是在需要实时和高精度跟踪的场景中。结合机器学习和先进的图像处理技术,使用ArUco标记的机械臂系统可以实现更高级的自动化功能,如精确定位、导航和复杂动作的执行。
大象机器人
2023/12/18
4810
七轴开源协作机械臂myArm视觉跟踪技术!
使用双目相机进行三维重建 第二部分:姿态估计
引言:在上一篇文章中我们讲了相机的特征以及这些信息与我们做3D重建有什么关系。通过相机校正,我们确认了一些我们程序要用的相机属性数据,即相机矩阵(camera matrix)和扭曲系数(distortion coefficients)。利用这些信息,我们可以从拍摄的模式图像(patterned image)中计算出现实空间中物体的位置。在我们的例子中,我们会用象棋棋盘图像,并通过3D立方的绘制方向来可视化平面物体的相对位置。
AI研习社
2019/05/15
1.5K0
使用双目相机进行三维重建 第二部分:姿态估计
推荐阅读
相关推荐
使用OpenCV校准鱼眼镜头
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验