ros を使用して realsence カメラから画像を取得する

最初の部分は、カメラからビデオを抽出し、フレームに分割します


序文

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 画像と深度画像を抽出する手順は完了です。

おすすめ

転載: blog.csdn.net/weixin_44934373/article/details/128419480