MP4-Video in eine Rosbag-Datei konvertieren (Bildkomprimierungsformat)

Inhaltsverzeichnis

Zweck

Umfeld

Die wichtigsten Schritte

Erstellen Sie eine Py-Datei

Führen Sie die py-Datei aus

Wirkung

 Programmerklärung

Nachträgliche Anpassungen


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

Supongo que te gusta

Origin blog.csdn.net/weixin_56337147/article/details/135213340
Recomendado
Clasificación