这一周都在尝试用工具箱去标定投影仪,遇到了各种问题,苦于网上资料很少,记录一下,以便自己后续再用到少走弯路。
步骤主要参考这个博主,他还在b占有视频,比较清晰。
https://blog.csdn.net/Asabc12345/article/details/110874787
我因为设备距离比较近,摄像机视角太小了,所以只能拍一张标定图片,再拍一张投影仪图片,最后证明这样是错的。
遇到的问题:
1.在进行到Calibrate the projector这一步时,会显示“The 3D points cloud should be defined before. Generate the calibration data”然后无法标定
这个问题是最开始遇到的问题,我个人理解原因是你在进行投影仪标定的时候,点击了投影图片的角点之后按理说他应该提示你输入pattern,也就是你上传投影仪的那个原图【如下图】,这一步最开始我一直没遇到,所以一直在这个地方卡了天。
Projected image name:
解决方案:如下图
在点击set Projector calib images之后命令窗口提示:
Do you want use the same images used for camera calibration to calibrate the projector? ([]=yes, other=no)
在这一步我一直选择的是1,也就是no,因为我是分开拍摄的,理由就是基于这一步说你是否用标定相机用到的照片去标定投影仪,我选择否,然后再去加载投影仪照片。一开始就是这么想的,结果怎么做怎么报错,就是不出结果。然后又去看博客找资料,最后在这篇博客里受到启发,我现在的理解是,这句话的意思是,如果你加载的标定的数据,不是你在这个工具箱选择标定界面做的,而是你采用其他的方法或者单纯用相机标定得到的数据直接加载进来的话,你就需要再做一遍相机标定,所以这时候你去原则否,重新加载图片进行相机标定【这一步我真是吐了,一直以为是可以换成投影仪标定的图片导致后续一直报错】。
为了验证这个想法,我在这一步直接选择默认是,虽然传进来的图片只有相机标定的图,没办法。然后我就遇到了第二个问题
2.rgb2gray>parse_inputs (line 80) MAP 必须为 m x 3 的数组。 出错 rgb2gray (line 52) isRGB = parse_inputs(X); 出错 cam_proj_3d_points (line 48) I = double(rgb2gray(imread(image_name)));
这个问题出现在,我选择默认之后,再去点击Ray Plane intersection那个选项,他会让你输入
You may now run ‘Calibration’ to recalibrate based on this new set of images.
Window size for corner finder (wintx and winty):
wintx ([] = 5) =
winty ([] = 5) =
Window size = 41x41
默认回车完了之后就报错
解决方案:
是因为你输入的图片是灰度图。怎么确认是灰度图呢,有个简单方法:你点击图片属性–>详细信息—>深度位
如果深度位是8那就是灰度图,深度位是24就是三通道图,然后去opencv调用函数去改,我用python中的opencv读进来再输出就是RGB图了
import cv2
pic = cv2.imread('picture.bmp',cv2.IMREAD_COLOR)
cv2.imwrite("picture1.bmp",pic)
在输入进去就可以了。
3.然后就是第三个问题,这个问题这个博客也有提到,但是我用他的方法以及下面评论的方法都试过了,不管用换是提示
他说寻找工具包函数中所有check_cond = 1的地方将其更改为0,便可解决问题,关键不好找啊,然后我看他下面的评论有个说
相机标定工具包文件:go_calib_optim_iter_weak.m 69行 go_calib_optim_iter_fisheye.m 69行 go_calib_optim_iter.m 56行 saving_calib_fisheye.m 147行 saving_calib.m 147行
然后改了,后来跑通了结果是十几亿,而且还是分开输入相机和投影仪标定图片的到这我真的要放弃了,实在是不知道怎么办。已经卡了一个星期了。
最后的最后,我看源码看到个注释
说尼玛要在同一张图片上,我真的服了,怪我想当然。
然后为了验证这个,我想去找那种投影仪和照片都在一张照片上的,找不到…
中间发现了一个网站
https://calib.io/pages/camera-calibration-pattern-generator
这是个外网,要vpn,白嫖了室友。
这个网站是制作棋盘格的,可以直接输入行列和长宽大小【我前几天还专门去搜索怎么生成棋盘格,然后又搞了半天结果输出的图片是一个深度位是1的,当时还怀疑是不是因为这个引起的问题】
最后实在没办法了我去第一个博客里面的视频截图,传进去跑通了…
饶了一大圈,结果就是棋盘格和投影仪棋盘格必须在一张图里我也是醉了,最后贴一下那张截图,这张图真实截图了好久才截图到。
最后把matlab生成深度位8的棋盘格代码贴一下
close all;
clear all;
clc;
width=912 ; %pattern的宽
height=1140 ; %pattern的高
img_final=ones(height,width)*255;
reinforceconner=0 ;%是否加强角点
row=10; %pattern中棋盘格的行数
col=13 ; %pattern中棋盘格的列数
length=45; %pattern中棋盘格的大小
org_X=(height-row*length)/2; %pattern关于纵轴方向的位置,默认放在中间
org_Y=(width-col*length)/2; %pattern关于横轴方向的位置,默认放在中间
color1=255;
color2=255;
img=ones(row*length,col*length)*255;
for i=0:(row-1)
color2=color1;
for j=0:(col-1)
if color2==0
img(i*length+1:(i+1)*length-1,j*length+1:(j+1)*length-1)=color2;
color2=255;
else
color2=0;
end
end
if color1==255
color1=0;
else
color1=255;
end
end
img_final(org_X:org_X+row*length-1,org_Y:org_Y+col*length-1)=img;
figure;
imshow(img_final);
imwrite(img_final, 'cheesBoard.bmp');
也是参考着人家博客改的贴一下链接
希望后边遇到这样问题的小伙伴少走点弯路,真的太痛苦了,后边还得想办法去移动一下设备把两个拍到一起。【痛苦面具】