【代码】python+opencv实现相机标定和图像畸变矫正

本文详细介绍了如何利用Python和OpenCV库进行相机标定,获取相机内参和畸变参数,并展示了图像畸变矫正的过程。通过实践,最终成功实现了图像矫正,总误差为0.03328540580860977。
摘要由CSDN通过智能技术生成

目的:

  1. 实现相机标定,得到相机的内参以及畸变旋转参数等
  2. 尝试矫正由相机产生的图像畸变

准备工作:图片来自链接:https://pan.baidu.com/s/1ZHeUHOuFdnNyYGP8tKWmyA
提取码:7jci

代码:

import cv2 as cv
import numpy as np
import glob
import os

#循环中断
criteria=(cv.TERM_CRITERIA_EPS+cv.TERM_CRITERIA_MAX_ITER,30,0.001)

#标定板交叉点的个数
row=6
column=4
objp=np.zeros((row*column,3),np.float32)
objp[:,:2]=np.mgrid[0:row,0:column].T.reshape(-1,2)

objpoints=[]   #实际空间3D点
imgpoints=[]   #图像中2D点

#批量读取图片
images=glob.glob
Python中,结合OpenCV(Computer Vision Library)进行网络摄像头的标定和计算注视点通常涉及到以下几个步骤: 1. **安装依赖**: 首先需要安装`opencv-python`库,以及`numpy`用于处理图像数据。可以使用pip进行安装: ``` pip install opencv-python numpy ``` 2. **摄像头获取**: 使用`cv2.VideoCapture()`函数打开摄像头设备。例如: ```python import cv2 cap = cv2.VideoCapture(0) # 如果是内置摄像头,传入0;如果是文件,则传入文件路径 ``` 3. **标定过程**: - 获取棋盘格模板:创建一个预先设计好的棋盘格图片作为标定板。 - 记录角点:从摄像头捕获的图像中找到棋盘格的角点,这是标定的关键。 - 进行相机内参估计:通过多次拍摄标定板并提取角点来估计相机的内外参数矩阵。 ```python def calibrate_camera(images_path): criteria = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 30, 0.001) objp = np.zeros((6 * 9, 3), np.float32) objp[:, :2] = np.mgrid[0:9, 0:6].T.reshape(-1, 2) found, corners = [], [] for img in images_path: gray = cv2.imread(img, cv2.IMREAD_GRAYSCALE) ret, corners = cv2.findChessboardCorners(gray, (9, 6), None) if ret: found.append(corners) cv2.drawChessboardCorners(gray, (9, 6), corners, ret) cv2.imshow('img', gray) cv2.waitKey(500) cv2.destroyAllWindows() if len(found) > 0: rms, camera_matrix, dist_coefs, _, _ = cv2.calibrateCamera(objp, found, gray.shape[::-1], None, None) return camera_matrix, dist_coefs ``` 标定完成后,你可以保存参数到文件中供后续使用。 4. **实时计算注视点**: - 在摄像头捕获的每一帧上,使用之前得到的内参和畸变校正系数对图像进行矫正(undistort)。 - 对矫正后的图像应用人脸检测技术(如Haar cascades或dlib的face detector),找出人脸区域。 - 在人脸区域内寻找眼睛,这一步可以用OpenCV的Haarcascade或其他预训练的人脸特征检测模型。 - 确定注视点位置,并在原图上标记出来。 ```python def find_gaze_point(frame, face_cascade, eye_cascade): # ...人脸检测、眼睛定位等操作... gaze_point = (x_eye, y_eye) return gaze_point # 实时运行 while True: success, frame = cap.read() if not success: break gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) faces = face_cascade.detectMultiScale(gray, scaleFactor=1.1, minNeighbors=5) for (x, y, w, h) in faces: cropped_face = gray[y:y+h, x:x+w] gaze_point = find_gaze_point(cropped_face, eye_cascade) # 在原始帧上显示注视点 cv2.circle(frame, gaze_point, 5, (0, 255, 0), -1) cv2.imshow('Webcam Gaze Detection', frame) key = cv2.waitKey(1) if key == ord('q'): break cap.release() cv2.destroyAllWindows() ```
评论 21
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值