【OpenCV】Python广角摄像头的畸变矫正
效果图
三幅图像分别为矫正前、校正后和裁减后的图片。
矫正后的图像有些奇怪,需要把无用的部分裁剪掉。
代码
步骤一:拍摄棋盘图片
运行该程序,按空格键拍摄棋盘信息(注意拍摄的棋盘要完整),拍摄20张左右即可,按q键退出。
import cv2# 图片保存路径
IMG_SAVE_PATH = "img/"if __name__ == '__main__':num = 1camera = cv2.VideoCapture(0)while True:state, src = camera.read()cv2.imshow('src', src)if cv2.waitKey(10) & 0xff == ord(' '):cv2.imwrite(IMG_SAVE_PATH + str(num) + '.jpg', src)print("Saved img_" + str(num) + "!")num += 1if cv2.waitKey(10) & 0xff == ord('q'):breakcv2.destroyAllWindows()
步骤二:计算畸变矩阵
计算畸变矩阵,并保存畸变数据到parameter文件。
import cv2
import glob
import numpy as np
import pickle
import os# 棋盘规格
BOARD_RAW = 19
BOARD_COL = 13# 图片保存路径
IMG_SAVE_PATH = "img/"
IMG_RESULT_PATH = "result/"if __name__ == '__main__':obj_p = np.zeros((BOARD_RAW*BOARD_COL, 3), np.float32)# np.mgrid[0:raw, 0:col]的shape为(2, 19, 13)转置后为(13, 19, 2),reshape后为(13*19, 2)# obj_p[:, :2]===>obj_p[:, 0] and obj_p[:, 1]obj_p[:, :2] = np.mgrid[0:BOARD_RAW, 0:BOARD_COL].T.reshape(-1, 2)# print('obj_p:', obj_p)obj_points = []img_points = []images = glob.glob(IMG_SAVE_PATH + '*.jpg')for name in images:print('name:', name)img = cv2.imread(name)gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)# 寻找角点ret, corners = cv2.findChessboardCorners(gray, (BOARD_RAW, BOARD_COL), None)criteria = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 30, 0.001)sub_corners = cv2.cornerSubPix(gray, corners, (11, 11), (-1, -1), criteria)obj_points.append(obj_p)img_points.append(sub_corners)img = cv2.drawChessboardCorners(gray, (BOARD_RAW, BOARD_COL), sub_corners, ret)cv2.imshow('img', img)cv2.imwrite(IMG_RESULT_PATH + 'img'+name.split(os.sep)[-1], img)cv2.waitKey(500)# 标定结果:相机的内参数矩阵,畸变系数,旋转矩阵和平移向量ret, mtx, dist, rvecs, tvecs = cv2.calibrateCamera(obj_points, img_points, gray.shape[::-1], None, None)print('ret:', ret)print('mtx:', mtx)print('dist:', dist)print('rvecs:', rvecs)print('tvecs:', tvecs)# 保存参数cal_parameter = {'ret': ret, 'mtx': mtx, 'dist': dist, 'rvecs': rvecs, 'tvecs': tvecs}pickle.dump(cal_parameter, open("parameter", "wb"), 0)print("Save successfully!")
步骤三:读取广角摄像头图像
打开广角摄像头,进行矫正,分别获得原图像、矫正图像和裁剪图像。
import cv2
import pickleif __name__ == '__main__':# 获取矫正参数f = pickle.load(open('parameter', 'rb')) # 读取矫正参数ret, mtx, dist, rvecs, tvecs = f['ret'], f['mtx'], f['dist'], f['rvecs'], f['tvecs']# 获取图像尺寸img = cv2.imread('img\\1.jpg')h, w = img.shape[:2]new_camera_mtx, roi = cv2.getOptimalNewCameraMatrix(mtx, dist, (w, h), 1, (w, h))x, y, w, h = roi # roi 提取的不准确,可能需要手动调整vid = cv2.VideoCapture(0)while True:state, src = vid.read()cv2.imshow('src', src)dst = cv2.undistort(src, mtx, dist, None, new_camera_mtx)cv2.imshow('img1', dst)dst = dst[y:y + h, x:x + w]cv2.imshow('img2', dst)cv2.waitKey(1)
【OpenCV】Python广角摄像头的畸变矫正相关推荐
- opencv python 从摄像头获取视频、帧率、分辨率等属性设置和使用
opencv python 从摄像头获取视频.帧率.分辨率等属性设置和使用 文章目录: 1,为了获取视频,你应该创建一个 VideoCapture 对象.他的参数可以是设备的索引号,或者是一个视频文件 ...
- 鱼眼摄像头的畸变矫正方法-python+opencv
鱼眼摄像头畸变校正的方法: 1. 棋盘矫正法 2. 经纬度矫正法. 相机为什么会出现畸变? 当前相机的畸变主要分为径向畸变和切向畸变两种. 径向畸变产生的原因:相机的光学镜头厚度不均匀,离镜头越远场景 ...
- opencv python 调用摄像头_python+opencv实现摄像头调用的方法
最近入了一块树莓派,想让其实现摄像头的调用,因此写下此博客备忘 一.树莓派网络的配置 首先,对树莓派进行网络配置,否则就无法进行软件的安装 我们知道,ifconfig命令可以修改ip地址.子网掩码等信 ...
- opencv python 采用摄像头拍照
因为最近需要做个相机标定,所以要先用摄像头拍一下标定的照片. 按下s键就会保存照片到指定文件夹 按下esc就会退出程序 import cv2cap=cv2.VideoCapture(0) i=0 wh ...
- 8.opencv+python控制摄像头拍照和录视频
1.摄像头运行测试 import cv2cap = cv2.VideoCapture(0) # 调用摄像头while cap.isOpened():# get a frameret, frame0 = ...
- 双目摄像头立体成像(二)畸变矫正与立体校正
一.立体校正的原因 **原因一:**当畸变系数和内外参数矩阵标定完成后,就应该进行畸变矫正,以达到消除畸变的目的. **原因二:**在立体成像原理中提到,要通过两幅图像估计物点的深度信息,就必须在两幅 ...
- python读取摄像头数据_python 读取摄像头数据并保存的实例
python如何能采集多个摄像头的数据 .要用opencv吗?听说这个问题不好解决啊只有把自己过得像王后一样,才能吸引你想要的国王. 可以,用PYQT+CV2,四个USB连接成功,程序如下,UI要自己 ...
- python opencv 摄像头标定_(五)单目摄像头标定与畸变矫正(C++,opencv)
本文将梳理一种单目摄像头标定和矫正的方法,在梳理的过程中,首先使用网上离线的图片数据跑通流程,然后接入自己的camera,手动采集标定图像,实时矫正相机的畸变,然后输出矫正后的图像.全文基于Openc ...
- 广角摄像头畸变校正(1)-标定
1.标定 标定板:标定的最开始阶段最需要的肯定是标定板.两种方法,直接从opencv官网上能下载到: http://docs.opencv.org/2.4/_downloads/pattern.png ...
最新文章
- ElasticSearch(3)-安装kibana
- 到外国的网站写英语留言
- Machine Learning 网络资源
- Cortana小娜:城市信息提醒
- ustc小道消息20220106
- CF-1207 G.Indie Album(Trie上跑AC自动机)
- log4net使用详解 .
- GAN之父NIPS 2016演讲现场直击:全方位解读生成对抗网络的原理及未来(附PPT)
- HDU 5514 Frogs 欧拉函数
- P2863 [USACO06JAN]牛的舞会The Cow Prom
- 工作30:加入git版本库
- 斯柯达柯珞克显示服务器错误,斯柯达柯珞克原来还有四驱的版本,不信你看!...
- 解决克隆clone github 仓库速度过慢的问题
- java防止编码重复_java – 如何避免许多小类的代码重复?
- 2021-08-01mysql外键
- mysql执行大量的操作时,报无法连接数据库的错误
- linux不同主机通信,Linux实现多台主机之间相互通信
- 三菱plc pwm指令_学会了这27条基本逻辑指令,你离熟练编程三菱PLC又近了一步!...
- 石头机器人拖地水量调节_拖地组件再评测:正式版 家有 石头科技T4 米家一代 水箱拖地组件...
- DB2数据库学习总结(一)——round函数用法