parse_pji_image.py 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  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 parse(input_bag_file, output_mp4_dir):
  60. input_dir = input_bag_file
  61. # input_dir = '/media/dell/BFAC-F22B/rapid_accel_2023-11-15-10-33-50.bag'
  62. output_dir = output_mp4_dir
  63. # output_dir = '/media/dell/BFAC-F22B/'
  64. topic = '/camera/color/image_raw'
  65. num_count = parsebag(input_dir, output_dir, topic)
  66. print("解析完成")
  67. dirt = os.path.join(output_dir, input_dir.split('/')[-1].split('.')[0] + '_' + 'image')
  68. # print(dirt)
  69. bagtime = int(input_dir.split('/')[-1].split('.')[0].split('_')[-1])
  70. hz = str(float(num_count / bagtime))
  71. print(hz)
  72. command = ['ffmpeg', '-f', 'image2', '-r', hz, '-pattern_type', 'glob', '-i'] + [dirt + '/*.jpg'] + ['-tag:v',
  73. 'avc1',
  74. '-y'] + [
  75. dirt + '/camera.mp4']
  76. p = Popen(command, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
  77. p.communicate()
  78. list1 = os.listdir(dirt)
  79. for i in list1:
  80. if i.split('.')[-1] == 'jpg':
  81. os.remove(os.path.join(dirt, i))
  82. return dirt