目次
Intel RealSense D435 深度カメラの概要:
公式インテルマニュアル: 最適なパフォーマンスを得るために深度カメラを調整する
画像が適切に露出していることを確認してください (露出が低いとパフォーマンスが低下する最大の原因です)
Intel RealSense D435 深度カメラの概要:
ステレオ赤外線センサーのペア (ステレオ IR ペア) +赤外線レーザー エミッター (IR プロジェクター) + RGB カメラ
RGB カメラの解像度は 20 メガピクセルで、3D センサーは 30 フレーム/秒で最大 1280 × 720 の解像度、または 90 フレーム/秒で 848 × 480 の低解像度を提供できます。深度距離は0.1m~10m、視野角は85×58度です。
動作原理: 左右の赤外線カメラ (受信機) は 2 つのデシベル画像、つまり左右の IR グレースケール画像を生成します。中央の赤外線ドット マトリックス エミッター (赤外線スペックル) は補助光に相当し、点群は得られる。赤外線ドットマトリクスエミッタの強度は調整可能で、発光の有無も調整可能で、電源を入れずに深度を測定することもできますが、効果は良好ではありません。一番右の rgb カメラはカラー画像のキャプチャに使用され、最終的にカラー ビデオ ストリームを深度ストリームと位置合わせすることができます。
測距原理は一般的な双眼カメラと同じで、左右の画像の視差から距離を算出します。ただし、通常のカラー rgb カメラと比較して、赤外線 ir カメラは、ターゲットから返される赤外線を受信し、左右 2 つの赤外線グレースケール画像を取得するために使用されます。部屋の照明がオフになっている暗い環境では、赤外線 ir カメラでも深度画像を生成できますが、品質は若干低下します。
視差は現在 D400 シリーズでのみ利用可能であり、視差を制御するコントロールを使用して変更できます。(アドバンストモード)
左右の赤外線画像について:
- 同じインライン関数を持っています
- 歪みなし
- 2 つの画像間で回転なし (恒等行列)
- 1 つの軸のみでの 2 つの画像間の変換 (
translation[1]、
translation[2]为零
) - ピクセル座標の y 成分は、これら 2 つの画像間で互換的に使用できます (ステレオ補正は適切に機能します)。
ピクセル深度の取得について:
ステレオ視差は、逆線形関係を通じて深度に関連付けられており、記録された視差が 1 である点の距離は、 1 / rs2_get_ Depth_scale(...) を介してクエリできます。以下は、深さをピクセル単位でメートル単位で取得する方法を示しています。
c++:
const float scale = rs2_get_depth_scale(sensor, NULL);
const uint16_t * image = (const uint16_t *)rs2_get_frame_data(frame, NULL);
float depth_in_meters = 1 / (scale * image[pixel_index]);
Intel RealSense 用のさまざまなツール:
- 取得できる生データは以下のとおりです。
- カラー画像、2Dカラー画像
- 点群xyz
- テクスチャ イメージ、点群テクスチャのカラー イメージは、点群 xyz (または深度イメージ) と位置合わせされます。
- 点群xyzとテクスチャ画像を組み合わせて得られる点群xyz rgb
- IR 左画像、左 IR グレースケール画像
- ir 右画像、右 ir グレースケール画像
ツールの紹介
- 深度キャリブレーション: Intel RealSense カメラ用の深度品質ツールは、z 方向の深度データが正確かどうかをテストするために使用されます。rgbd カメラを白い壁などに直接向けて、巻尺で測定された距離を比較するだけです。ソフトウェアに表示される距離により、カメラを校正する必要があるかどうかを判断します。
- Intel RealSense D400 シリーズ ダイナミック キャリブレーション ソフトウェア ツール これはキャリブレーション ツールです。以前に計算された距離が不正確な場合は、このソフトウェアを使用してキャリブレーションできます。Apple または Android スマートフォンで RealSense ソフトウェアを検索し、インストールして開き、キャリブレーションを実行します。チェッカーボードに似たボードが表示されます。次に、キャリブレーション ツールを使用して、上記のプロンプトに従って携帯電話を振ってキャリブレーションし、外部基準 R\T を出力します。
カメラの基本操作
詳細については、公式 Web サイトを参照してください。
RealSense SDK 2.0 のプロジェクション · IntelRealSense/librealsense Wiki (github.com)
カメラのセルフキャリブレーション
詳細については、公式 Web サイトをご覧ください。
D400 シリーズ深度カメラ用インテル® RealSense™ セルフキャリブレーション
この図は、ビューア上でキャリブレーションを実行した場合、誤差が一定の値未満の場合は無視できることを意味します。
キャリブレーション中にエラーが発生した場合: 十分な有効な深度ピクセルがない可能性があります。通常、これはプロジェクターの電源が入っていることを確認することで解決できます。
カメラパラメータを取得する
python脚本
# 注意!!!通过python script获取内参一定要看好自己到底用了哪个video stream
import pyrealsense2 as rs
pipeline = rs.pipeline()
config = rs.config()
config.enable_stream(rs.stream.depth, 640, 480, rs.format.z16, 30)
config.enable_stream(rs.stream.color, 640, 480, rs.format.rgb8, 30)
cfg = pipeline.start(config)
time.sleep(1)
profile = cfg.get_stream(rs.stream.depth) # 获取深度流的配置文件
intr = profile.as_video_stream_profile().get_intrinsics() # 向下播放到视频流并获取内在信息
print(intr) # 获取内参 width: 640, height: 480, ppx: 319.115, ppy: 234.382, fx: 597.267, fy: 597.267, model: Brown Conrady, coeffs: [0, 0, 0, 0, 0] 319.1151428222656
print(intr.ppx) # 获取指定某个内参
Linuxコマンドライン
rs-sensor-control
カメラが起動して画面が表示されます
import pyrealsense2 as rs
pipeline = rs.pipeline()
config = rs.config()
config.enable_stream(rs.stream.depth, 640, 480, rs.format.z16, 30)
config.enable_stream(rs.stream.color, 640, 480, rs.format.rgb8, 30)
pipeline.start(config)
time.sleep(1)
frames = pipeline.wait_for_frames()
depth_frame = frames.get_depth_frame()
color_frame = frames.get_color_frame()
# Convert images to numpy arrays
depth_image = np.asanyarray(depth_frame.get_data())
color_image = np.asanyarray(color_frame.get_data())
# # Apply colormap on depth image (image must be converted to 8-bit per pixel first)
# depth_colormap = cv2.applyColorMap(cv2.convertScaleAbs(depth_image, alpha=0.03), cv2.COLORMAP_JET)
#
# # Stack both images horizontally
# images = np.hstack((color_image, depth_colormap))
#
# # Show images
# cv2.namedWindow('RealSense', cv2.WINDOW_AUTOSIZE)
# cv2.imshow('RealSense', images)
# cv2.waitKey(1)
fig, axes = plt.subplots(1, 2)
for ax, im in zip(axes, [color_image, depth_image]):
ax.imshow(im)
ax.axis('off')
plt.show()
pipeline.stop()
深度画像を取得する
関数を使用して 2D ピクセル座標から 3D 座標にマッピングするには、そのピクセルの深さ (メートル単位) の知識が必要です。以下は、メートル単位のピクセルで深度を取得する方法を示しています。
パイソン:
dpt_frame = pipe.wait_for_frames().get_depth_frame().as_depth_frame()
pixel_distance_in_meters = dpt_frame.get_distance(x,y)
デバイスが特定の画像ピクセルの深度を決定できない場合、値 0 が深度画像に保存されます。これは「深みがない」という意味です。C++ では深度スケールを変更できます。(Pythonでも動くようです)
点群
pyrealsense2 は、深度とカラー フレームから点群と対応するテクスチャ マップを作成するための処理ブロックを提供します。深度画像から作成された点群は、深度ストリームの 3D 座標系の点のセットです。点群オブジェクトを作成する方法は次のとおりです。
パイソン:
import pyrealsense2 as rs
pc = rs.pointcloud()
points = pc.calculate(depth_frame)
pc.map_to(color_frame)
フレームの位置合わせ
通常、カラー画像と深度画像を扱う場合、各ピクセルを一方の画像からもう一方の画像にマッピングする必要があります。
import pyrealsense2 as rs
align = rs.align(rs.stream.color)
aligned_frames = align.proccess(depth_and_color_frameset)
color_frame = aligned_frames.first(rs.stream.color)
aligned_depth_frame = aligned_frames.get_depth_frame()
公式インテルマニュアル: 最適なパフォーマンスを得るために深度カメラを調整する
最高のパフォーマンスを得るために深度カメラを調整する (intelrealsense.com)
最初はカメラの最高の深度解像度で実行します
- Intel RealSense シリーズ D435:848*480
- 深さの精度を犠牲にして、より低い解像度を使用することもできます。ステレオ深度センサーの深度測定性能は、左右の画像内のオブジェクトの位置を一致させる機能から生まれます。入力解像度が高いほど、入力画像の品質が向上し、深度の精度も向上します。
- アプリケーションで計算上の理由から低解像度が必要な場合は、後処理アルゴリズムを使用して、データを受信したらすぐに高解像度の深度とカラー画像をサブサンプリング (間引き) することをお勧めします。D4xx カメラを低解像度モードにする唯一の説得力のある理由は次のとおりです。
- 最小動作範囲を縮小します。これは、xy 解像度に応じて拡大されます。
- USB3.0 バスの帯域幅を減らします。たとえば、帯域幅の制限に達した場合に、より多くのカメラを同時に実行できるようにします。
画像が適切に露出していることを確認してください (露出が低いとパフォーマンスが低下する最大の原因です)
自動露出が適切かどうかを確認し、適切でない場合は手動露出に切り替えて、左右のグレースケール画像が適切であることを確認します。露出が低いことがパフォーマンス低下の最大の原因です。
一般に、GAIN=16 (最低設定) を維持しながら最良の結果を得るために、最初に露出を調整することをお勧めします。ゲインを増やすと電子ノイズが発生する傾向があり、カラー画像の見た目は良くなりますが、深度の品質は低下します。露光単位はマイクロ秒なので、33000 は 33 ミリ秒です。画像の露出オーバーは露出不足と同じくらい悪い場合があるため、適切な露出を見つけるように注意してください。
自動露出機能の使い方については公式マニュアルをご覧ください。
後処理
Intel は深度画像の後処理を行わず、他のアプリケーションに任せます。SDK2.0 にはいくつかの簡単な後処理オプションがあり、通常は次の処理手順を伴います。
- サブサンプリング: キャプチャ後に xy 解像度を下げると、多くの場合、より高レベルの計算を減らすことができます。解像度が 2 倍低下すると、後処理速度が 4 倍向上します。さらに、サブサンプリングを使用すると、ゼロ以外の平均関数またはゼロ以外の中央値関数を使用して、データの基本的な穴埋めと平滑化を行うことができます。最後に、サブサンプリングは点群の視覚化にも実際に役立ちます。
- 時間的フィルタリング: 時間的平均化を使用して深度を改善します。深度データには時間的ノイズが存在します。IIR フィルターを推奨します。ただし、場合によっては、「永続化」を使用することも有益な場合があります。
- エッジ保持フィルタリング: 深度ノイズを滑らかにし、表面をより平坦にしながらエッジを保持します。これを視差ドメイン (つまり、深度スケールが 1/距離) で実行し、意図した用途に最適になるまでステップ サイズのしきい値を徐々に増やして実験することをお勧めします。成功するもう 1 つの後処理手法は、RGB 画像によって導かれるドメイン変換フィルターまたは双線形フィルターを使用することです。これは、たとえばエッジをシャープにするのに役立ちます。
- 穴埋め: 隣接する値または RGB 画像に基づいた最良の推測で穴を埋める必要があります
深さのステップを変更する
詳細モード API の「深度単位」を変更する必要がある場合があります。デフォルトでは、D4 VPU は 1000um (1mm) の深さ単位で 16 ビットの深さを提供します。これは、最大射程が約 65 メートルになることを意味します。ただし、これをたとえば 5000um に変更すると、深度は最大 5x65 = 325m として報告されます。
カラーカメラ
アドバンテージ:
- ピクセルは完全に位置合わせされ、調整され、深度マップでオーバーレイされます
- 完璧な時間同期
- 追加のオーバーヘッドを発生させずに色を深度に合わせて調整します
- 完全に位置合わせされているため、追加のオクルージョン アーティファクトは生成されません。
欠点:
- プロジェクターがオンの場合、通常はプロジェクター パターンが表示されます。
太陽光を利用しますが、まぶしさは避けてください
- 太陽光はセンサーのノイズを軽減し、オブジェクトの質感を「引き出す」傾向があります。さらに、露出を 1ms 近くまで減らすことができるため、モーション アーティファクトも軽減されます。その結果、Intel RealSense D4xx カメラは太陽光の下で実際に非常に優れたパフォーマンスを発揮します。
- 注意すべき問題の 1 つは、太陽または太陽の近くを指すときのレンズ フレアです。レンズフレアのリスクを軽減するために、バッフルでレンズを保護することをお勧めします。
- 特に太陽や太陽の反射が画像内に見える場合は、自動露出には十分注意してください。デフォルトでは、自動露出アルゴリズムは画像全体の平均強度を特定の範囲内に維持しようとします。その画像に太陽が含まれていると、他のすべてが突然黒くなります。自律型ロボットや自動車などの多くのアプリケーションでは、自動露出アルゴリズムの対象領域をより小さいサイズ、具体的には画像の下半分に変更するだけで役立ちます。