效果图

三幅图像分别为矫正前、校正后和裁减后的图片。

矫正后的图像有些奇怪,需要把无用的部分裁剪掉。

代码

步骤一:拍摄棋盘图片

运行该程序,按空格键拍摄棋盘信息(注意拍摄的棋盘要完整),拍摄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广角摄像头的畸变矫正相关推荐

  1. opencv python 从摄像头获取视频、帧率、分辨率等属性设置和使用

    opencv python 从摄像头获取视频.帧率.分辨率等属性设置和使用 文章目录: 1,为了获取视频,你应该创建一个 VideoCapture 对象.他的参数可以是设备的索引号,或者是一个视频文件 ...

  2. 鱼眼摄像头的畸变矫正方法-python+opencv

    鱼眼摄像头畸变校正的方法: 1. 棋盘矫正法 2. 经纬度矫正法. 相机为什么会出现畸变? 当前相机的畸变主要分为径向畸变和切向畸变两种. 径向畸变产生的原因:相机的光学镜头厚度不均匀,离镜头越远场景 ...

  3. opencv python 调用摄像头_python+opencv实现摄像头调用的方法

    最近入了一块树莓派,想让其实现摄像头的调用,因此写下此博客备忘 一.树莓派网络的配置 首先,对树莓派进行网络配置,否则就无法进行软件的安装 我们知道,ifconfig命令可以修改ip地址.子网掩码等信 ...

  4. opencv python 采用摄像头拍照

    因为最近需要做个相机标定,所以要先用摄像头拍一下标定的照片. 按下s键就会保存照片到指定文件夹 按下esc就会退出程序 import cv2cap=cv2.VideoCapture(0) i=0 wh ...

  5. 8.opencv+python控制摄像头拍照和录视频

    1.摄像头运行测试 import cv2cap = cv2.VideoCapture(0) # 调用摄像头while cap.isOpened():# get a frameret, frame0 = ...

  6. 双目摄像头立体成像(二)畸变矫正与立体校正

    一.立体校正的原因 **原因一:**当畸变系数和内外参数矩阵标定完成后,就应该进行畸变矫正,以达到消除畸变的目的. **原因二:**在立体成像原理中提到,要通过两幅图像估计物点的深度信息,就必须在两幅 ...

  7. python读取摄像头数据_python 读取摄像头数据并保存的实例

    python如何能采集多个摄像头的数据 .要用opencv吗?听说这个问题不好解决啊只有把自己过得像王后一样,才能吸引你想要的国王. 可以,用PYQT+CV2,四个USB连接成功,程序如下,UI要自己 ...

  8. python opencv 摄像头标定_(五)单目摄像头标定与畸变矫正(C++,opencv)

    本文将梳理一种单目摄像头标定和矫正的方法,在梳理的过程中,首先使用网上离线的图片数据跑通流程,然后接入自己的camera,手动采集标定图像,实时矫正相机的畸变,然后输出矫正后的图像.全文基于Openc ...

  9. 广角摄像头畸变校正(1)-标定

    1.标定 标定板:标定的最开始阶段最需要的肯定是标定板.两种方法,直接从opencv官网上能下载到: http://docs.opencv.org/2.4/_downloads/pattern.png ...

最新文章

  1. ElasticSearch(3)-安装kibana
  2. 到外国的网站写英语留言
  3. Machine Learning 网络资源
  4. Cortana小娜:城市信息提醒
  5. ustc小道消息20220106
  6. CF-1207 G.Indie Album(Trie上跑AC自动机)
  7. log4net使用详解 .
  8. GAN之父NIPS 2016演讲现场直击:全方位解读生成对抗网络的原理及未来(附PPT)
  9. HDU 5514 Frogs 欧拉函数
  10. P2863 [USACO06JAN]牛的舞会The Cow Prom
  11. 工作30:加入git版本库
  12. 斯柯达柯珞克显示服务器错误,斯柯达柯珞克原来还有四驱的版本,不信你看!...
  13. 解决克隆clone github 仓库速度过慢的问题
  14. java防止编码重复_java – 如何避免许多小类的代码重复?
  15. 2021-08-01mysql外键
  16. mysql执行大量的操作时,报无法连接数据库的错误
  17. linux不同主机通信,Linux实现多台主机之间相互通信
  18. 三菱plc pwm指令_学会了这27条基本逻辑指令,你离熟练编程三菱PLC又近了一步!...
  19. 石头机器人拖地水量调节_拖地组件再评测:正式版 家有 石头科技T4 米家一代 水箱拖地组件...
  20. DB2数据库学习总结(一)——round函数用法

热门文章

  1. vivado学习第二 串口通信之奇偶校验位
  2. call方法的用法,如何改变用call方法改变this指向?
  3. SVG学习之动态插入图片
  4. 前端资源浏览器渲染原理
  5. ./mvnw无法运行的问题处理
  6. Trimble MB-Two OEM GNSS板 参考手册(三)
  7. python-课后作业-3
  8. 数据结构--哈夫曼树
  9. Android 接口回调(有史以来最实用最简单的例子)
  10. uniapp 开发 ipone底部安全区