Inhaltsverzeichnis
Zweck
Konvertieren Sie die von der Kamera aufgezeichneten Dateien im MP4-Format in Dateien im Taschenformat, die vom ROS-System verwendet werden können.
Umfeld
ROS und Python2 installiert
Die wichtigsten Schritte
Erstellen Sie eine Py-Datei
Erstellen Sie eine neue Python-Datei Video2ROSbag.py
#this is ok
# -*- coding: utf-8 -*-
import rosbag
import cv2
from sensor_msgs.msg import CompressedImage
from cv_bridge import CvBridge
import rospy
def video_to_bag(video_path, output_bag):
bag = rosbag.Bag(output_bag, 'w')
cap = cv2.VideoCapture(video_path)
cb = CvBridge()
prop_fps = cap.get(cv2.CAP_PROP_FPS)
if prop_fps != prop_fps or prop_fps <= 1e-2:
print "Warning: can't get FPS. Assuming 24."
prop_fps = 24
prop_fps = 24
ret = True
frame_id = 0
while ret:
ret, frame = cap.read()
if not ret:
break
stamp = rospy.rostime.Time.from_sec(float(frame_id) / prop_fps)
frame_id += 1
compressed_image = CompressedImage()
compressed_image.header.stamp = stamp
compressed_image.header.frame_id = "camera"
compressed_image.format = "jpeg" # 使用JPEG压缩格式
# 将图像转换为压缩格式
_, compressed_data = cv2.imencode('.jpg', frame, [int(cv2.IMWRITE_JPEG_QUALITY), 90])
compressed_image.data = compressed_data.tostring()
bag.write("/camera/image_raw/compressed", compressed_image, stamp)
bag.close()
cap.release()
# 输入视频文件和输出bag文件名
video_path = 'video2bag.mp4'
output_bag = 'video2bag.bag'
# 调用函数进行转换
video_to_bag(video_path, output_bag)
Die folgenden Parameter können bei Bedarf entsprechend geändert werden:
Videopfad video_path
Gespeicherter Bag-Dateipfad „output_bag“.
Der Themenname des Bildes, der Text ist „/camera/image_raw/compressed“.
Das Koordinatensystem des Bildes komprimiert_image.header.frame_id, der Text ist „Kamera“
Das Komprimierungsformat des Bildes ist compress_image.format, was im Text „jpeg“ ist.
Die Videobildrate prop_fps ist im Text auf 24 festgelegt und kann vom Programm nach Bedarf angepasst werden.
Führen Sie die py-Datei aus
python Video2ROSbag.py
Wirkung
Taschendateien erstellen.
Tascheninformationen anzeigen:
$rosbag info video2bag.bag
Pfad: video2bag.bag
Version: 2.0
Dauer: 6,3 s
Start: 01. Januar 1970 00:00:00,00 (0,00)
Ende: 01. Januar 1970 00:00:06,33 (6,33)
Größe: 8,1 MB
Nachrichten: 153
Komprimierung: keine [11/11 Chunks]
Typen: sensor_msgs/CompressedImage [8f7a12909da2c9d3332d540a0977563f]
Themen: /camera/image_raw/compressed 153 msgs: sensor_msgs/CompressedImage
Programmerklärung
_, compressed_data = cv2.imencode('.jpg', frame, [int(cv2.IMWRITE_JPEG_QUALITY), 90])
Das Code-Snippet „_, compress_data = cv2.imencode('.jpg', Frame, [int(cv2.IMWRITE_JPEG_QUALITY), 90])“ ist eine Codezeile, die zum Komprimieren und Kodieren von Bilddaten verwendet wird.
Konkret ruft diese Funktion die Methode „imencode()“ der OpenCV-Bibliothek auf, die zum Komprimieren und Codieren der angegebenen Bilddaten und zum Generieren entsprechender komprimierter Daten verwendet wird.
Die Bedeutung der Parameter ist wie folgt:
- „.jpg“: gibt an, dass das Komprimierungskodierungsformat das JPEG-Format ist.
- „Frame“: die ursprünglichen Bilddaten, die komprimiert und kodiert werden sollen.
- „[int(cv2.IMWRITE_JPEG_QUALITY), 90]“: Legen Sie die Qualitätsparameter der JPEG-Komprimierung fest, d. h. stellen Sie die Qualität des komprimierten Bildes auf 90 ein.
Der Rückgabewert der Funktion umfasst zwei Variablen:
- „_“: Zeigt eine ignorierte Variable an, die normalerweise zum Ignorieren von Rückgabewerten verwendet wird, die nicht verwendet werden müssen.
- „compressed_data“: Komprimierte und codierte Bilddaten, ausgedrückt in Form eines Bytestreams.
Durch diesen Funktionsaufruf können Sie eine JPEG-Komprimierungskodierung für die Originalbilddaten durchführen und die komprimierten Daten in der Variablen „compressed_data“ für die spätere Verwendung oder Übertragung speichern.
compressed_image.data = compressed_data.tostring()
Das Code-Snippet „compressed_image.data = compress_data.tostring()“ wird verwendet, um die komprimierten Bilddaten im ROS-Nachrichtenobjekt „compressed_image“ zu speichern.
Unter der Annahme, dass „compressed_data“ ein Objekt ist, das komprimierte und codierte Bilddaten enthält (normalerweise ein Bytestrom oder eine Zeichenfolge), wird es durch die Methode „tostring()“ in eine Zeichenfolgenform umgewandelt und das Ergebnis wird „compressed_image“ zugewiesen .data`. Auf diese Weise enthält „compressed_image.data“ die komprimierten Bilddaten, die übertragen oder in einer ROS-Nachricht gespeichert werden können.
Dieser Schritt wird normalerweise beim Konvertieren von Bilddaten in das ROS-Nachrichtenformat zur Übertragung, Speicherung und Verarbeitung im ROS-System durchgeführt.
bag.write("/camera/image_raw/compressed", compressed_image, stamp)
Dieses Code-Snippet „bag.write("/camera/image_raw/compressed", compress_image, stamp)“ ist eine Codezeile, die zum Schreiben von „compressed_image“-Daten in eine ROS-Bag-Datei verwendet wird.
Diese Funktion ruft die Methode „write()“ von ROS auf, um die angegebenen Nachrichtendaten in die ROS-Bag-Datei zu schreiben. Die Bedeutung der Parameter ist wie folgt:
- „/camera/image_raw/compressed“: Gibt den Namen des Themas an, in das Daten geschrieben werden, d. h. „compressed_image“-Daten werden in das Thema mit dem Namen „/camera/image_raw/compressed“ geschrieben.
- „compressed_image“: Die zu schreibenden Nachrichtendaten, also ein Objekt vom Typ „CompressedImage“.
- „Stempel“: Zeitstempel, der zum Markieren der Zeit der Nachrichtendaten verwendet wird.
Durch diesen Funktionsaufruf können Sie die „compressed_image“-Daten und den entsprechenden Zeitstempel zur anschließenden Datenwiedergabe oder -analyse in die ROS-Bag-Datei schreiben.
Nachträgliche Anpassungen
Aus dem Bild ist ersichtlich, dass der Zeitstempel seit dem 1. Januar 1970 noch angepasst werden muss.
Nachfolgende Referenz zum Konvertieren von MP4-Videos in eine Rosbag-Datei (Bildkomprimierung, Bildschirmdrehung, Zeitstempelanpassung) – CSDN-Blog