图像畸变矫正相关API解析请看博客
安装
pip install opencv-python==4.1.2.30
pip install opencv-contrib-python==4.1.2.30
git clone https://github.com/fy-shen/Image-Calibrate.git
手动标点矫正图像
使用默认数据进行测试
cd Image-Calibrate
python3 calibrate_select_points.py --random-select 30
(1) 可以看到两幅图像: camera、pattern,图像上已经使用了提前手动标定的点位,此时在图像上可以点击鼠标左键添加点、鼠标右键删除上一个添加的点
(2) 选点完成后,键盘按 's' 进入矫正,此时会多出三幅图像: dst、dst_full、dst_hom
dst: cv2.getOptimalNewCameraMatrix()
中 alpha=1
时图像未裁剪的结果,可用于查看矫正效果是否符合预期,通常图像的黑色区域呈枕形效果较好
dst_full: cv2.getOptimalNewCameraMatrix()
中 alpha=0
时的结果,此时图像为原图分辨率,但经过了矫正与裁剪,通常是矫正完最终所使用的的图像效果
dst_hom: 将 dst_full 通过单应性变换映射到 pattern 上的叠加显示,用于查看单应性变换的效果
(3) 此时可按除 'r' 以外的键保存当前结果,或者按 'r' 进入随机取点矫正,可以直接看到随机取点后的结果
有时矫正的效果并不理想,而通过变换取点的数量和顺序会得到不同的结果,随机取点会在手动标定的所有点中随机选取 --random-select
个,得到想要的效果后再保存结果即可
(4) 保存的结果会自动存储在项目路径下的 '../runs/runx/' 中,假设相机图像文件名为 'xxx.jpg' 会得到以下结果
file | description |
---|---|
xxx_calibrate_parm.npz | 矫正参数,包含内参、畸变系数、外参 |
xxx_camera_select_kpts.jpg | 相机取点的可视化图像 |
xxx_camera_select_kpts.npz | 相机取点的坐标 |
xxx_camera_select_kpts_raw.npz | 使用随机取点时会生成,为最初手动标点的所有点坐标 |
xxx_hom.jpg | dst_hom |
xxx_hom.npz | 单应性矩阵参数 |
xxx_pattern_select_kpts.jpg | 模板图取点的可视化图像 |
xxx_pattern_select_kpts.npz | 模板图取点的坐标 |
xxx_pattern_select_kpts_raw.npz | 使用随机取点时会生成,为最初手动标点的所有点坐标 |
xxx_result.jpg | dst |
xxx_result_full.jpg | dst_full |
(5) 输入参数解析
parameter | default | explanation |
---|---|---|
--camera-img-path | 相机图像路径 | |
--pattern-img-path | 模板图像路径 | |
--camera-kpts-path | 相机图像预选关键点 | |
--pattern-kpts-path | 模板图像预选关键点 | |
--camera-select-kpts-path | 相机图像已选关键点 | |
--pattern-select-kpts-path | 模板图像已选关键点 | |
--fisheye | False | 是否为鱼眼相机 |
--random-select | -1 | 随机取点数量 |
预选关键点: 模板图像通常是自己画的,尺寸对应世界坐标,一些可能想要标的点是已知的,在手动取点时会在预选点附近会自动精确选择。存储 npz 时 key 值必须设定为 kpts。
已选关键点: 程序运行后会自动选择里面存储的点位,避免反复手动取点。