web-dev-qa-db-ja.com

デプスマップを3Dポイントクラウドに変換する方法は?

デプスマップを3Dポイントクラウドに変換すると、スケーリング係数と呼ばれる用語があることがわかりました。誰かが私にスケーリング係数が実際に何であるかについていくつかの考えを与えることができますか?倍率と焦点距離の間に関係はありますか?コードは次のとおりです。

import argparse
import sys
import os
from PIL import Image

focalLength = 938.0
centerX = 319.5
centerY = 239.5
scalingFactor = 5000

def generate_pointcloud(rgb_file,depth_file,ply_file):

    rgb = Image.open(rgb_file)
    depth = Image.open(depth_file).convert('I')

    if rgb.size != depth.size:
        raise Exception("Color and depth image do not have the same 
resolution.")
    if rgb.mode != "RGB":
        raise Exception("Color image is not in RGB format")
    if depth.mode != "I":
        raise Exception("Depth image is not in intensity format")


    points = []    
    for v in range(rgb.size[1]):
        for u in range(rgb.size[0]):
            color = rgb.getpixel((u,v))
            Z = depth.getpixel((u,v)) / scalingFactor
            print(Z)
            if Z==0: continue
            X = (u - centerX) * Z / focalLength
            Y = (v - centerY) * Z / focalLength
            points.append("%f %f %f %d %d %d 0\n"% 
4
d19911222

この文脈では、「スケーリング係数」は深度マップの単位とメートルの間の関係を指します。カメラの焦点距離とは何の関係もありません。

デプスマップは通常、ミリメートルスケールで16ビットの符号なし整数で格納されるため、メートル単位のZ値を取得するには、デプスマップのピクセルを1000で割る必要があります。5000というやや型破りなスケーリング係数があります。デプスマップは200マイクロメートルです。

6
taketwo