最初の部分は、カメラからビデオを抽出し、フレームに分割します
記事ディレクトリ
序文
ros を使用してカメラからビデオを取得し、ビデオを各フレーム画像に分割し、RGB 画像と深度画像をそれぞれ 2 つのフォルダーに保存します。
1. ros を使用して、リアルセンス カメラから記録されたビデオを取得し、再生します。
1. ros カーネルを開きます
コードは次のとおりです (例)。
roscore
デモンストレーションは次のとおりです。
2.リアルセンスカメラの電源を入れる
コードは次のとおりです (例)。
roslaunch realsense2_camera demo_pointcloud.launch
デモンストレーションは次のとおりです。
以下に示すようにインターフェイスを開きます。
3. 現在のトピックを表示する
コードは次のとおりです (例)。
rostopic list
説明
:
"/camera/color/image_raw" は RGB イメージのトピックであり、
"/camera/depth/image_rect_raw" は深度イメージのトピックです。
4.カメラインターフェースにRGB画像と深度画像を表示
4.1 画像の追加
左下隅の「追加」をクリックすると、中央のインターフェイスが表示されます。「画像」を選択し、「OK」をクリックします。
4.2 RGB トピックの記入
左側の「画像」を展開し、「画像のトピック」に RGB 画像のトピックを入力すると、RGB 画像が左下隅に正常に表示されます。
4.3 深層トピックの記入
4.1に従って追加を続け、4.2に従って「画像トピック」に深度画像のトピックを記入すると、深度マップの画像も左下隅に表示されます。
5.ビデオを録画する
コード形式は: rosbag レコード + RGB 画像のトピック + スペース + 深度画像のトピック -O + パス/ファイル名
rosbag record /camera/color/image_raw /camera/depth/image_rect_raw -O /home/midea/video/1
デモンストレーションは次のとおりです。
このコード行を実行して、記録を開始します。
「ctrl+c」を押して記録を停止します。
記録後、指定したディレクトリに「1.bag」ファイルが作成されます。
注: ビデオを録画するためのコードは、大文字の O です。
補充する 大文字の O と小文字の O の違い:
- 小文字の o は、デフォルトで録音時間でファイルに名前を付けます
rosbag record /camera/color/image_raw /camera/depth/image_rect_raw -o /home/midea/video/
時間にちなんで名付けられたバッグファイルがあることがわかります: _2022-12-23-17-48-10.bag
後ろにカスタム名を入力すると:
rosbag record /camera/color/image_raw /camera/depth/image_rect_raw -o /home/midea/video/2
これにより、元の時間の前にカスタム名が追加されます: 2_2022-12-23-17-54-51.bag (まだ記録中であり、記録が終了しているため、サフィックス「.active」がここに追加されます) 「.active」サフィックスが消えます。
- Capital O は、ファイル名をカスタム名
コードに変更できます。
rosbag record /camera/color/image_raw /camera/depth/image_rect_raw -O /home/midea/video/3
効果は次のとおりです。
6. 録画したビデオを再生する
ビデオを再生する前に、カメラに接続されているデータ ケーブルを取り外します。
次に、次のコードを入力します。
rosbag play /home/midea/video/1.bag
カメラ表示インターフェースの左下隅に、記録されたコンテンツが表示されます。
2. トピックを表示する別の方法
rqt_image_view
このコードを入力して、スレッドを表示するインターフェイスを開きます。
ここで記録されたスレッドを表示することもできます。
3. ビデオを各フレームに分割し、RGB 画像と深度画像を別々に保存します
ファイル名: bag2tum.py
コード:
#!/usr/bin/env python
# # coding:utf-8
# Extract images from a bag file.
#PKG = 'beginner_tutorials'
import argparse
import roslib; #roslib.load_manifest(PKG)
import rosbag
import rospy
import cv2
from sensor_msgs.msg import Image
from cv_bridge import CvBridge
from cv_bridge import CvBridgeError
# Reading bag filename from command line or roslaunch parameter.
import os
#import sys
class ImageCreator():
def __init__(self):
self.bridge = CvBridge()
with rosbag.Bag(bag_file, 'r') as bag: #要读取的bag文件;
for topic,msg,t in bag.read_messages():
#print(t)
if topic == "/camera/color/image_raw": #图像的rgb topic;
try:
cv_image = self.bridge.imgmsg_to_cv2(msg,"bgr8")
except CvBridgeError as e:
print (e)
timestr = "%.6f" % msg.header.stamp.to_sec()
#%.6f表示小数点后带有6位,可根据精确度需要修改;
image_name = timestr+ ".png" #图像命名:时间戳.png
cv2.imwrite(rgb_path + image_name, cv_image) #保存;
with open(rgbstamp, 'a') as rgb_time_file:
rgb_time_file.write(timestr+" rgb/"+image_name+"\n")
elif topic == "/camera/depth/image_rect_raw": #图像的depth topic;
try:
cv_image = self.bridge.imgmsg_to_cv2(msg,"16UC1")
except CvBridgeError as e:
print (e)
timestr = "%.6f" % msg.header.stamp.to_sec()
#%.6f表示小数点后带有6位,可根据精确度需要修改;
image_name = timestr+ ".png" #图像命名:时间戳.png
cv2.imwrite(depth_path + image_name, cv_image) #保存;
with open(depthstamp, 'a') as depth_time_file:
depth_time_file.write(timestr+" depth/"+image_name+"\n")
if __name__ == '__main__':
#rospy.init_node(PKG)
try:
bag_file=input('请输入文件路径:')
new_dataset_path=input('请输入生成数据集路径:')
rgb_path = new_dataset_path+'/rgb/'
depth_path= new_dataset_path+'/depth/'
rgbstamp= new_dataset_path+'/rgb.txt'
depthstamp= new_dataset_path+'/depth.txt'
if not os.path.exists(rgb_path):
os.makedirs(rgb_path)
if not os.path.exists(depth_path):
os.makedirs(depth_path)
image_creator = ImageCreator()
except rospy.ROSInterruptException:
pass
独自の RGB 画像と深度画像のトピック パスを変更するには、次の 2 行のコードを変更する必要があります。
if topic == "/camera/color/image_raw": #图像的rgb topic;
elif topic == "/camera/depth/image_rect_raw": #图像的depth topic;
コードが配置されているフォルダーのターミナルでこのコードを実行します。実行するコマンドは次のとおりです。
python bag2tum.py
ここでエラーを報告します。問題
ありません。「python」を「python3」に変更してから、ファイル パスの入力を求め、記録されたバッグ ファイルのパスを入力し、Enter キーを押します。
生成されたデータセットを保存するパスを入力します。
Enter キーを押すと、生成されたコンテンツを対応するディレクトリで表示できます。
深度画像と RGB 画像はそれぞれ別のフォルダーに保存されます。depth.txt と rgb.txt は 2 列の情報を保存します。最初の列は記録されたタイムスタンプ、2 番目の列は記録されたタイムスタンプです。列は画像へのパスです。
要約する
この時点で、カメラから RGB 画像と深度画像を抽出する手順は完了です。