Python Opencv去畸变

在计算机视觉领域中,图像去畸变是一个很常见的问题。由于摄像头镜头的形状和光学特性,拍摄的图像可能会出现一些形变和畸变。通过去畸变处理,可以使图像更加真实,更加符合人眼所见的真实场景。在本文中,我们将介绍如何使用Python Opencv库去畸变图像。

1. 理解畸变原理

在摄像头拍摄图像时,会产生径向畸变和切向畸变。径向畸变是由于镜头形状不完全对称或光线经过镜头时发生折射引起的,会使图像中心位置附近的物体拉伸或挤压。切向畸变是由于镜头装配不准确或镜头与成像平面不平行引起的,会使图像中的物体出现倾斜或扭曲。

Opencv提供了一些方法来去除这些畸变,主要是通过摄像机标定得到相机内参和外参,然后利用这些参数对图像进行畸变矫正。

2. 摄像机标定

在进行畸变矫正前,需要进行摄像机标定,即通过拍摄一些已知的图案(比如棋盘格)来得到相机的内参和外参。Opencv提供了一个方法cv2.calibrateCamera来进行标定。下面是一个简单的摄像机标定的示例代码:

import numpy as np
import cv2

criteria = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 30, 0.001)
objp = np.zeros((6*7,3), np.float32)
objp[:,:2] = np.mgrid[0:7,0:6].T.reshape(-1,2)

objpoints = []
imgpoints = []

cap = cv2.VideoCapture(0)
while True:
    ret, img = cap.read()
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    ret, corners = cv2.findChessboardCorners(gray, (7,6), None)
    
    if ret:
        objpoints.append(objp)
        imgpoints.append(corners)
        
    cv2.drawChessboardCorners(img, (7,6), corners, ret)
    cv2.imshow('img', img)
    
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

ret, mtx, dist, rvecs, tvecs = cv2.calibrateCamera(objpoints, imgpoints, gray.shape[::-1], None, None)
print("Camera matrix:")
print(mtx)
print("Distortion coefficients:")
print(dist)

cap.release()
cv2.destroyAllWindows()

3. 畸变矫正

有了相机内参和外参之后,就可以对图像进行畸变矫正了。Opencv提供了一个方法cv2.undistort来进行畸变矫正。下面是一个简单的畸变矫正的示例代码:

import cv2

img = cv2.imread('distorted.jpg')
h, w = img.shape[:2]

newcameramtx, roi = cv2.getOptimalNewCameraMatrix(mtx, dist, (w,h), 1, (w,h))

dst = cv2.undistort(img, mtx, dist, None, newcameramtx)

x,y,w,h = roi
dst = dst[y:y+h, x:x+w]

cv2.imshow('distorted', img)
cv2.imshow('undistorted', dst)
cv2.waitKey(0)
cv2.destroyAllWindows()

4. 总结

通过摄像机标定和畸变矫正,我们可以很好地处理图像中的畸变问题,使图像更加清晰和真实。Opencv库提供了丰富的方法和函数来帮助我们实现这些功能。希望本文对您有所帮助,谢谢阅读!

附录

饼状图示例

pie
    title 饼状图示例
    "A" : 40
    "B" : 20
    "C" : 30

类图示