parse_pji_image.py 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116
  1. # coding: utf-8
  2. import sys
  3. import os
  4. import rospy
  5. import rosbag
  6. import csv
  7. import cv2
  8. from cv_bridge import CvBridge, CvBridgeError
  9. import argparse
  10. import struct
  11. import subprocess
  12. from subprocess import Popen, PIPE
  13. bridge = CvBridge()
  14. def parsebag(f, output_dir, target_topic):
  15. rosbag_name = f[f.rindex("/"):-4]
  16. output_path = output_dir + rosbag_name
  17. with rosbag.Bag(f, 'r') as bag:
  18. count = 0
  19. for key, val in bag.get_type_and_topic_info()[1].items():
  20. if val[0] == 'sensor_msgs/Image':
  21. for topic, msg, t in bag.read_messages(key):
  22. if topic == target_topic:
  23. img = bridge.imgmsg_to_cv2(msg, 'bgr8')
  24. # img = bridge.compressed_imgmsg_to_cv2(msg, 'bgr8')
  25. timestr = msg.header.stamp.to_nsec()
  26. image_name = str(timestr) + ".jpg"
  27. if not os.path.exists(output_path + '_' + 'image'):
  28. os.makedirs(output_path + '_' + 'image')
  29. output_path_img = os.path.join(output_path + '_' + 'image', image_name)
  30. cv2.imwrite(output_path_img, img)
  31. # print(count)
  32. count = count + 1
  33. return count
  34. def main():
  35. input_dir = sys.argv[1]
  36. # input_dir='/media/dell/BFAC-F22B/data/pujin_datareturn/pujin_robot-01_data_merge_2023-12-20-02-22-18_obstacledetection_10.bag'
  37. output_dir = sys.argv[2]
  38. # output_dir = '/media/dell/BFAC-F22B/data/pujin_datareturn'
  39. topic = '/camera/color/image_raw' # /camera/color/image_raw
  40. num_count = parsebag(input_dir, output_dir, topic)
  41. print("解析完成")
  42. dirt = os.path.join(output_dir, input_dir.split('/')[-1].split('.')[0] + '_' + 'image')
  43. # print(dirt)
  44. bagtime = int(input_dir.split('/')[-1].split('.')[0].split('_')[-1])
  45. hz = str(float(num_count / bagtime))
  46. print(hz)
  47. command = ['ffmpeg', '-f', 'image2', '-r', hz, '-pattern_type', 'glob', '-i'] + [dirt + '/*.jpg'] + ['-tag:v',
  48. 'avc1',
  49. '-y'] + [
  50. dirt + '/camera.mp4']
  51. p = Popen(command, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
  52. p.communicate()
  53. list1 = os.listdir(dirt)
  54. for i in list1:
  55. if i.split('.')[-1] == 'jpg':
  56. os.remove(os.path.join(dirt, i))
  57. if __name__ == '__main__':
  58. main()
  59. def parse1(topic, input_bag_file, output_mp4_dir):
  60. input_dir = input_bag_file
  61. output_dir = output_mp4_dir
  62. num_count = parsebag(input_dir, output_dir, topic)
  63. print("解析完成")
  64. dirt = os.path.join(output_dir, input_dir.split('/')[-1].split('.')[0] + '_' + 'image')
  65. bagtime = int(input_dir.split('/')[-1].split('.')[0].split('_')[-1])
  66. hz = str(float(num_count / bagtime))
  67. print(hz)
  68. command = ['ffmpeg', '-f', 'image2', '-r', hz, '-pattern_type', 'glob', '-i'] + [dirt + '/*.jpg'] + ['-tag:v',
  69. 'avc1',
  70. '-y'] + [
  71. dirt + '/camera.mp4']
  72. p = Popen(command, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
  73. p.communicate()
  74. list1 = os.listdir(dirt)
  75. for i in list1:
  76. if i.split('.')[-1] == 'jpg':
  77. os.remove(os.path.join(dirt, i))
  78. return dirt
  79. def parse2(topic, input_bag_file, output_mp4_dir):
  80. input_dir = input_bag_file
  81. output_dir = output_mp4_dir
  82. num_count = parsebag(input_dir, output_dir, topic)
  83. print("解析完成")
  84. dirt = os.path.join(output_dir, input_dir.split('/')[-1].split('.')[0] + '_' + 'image')
  85. bagtime = int(input_dir.split('/')[-1].split('.')[0].split('_')[-1])
  86. hz = str(float(num_count / bagtime))
  87. print(hz)
  88. command = ['ffmpeg', '-f', 'image2', '-r', hz, '-pattern_type', 'glob', '-i'] + [dirt + '/*.jpg'] + ['-tag:v',
  89. 'avc1',
  90. '-y'] + [
  91. dirt + '/camera2.mp4']
  92. p = Popen(command, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
  93. p.communicate()
  94. list1 = os.listdir(dirt)
  95. for i in list1:
  96. if i.split('.')[-1] == 'jpg':
  97. os.remove(os.path.join(dirt, i))
  98. return dirt