我试图创建结构光三维扫描仪。
摄像机标定
相机校准是OpenCV官方教程的拷贝。由于我有相机的内在参数(camera matrix)。
投影仪校准
投影仪的标定可能是不正确的,但过程是:投影仪显示棋盘图案和摄像机从不同角度拍摄一些照片。图像是带有摄像机参数的cv.undistored,然后用OpenCV官方教程对结果图像进行标定。因此,我有投影仪的内在参数(projector matrix)。
旋转和过渡
从cv.calibrate,我有旋转矢量和过渡向量作为结果,但是向量计数等于图像计数,而且我认为它不是核心向量,因为我在校准中移动了摄像机和投影仪。我的新想法是投射棋盘扫描背景,执行校准,以这种方式,我将有Rotation vector和Transition vector。我不知道这样做对不对。
正在扫描
扫描过程是:
用-> projector matrix ->项目模式生成->不失真模式,用相机拍摄->不失真的camera matrix照片
摄像机-投影仪像素图
我使用GrayCode模式和cv.graycode.getProjPixel,相机和投影机之间有pixels mapping。我的投影仪不是很高的分辨率和最后的模式不是很容易读。我将创建自定义函数,在不使用最后模式的情况下生成映射。
问题
我不知道如何从所有这些信息中获取depth map(Z)。我的困惑是因为有三个坐标系-相机,投影仪和世界坐标系。
如何用代码找到“Z”?我能从Z中得到图像和模式之间的pixels mapping信息吗?
拥有:信息的
p是象点,q是真实世界点(可能),R和T是旋转向量和过渡向量。如何找到R和TZ是坐标(深度),B-baseline(相机和投影机之间的距离),我可以用手测量它,但也许这不是摄像机像素和投影仪像素之间的(x-x') -距离。我不知道怎么弄基线。也许这是Transition vectorcv.getPerspectiveTransform返回3x3矩阵和cv.reprojectImageTo3D使用Q-4×4 perspective transformation matrix that can be obtained with stereoRectify。类似的问题:
you need to define a vector that goes from the camera perspective center to the pixel in the image and then rotate this vector by the camera rotation。但我不知道如何定义/找到这个vercor,并且需要Rotation vector。The only thing you have to do is to make sure that the calibration chessboard is seen by both of the cameras.,但我认为如果我设计棋盘模式,它将被墙(射影变换)所厌恶。有许多其他资源,我将更新列表与评论。我错过了一些东西,我想不出如何实现它。
发布于 2022-02-24 12:05:20
假设p(x,y)是像点,视差为(x-x')。你可以得到深度点,
disparity = x-x_ # x-x'
point_and_disparity = np.array([[[x, y, disparity]]], dtype=np.float32)
depth = cv2.perspectiveTransform(point_and_disparity, q_matrix)https://stackoverflow.com/questions/71203311
复制相似问题