pybaseutils 2.4.14__tar.gz → 2.4.16__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (328) hide show
  1. {pybaseutils-2.4.14 → pybaseutils-2.4.16}/PKG-INFO +1 -1
  2. {pybaseutils-2.4.14 → pybaseutils-2.4.16}/pybaseutils/__init__.py +1 -1
  3. pybaseutils-2.4.16/pybaseutils/cvutils/camera.py +182 -0
  4. {pybaseutils-2.4.14 → pybaseutils-2.4.16}/pybaseutils/cvutils/video_utils.py +4 -1
  5. {pybaseutils-2.4.14 → pybaseutils-2.4.16}/pybaseutils.egg-info/PKG-INFO +1 -1
  6. {pybaseutils-2.4.14 → pybaseutils-2.4.16}/pybaseutils.egg-info/SOURCES.txt +1 -0
  7. pybaseutils-2.4.16/test_py/camera.py +194 -0
  8. pybaseutils-2.4.14/pybaseutils/cvutils/camera.py +0 -112
  9. {pybaseutils-2.4.14 → pybaseutils-2.4.16}/LICENCE +0 -0
  10. {pybaseutils-2.4.14 → pybaseutils-2.4.16}/README.md +0 -0
  11. {pybaseutils-2.4.14 → pybaseutils-2.4.16}/pybaseutils/audio/__init__.py +0 -0
  12. {pybaseutils-2.4.14 → pybaseutils-2.4.16}/pybaseutils/audio/audio_utils.py +0 -0
  13. {pybaseutils-2.4.14 → pybaseutils-2.4.16}/pybaseutils/audio/pyaudio_utils.py +0 -0
  14. {pybaseutils-2.4.14 → pybaseutils-2.4.16}/pybaseutils/audio/vad_utils.py +0 -0
  15. {pybaseutils-2.4.14 → pybaseutils-2.4.16}/pybaseutils/base/__init__.py +0 -0
  16. {pybaseutils-2.4.14 → pybaseutils-2.4.16}/pybaseutils/base/dict_queue.py +0 -0
  17. {pybaseutils-2.4.14 → pybaseutils-2.4.16}/pybaseutils/base/list_queue.py +0 -0
  18. {pybaseutils-2.4.14 → pybaseutils-2.4.16}/pybaseutils/base/producer_consumer.py +0 -0
  19. {pybaseutils-2.4.14 → pybaseutils-2.4.16}/pybaseutils/base64_utils.py +0 -0
  20. {pybaseutils-2.4.14 → pybaseutils-2.4.16}/pybaseutils/batch_utils.py +0 -0
  21. {pybaseutils-2.4.14 → pybaseutils-2.4.16}/pybaseutils/build_utils/__init__.py +0 -0
  22. {pybaseutils-2.4.14 → pybaseutils-2.4.16}/pybaseutils/build_utils/cython_utils.py +0 -0
  23. {pybaseutils-2.4.14 → pybaseutils-2.4.16}/pybaseutils/build_utils/pyarmor_utils.py +0 -0
  24. {pybaseutils-2.4.14 → pybaseutils-2.4.16}/pybaseutils/cluster/__init__.py +0 -0
  25. {pybaseutils-2.4.14 → pybaseutils-2.4.16}/pybaseutils/cluster/kmean.py +0 -0
  26. {pybaseutils-2.4.14 → pybaseutils-2.4.16}/pybaseutils/cluster/maxmin_distance.py +0 -0
  27. {pybaseutils-2.4.14 → pybaseutils-2.4.16}/pybaseutils/cluster/similarity.py +0 -0
  28. {pybaseutils-2.4.14 → pybaseutils-2.4.16}/pybaseutils/color_utils.py +0 -0
  29. {pybaseutils-2.4.14 → pybaseutils-2.4.16}/pybaseutils/config_utils.py +0 -0
  30. {pybaseutils-2.4.14 → pybaseutils-2.4.16}/pybaseutils/converter/__init__.py +0 -0
  31. {pybaseutils-2.4.14 → pybaseutils-2.4.16}/pybaseutils/converter/build_coco.py +0 -0
  32. {pybaseutils-2.4.14 → pybaseutils-2.4.16}/pybaseutils/converter/build_cvat.py +0 -0
  33. {pybaseutils-2.4.14 → pybaseutils-2.4.16}/pybaseutils/converter/build_labelme.py +0 -0
  34. {pybaseutils-2.4.14 → pybaseutils-2.4.16}/pybaseutils/converter/build_voc.py +0 -0
  35. {pybaseutils-2.4.14 → pybaseutils-2.4.16}/pybaseutils/converter/concat_coco.py +0 -0
  36. {pybaseutils-2.4.14 → pybaseutils-2.4.16}/pybaseutils/converter/convert_coco2labelme.py +0 -0
  37. {pybaseutils-2.4.14 → pybaseutils-2.4.16}/pybaseutils/converter/convert_coco2voc.py +0 -0
  38. {pybaseutils-2.4.14 → pybaseutils-2.4.16}/pybaseutils/converter/convert_cvat2labelme.py +0 -0
  39. {pybaseutils-2.4.14 → pybaseutils-2.4.16}/pybaseutils/converter/convert_labelme2coco.py +0 -0
  40. {pybaseutils-2.4.14 → pybaseutils-2.4.16}/pybaseutils/converter/convert_labelme2cvat.py +0 -0
  41. {pybaseutils-2.4.14 → pybaseutils-2.4.16}/pybaseutils/converter/convert_labelme2labelme.py +0 -0
  42. {pybaseutils-2.4.14 → pybaseutils-2.4.16}/pybaseutils/converter/convert_labelme2voc.py +0 -0
  43. {pybaseutils-2.4.14 → pybaseutils-2.4.16}/pybaseutils/converter/convert_labelme2yolo.py +0 -0
  44. {pybaseutils-2.4.14 → pybaseutils-2.4.16}/pybaseutils/converter/convert_voc2coco.py +0 -0
  45. {pybaseutils-2.4.14 → pybaseutils-2.4.16}/pybaseutils/converter/convert_voc2labelme.py +0 -0
  46. {pybaseutils-2.4.14 → pybaseutils-2.4.16}/pybaseutils/converter/convert_voc2voc.py +0 -0
  47. {pybaseutils-2.4.14 → pybaseutils-2.4.16}/pybaseutils/converter/convert_voc2yolo.py +0 -0
  48. {pybaseutils-2.4.14 → pybaseutils-2.4.16}/pybaseutils/converter/convert_yolo2labelme.py +0 -0
  49. {pybaseutils-2.4.14 → pybaseutils-2.4.16}/pybaseutils/converter/convert_yolo2voc.py +0 -0
  50. {pybaseutils-2.4.14 → pybaseutils-2.4.16}/pybaseutils/converter/prelabelme.py +0 -0
  51. {pybaseutils-2.4.14 → pybaseutils-2.4.16}/pybaseutils/coords_utils.py +0 -0
  52. {pybaseutils-2.4.14 → pybaseutils-2.4.16}/pybaseutils/cvutils/__init__.py +0 -0
  53. {pybaseutils-2.4.14 → pybaseutils-2.4.16}/pybaseutils/cvutils/corner_utils.py +0 -0
  54. {pybaseutils-2.4.14 → pybaseutils-2.4.16}/pybaseutils/cvutils/monitor.py +0 -0
  55. {pybaseutils-2.4.14 → pybaseutils-2.4.16}/pybaseutils/cvutils/mouse_utils.py +0 -0
  56. {pybaseutils-2.4.14 → pybaseutils-2.4.16}/pybaseutils/cvutils/nms_utils.py +0 -0
  57. {pybaseutils-2.4.14 → pybaseutils-2.4.16}/pybaseutils/data_utils.py +0 -0
  58. {pybaseutils-2.4.14 → pybaseutils-2.4.16}/pybaseutils/dataloader/__init__.py +0 -0
  59. {pybaseutils-2.4.14 → pybaseutils-2.4.16}/pybaseutils/dataloader/balanced_classes.py +0 -0
  60. {pybaseutils-2.4.14 → pybaseutils-2.4.16}/pybaseutils/dataloader/base_coco.py +0 -0
  61. {pybaseutils-2.4.14 → pybaseutils-2.4.16}/pybaseutils/dataloader/base_dataset.py +0 -0
  62. {pybaseutils-2.4.14 → pybaseutils-2.4.16}/pybaseutils/dataloader/data_resample.py +0 -0
  63. {pybaseutils-2.4.14 → pybaseutils-2.4.16}/pybaseutils/dataloader/parser_coco_det.py +0 -0
  64. {pybaseutils-2.4.14 → pybaseutils-2.4.16}/pybaseutils/dataloader/parser_coco_ins.py +0 -0
  65. {pybaseutils-2.4.14 → pybaseutils-2.4.16}/pybaseutils/dataloader/parser_coco_kps.py +0 -0
  66. {pybaseutils-2.4.14 → pybaseutils-2.4.16}/pybaseutils/dataloader/parser_image_folder.py +0 -0
  67. {pybaseutils-2.4.14 → pybaseutils-2.4.16}/pybaseutils/dataloader/parser_image_text.py +0 -0
  68. {pybaseutils-2.4.14 → pybaseutils-2.4.16}/pybaseutils/dataloader/parser_labelme.py +0 -0
  69. {pybaseutils-2.4.14 → pybaseutils-2.4.16}/pybaseutils/dataloader/parser_labelme_crop.py +0 -0
  70. {pybaseutils-2.4.14 → pybaseutils-2.4.16}/pybaseutils/dataloader/parser_labelme_line.py +0 -0
  71. {pybaseutils-2.4.14 → pybaseutils-2.4.16}/pybaseutils/dataloader/parser_video_folder.py +0 -0
  72. {pybaseutils-2.4.14 → pybaseutils-2.4.16}/pybaseutils/dataloader/parser_video_text.py +0 -0
  73. {pybaseutils-2.4.14 → pybaseutils-2.4.16}/pybaseutils/dataloader/parser_voc.py +0 -0
  74. {pybaseutils-2.4.14 → pybaseutils-2.4.16}/pybaseutils/dataloader/parser_yolo.py +0 -0
  75. {pybaseutils-2.4.14 → pybaseutils-2.4.16}/pybaseutils/dataloader/voc_seg_utils.py +0 -0
  76. {pybaseutils-2.4.14 → pybaseutils-2.4.16}/pybaseutils/dict_uils.py +0 -0
  77. {pybaseutils-2.4.14 → pybaseutils-2.4.16}/pybaseutils/file_utils.py +0 -0
  78. {pybaseutils-2.4.14 → pybaseutils-2.4.16}/pybaseutils/filter/QueueTable.py +0 -0
  79. {pybaseutils-2.4.14 → pybaseutils-2.4.16}/pybaseutils/filter/__init__.py +0 -0
  80. {pybaseutils-2.4.14 → pybaseutils-2.4.16}/pybaseutils/filter/demo.py +0 -0
  81. {pybaseutils-2.4.14 → pybaseutils-2.4.16}/pybaseutils/filter/kalman_filter.py +0 -0
  82. {pybaseutils-2.4.14 → pybaseutils-2.4.16}/pybaseutils/filter/mean_filter.py +0 -0
  83. {pybaseutils-2.4.14 → pybaseutils-2.4.16}/pybaseutils/filter/motion_filter.py +0 -0
  84. {pybaseutils-2.4.14 → pybaseutils-2.4.16}/pybaseutils/filter/pose_filter.py +0 -0
  85. {pybaseutils-2.4.14 → pybaseutils-2.4.16}/pybaseutils/font_style/__init__.py +0 -0
  86. {pybaseutils-2.4.14 → pybaseutils-2.4.16}/pybaseutils/font_utils.py +0 -0
  87. {pybaseutils-2.4.14 → pybaseutils-2.4.16}/pybaseutils/geometry_tools.py +0 -0
  88. {pybaseutils-2.4.14 → pybaseutils-2.4.16}/pybaseutils/heatmap_utils.py +0 -0
  89. {pybaseutils-2.4.14 → pybaseutils-2.4.16}/pybaseutils/http_utils.py +0 -0
  90. {pybaseutils-2.4.14 → pybaseutils-2.4.16}/pybaseutils/image_utils.py +0 -0
  91. {pybaseutils-2.4.14 → pybaseutils-2.4.16}/pybaseutils/json_utils.py +0 -0
  92. {pybaseutils-2.4.14 → pybaseutils-2.4.16}/pybaseutils/log.py +0 -0
  93. {pybaseutils-2.4.14 → pybaseutils-2.4.16}/pybaseutils/log_utils.py +0 -0
  94. {pybaseutils-2.4.14 → pybaseutils-2.4.16}/pybaseutils/media/__init__.py +0 -0
  95. {pybaseutils-2.4.14 → pybaseutils-2.4.16}/pybaseutils/media/ffmpeg_utils.py +0 -0
  96. {pybaseutils-2.4.14 → pybaseutils-2.4.16}/pybaseutils/metrics/__init__.py +0 -0
  97. {pybaseutils-2.4.14 → pybaseutils-2.4.16}/pybaseutils/metrics/accuracy.py +0 -0
  98. {pybaseutils-2.4.14 → pybaseutils-2.4.16}/pybaseutils/metrics/average_meter.py +0 -0
  99. {pybaseutils-2.4.14 → pybaseutils-2.4.16}/pybaseutils/metrics/class_report.py +0 -0
  100. {pybaseutils-2.4.14 → pybaseutils-2.4.16}/pybaseutils/metrics/plot_pr.py +0 -0
  101. {pybaseutils-2.4.14 → pybaseutils-2.4.16}/pybaseutils/metrics/plot_roc.py +0 -0
  102. {pybaseutils-2.4.14 → pybaseutils-2.4.16}/pybaseutils/nets_utils.py +0 -0
  103. {pybaseutils-2.4.14 → pybaseutils-2.4.16}/pybaseutils/numpy_utils.py +0 -0
  104. {pybaseutils-2.4.14 → pybaseutils-2.4.16}/pybaseutils/pandas_utils.py +0 -0
  105. {pybaseutils-2.4.14 → pybaseutils-2.4.16}/pybaseutils/plot_utils.py +0 -0
  106. {pybaseutils-2.4.14 → pybaseutils-2.4.16}/pybaseutils/pose/__init__.py +0 -0
  107. {pybaseutils-2.4.14 → pybaseutils-2.4.16}/pybaseutils/pose/bones_utils.py +0 -0
  108. {pybaseutils-2.4.14 → pybaseutils-2.4.16}/pybaseutils/pose/human_pose.py +0 -0
  109. {pybaseutils-2.4.14 → pybaseutils-2.4.16}/pybaseutils/pose/pose_utils.py +0 -0
  110. {pybaseutils-2.4.14 → pybaseutils-2.4.16}/pybaseutils/pycpp/__init__.py +0 -0
  111. {pybaseutils-2.4.14 → pybaseutils-2.4.16}/pybaseutils/pycpp/demo.py +0 -0
  112. {pybaseutils-2.4.14 → pybaseutils-2.4.16}/pybaseutils/pycpp/main.py +0 -0
  113. {pybaseutils-2.4.14 → pybaseutils-2.4.16}/pybaseutils/server/__init__.py +0 -0
  114. {pybaseutils-2.4.14 → pybaseutils-2.4.16}/pybaseutils/server/apm_server.py +0 -0
  115. {pybaseutils-2.4.14 → pybaseutils-2.4.16}/pybaseutils/setup_config.py +0 -0
  116. {pybaseutils-2.4.14 → pybaseutils-2.4.16}/pybaseutils/singleton_utils.py +0 -0
  117. {pybaseutils-2.4.14 → pybaseutils-2.4.16}/pybaseutils/text_utils.py +0 -0
  118. {pybaseutils-2.4.14 → pybaseutils-2.4.16}/pybaseutils/thread_utils.py +0 -0
  119. {pybaseutils-2.4.14 → pybaseutils-2.4.16}/pybaseutils/time_utils.py +0 -0
  120. {pybaseutils-2.4.14 → pybaseutils-2.4.16}/pybaseutils/tracemalloc_utils.py +0 -0
  121. {pybaseutils-2.4.14 → pybaseutils-2.4.16}/pybaseutils/tracemalloc_utils2.py +0 -0
  122. {pybaseutils-2.4.14 → pybaseutils-2.4.16}/pybaseutils/tracking/QueueTable.py +0 -0
  123. {pybaseutils-2.4.14 → pybaseutils-2.4.16}/pybaseutils/tracking/__init__.py +0 -0
  124. {pybaseutils-2.4.14 → pybaseutils-2.4.16}/pybaseutils/tracking/demo.py +0 -0
  125. {pybaseutils-2.4.14 → pybaseutils-2.4.16}/pybaseutils/tracking/kalman_filter.py +0 -0
  126. {pybaseutils-2.4.14 → pybaseutils-2.4.16}/pybaseutils/tracking/mean_filter.py +0 -0
  127. {pybaseutils-2.4.14 → pybaseutils-2.4.16}/pybaseutils/tracking/motion_filter.py +0 -0
  128. {pybaseutils-2.4.14 → pybaseutils-2.4.16}/pybaseutils/tracking/pose_filter.py +0 -0
  129. {pybaseutils-2.4.14 → pybaseutils-2.4.16}/pybaseutils/transforms/__init__.py +0 -0
  130. {pybaseutils-2.4.14 → pybaseutils-2.4.16}/pybaseutils/transforms/affine_transform.py +0 -0
  131. {pybaseutils-2.4.14 → pybaseutils-2.4.16}/pybaseutils/transforms/build_transform.py +0 -0
  132. {pybaseutils-2.4.14 → pybaseutils-2.4.16}/pybaseutils/transforms/face_alignment.py +0 -0
  133. {pybaseutils-2.4.14 → pybaseutils-2.4.16}/pybaseutils/transforms/imgaug_utils.py +0 -0
  134. {pybaseutils-2.4.14 → pybaseutils-2.4.16}/pybaseutils/transforms/transform_utils.py +0 -0
  135. {pybaseutils-2.4.14 → pybaseutils-2.4.16}/pybaseutils/web/__init__.py +0 -0
  136. {pybaseutils-2.4.14 → pybaseutils-2.4.16}/pybaseutils/web/app_gradio_image.py +0 -0
  137. {pybaseutils-2.4.14 → pybaseutils-2.4.16}/pybaseutils/web/app_stweb_image.py +0 -0
  138. {pybaseutils-2.4.14 → pybaseutils-2.4.16}/pybaseutils/web/app_webio_image.py +0 -0
  139. {pybaseutils-2.4.14 → pybaseutils-2.4.16}/pybaseutils/web/demo.py +0 -0
  140. {pybaseutils-2.4.14 → pybaseutils-2.4.16}/pybaseutils/word_utils.py +0 -0
  141. {pybaseutils-2.4.14 → pybaseutils-2.4.16}/pybaseutils/worker.py +0 -0
  142. {pybaseutils-2.4.14 → pybaseutils-2.4.16}/pybaseutils/yaml_utils.py +0 -0
  143. {pybaseutils-2.4.14 → pybaseutils-2.4.16}/pybaseutils.egg-info/dependency_links.txt +0 -0
  144. {pybaseutils-2.4.14 → pybaseutils-2.4.16}/pybaseutils.egg-info/not-zip-safe +0 -0
  145. {pybaseutils-2.4.14 → pybaseutils-2.4.16}/pybaseutils.egg-info/top_level.txt +0 -0
  146. {pybaseutils-2.4.14 → pybaseutils-2.4.16}/setup.cfg +0 -0
  147. {pybaseutils-2.4.14 → pybaseutils-2.4.16}/setup.py +0 -0
  148. {pybaseutils-2.4.14 → pybaseutils-2.4.16}/test_py/Image_enhance/__init__.py +0 -0
  149. {pybaseutils-2.4.14 → pybaseutils-2.4.16}/test_py/Image_enhance/dmeo01.py +0 -0
  150. {pybaseutils-2.4.14 → pybaseutils-2.4.16}/test_py/WebCrawler/__init__.py +0 -0
  151. {pybaseutils-2.4.14 → pybaseutils-2.4.16}/test_py/WebCrawler/search_baidu.py +0 -0
  152. {pybaseutils-2.4.14 → pybaseutils-2.4.16}/test_py/WebCrawler/search_biying.py +0 -0
  153. {pybaseutils-2.4.14 → pybaseutils-2.4.16}/test_py/__init__.py +0 -0
  154. {pybaseutils-2.4.14 → pybaseutils-2.4.16}/test_py/aije/__init__.py +0 -0
  155. {pybaseutils-2.4.14 → pybaseutils-2.4.16}/test_py/aije/action_dataset.py +0 -0
  156. {pybaseutils-2.4.14 → pybaseutils-2.4.16}/test_py/aije/build_cython.py +0 -0
  157. {pybaseutils-2.4.14 → pybaseutils-2.4.16}/test_py/aije/build_pyarmor.py +0 -0
  158. {pybaseutils-2.4.14 → pybaseutils-2.4.16}/test_py/aije/build_service.py +0 -0
  159. {pybaseutils-2.4.14 → pybaseutils-2.4.16}/test_py/aije/convert_cvat2labelme.py +0 -0
  160. {pybaseutils-2.4.14 → pybaseutils-2.4.16}/test_py/aije/convert_labelme2coco.py +0 -0
  161. {pybaseutils-2.4.14 → pybaseutils-2.4.16}/test_py/aije/convert_labelme2voc.py +0 -0
  162. {pybaseutils-2.4.14 → pybaseutils-2.4.16}/test_py/aije/copy_move.py +0 -0
  163. {pybaseutils-2.4.14 → pybaseutils-2.4.16}/test_py/aije/demo_labelme_crop_aije.py +0 -0
  164. {pybaseutils-2.4.14 → pybaseutils-2.4.16}/test_py/aije/demo_labelme_crop_ailt.py +0 -0
  165. {pybaseutils-2.4.14 → pybaseutils-2.4.16}/test_py/aije/demo_labelme_shock.py +0 -0
  166. {pybaseutils-2.4.14 → pybaseutils-2.4.16}/test_py/aije/demo_motion_blur.py +0 -0
  167. {pybaseutils-2.4.14 → pybaseutils-2.4.16}/test_py/aije/demo_video_aije.py +0 -0
  168. {pybaseutils-2.4.14 → pybaseutils-2.4.16}/test_py/aije/demo_voc_crop.py +0 -0
  169. {pybaseutils-2.4.14 → pybaseutils-2.4.16}/test_py/aije/demo_voc_vis.py +0 -0
  170. {pybaseutils-2.4.14 → pybaseutils-2.4.16}/test_py/aije/get_pair_data.py +0 -0
  171. {pybaseutils-2.4.14 → pybaseutils-2.4.16}/test_py/aije/mask_image.py +0 -0
  172. {pybaseutils-2.4.14 → pybaseutils-2.4.16}/test_py/aije/video_convertor.py +0 -0
  173. {pybaseutils-2.4.14 → pybaseutils-2.4.16}/test_py/audio/__init__.py +0 -0
  174. {pybaseutils-2.4.14 → pybaseutils-2.4.16}/test_py/audio/demo.py +0 -0
  175. {pybaseutils-2.4.14 → pybaseutils-2.4.16}/test_py/audio/main.py +0 -0
  176. {pybaseutils-2.4.14 → pybaseutils-2.4.16}/test_py/audio/main_read.py +0 -0
  177. {pybaseutils-2.4.14 → pybaseutils-2.4.16}/test_py/audio/segment.py +0 -0
  178. {pybaseutils-2.4.14 → pybaseutils-2.4.16}/test_py/audio/speechbrain_asr_indoor_prod.py +0 -0
  179. {pybaseutils-2.4.14 → pybaseutils-2.4.16}/test_py/audio/speechbrain_demo.py +0 -0
  180. {pybaseutils-2.4.14 → pybaseutils-2.4.16}/test_py/audio_demo1.py +0 -0
  181. {pybaseutils-2.4.14 → pybaseutils-2.4.16}/test_py/camera/__init__.py +0 -0
  182. {pybaseutils-2.4.14 → pybaseutils-2.4.16}/test_py/camera/demo.py +0 -0
  183. {pybaseutils-2.4.14 → pybaseutils-2.4.16}/test_py/captcha/__init__.py +0 -0
  184. {pybaseutils-2.4.14 → pybaseutils-2.4.16}/test_py/captcha/demo.py +0 -0
  185. {pybaseutils-2.4.14 → pybaseutils-2.4.16}/test_py/class_attribute.py +0 -0
  186. {pybaseutils-2.4.14 → pybaseutils-2.4.16}/test_py/class_names.py +0 -0
  187. {pybaseutils-2.4.14 → pybaseutils-2.4.16}/test_py/converter/AffectNet.py +0 -0
  188. {pybaseutils-2.4.14 → pybaseutils-2.4.16}/test_py/converter/AsianMovie.py +0 -0
  189. {pybaseutils-2.4.14 → pybaseutils-2.4.16}/test_py/converter/BITVehicle2voc.py +0 -0
  190. {pybaseutils-2.4.14 → pybaseutils-2.4.16}/test_py/converter/BSTLD2voc.py +0 -0
  191. {pybaseutils-2.4.14 → pybaseutils-2.4.16}/test_py/converter/CCPD.py +0 -0
  192. {pybaseutils-2.4.14 → pybaseutils-2.4.16}/test_py/converter/CCPD2voc.py +0 -0
  193. {pybaseutils-2.4.14 → pybaseutils-2.4.16}/test_py/converter/FL3D_dataset.py +0 -0
  194. {pybaseutils-2.4.14 → pybaseutils-2.4.16}/test_py/converter/FreiHAND2coco.py +0 -0
  195. {pybaseutils-2.4.14 → pybaseutils-2.4.16}/test_py/converter/MTFL2voc.py +0 -0
  196. {pybaseutils-2.4.14 → pybaseutils-2.4.16}/test_py/converter/TT100K.py +0 -0
  197. {pybaseutils-2.4.14 → pybaseutils-2.4.16}/test_py/converter/WaterMeters1.py +0 -0
  198. {pybaseutils-2.4.14 → pybaseutils-2.4.16}/test_py/converter/WaterMeters2.py +0 -0
  199. {pybaseutils-2.4.14 → pybaseutils-2.4.16}/test_py/converter/__init__.py +0 -0
  200. {pybaseutils-2.4.14 → pybaseutils-2.4.16}/test_py/converter/concat_coco.py +0 -0
  201. {pybaseutils-2.4.14 → pybaseutils-2.4.16}/test_py/converter/convert_coco2voc.py +0 -0
  202. {pybaseutils-2.4.14 → pybaseutils-2.4.16}/test_py/converter/convert_cvat2labelme.py +0 -0
  203. {pybaseutils-2.4.14 → pybaseutils-2.4.16}/test_py/converter/convert_gesture2hand.py +0 -0
  204. {pybaseutils-2.4.14 → pybaseutils-2.4.16}/test_py/converter/convert_labelme2coco.py +0 -0
  205. {pybaseutils-2.4.14 → pybaseutils-2.4.16}/test_py/converter/convert_labelme2cvat.py +0 -0
  206. {pybaseutils-2.4.14 → pybaseutils-2.4.16}/test_py/converter/convert_labelme2labelme.py +0 -0
  207. {pybaseutils-2.4.14 → pybaseutils-2.4.16}/test_py/converter/convert_labelme2voc.py +0 -0
  208. {pybaseutils-2.4.14 → pybaseutils-2.4.16}/test_py/converter/convert_voc2labelme.py +0 -0
  209. {pybaseutils-2.4.14 → pybaseutils-2.4.16}/test_py/converter/convert_yolo2labelme.py +0 -0
  210. {pybaseutils-2.4.14 → pybaseutils-2.4.16}/test_py/converter/fall_dataset.py +0 -0
  211. {pybaseutils-2.4.14 → pybaseutils-2.4.16}/test_py/converter/fatigue_driving.py +0 -0
  212. {pybaseutils-2.4.14 → pybaseutils-2.4.16}/test_py/converter/fdd_dataset.py +0 -0
  213. {pybaseutils-2.4.14 → pybaseutils-2.4.16}/test_py/converter/get_pair_data.py +0 -0
  214. {pybaseutils-2.4.14 → pybaseutils-2.4.16}/test_py/converter/handpose2coco.py +0 -0
  215. {pybaseutils-2.4.14 → pybaseutils-2.4.16}/test_py/converter/insects_for_aichallenger.py +0 -0
  216. {pybaseutils-2.4.14 → pybaseutils-2.4.16}/test_py/converter/parking_rois_gopro.py +0 -0
  217. {pybaseutils-2.4.14 → pybaseutils-2.4.16}/test_py/converter/tt100k_utils.py +0 -0
  218. {pybaseutils-2.4.14 → pybaseutils-2.4.16}/test_py/converter/ua_detrac2voc.py +0 -0
  219. {pybaseutils-2.4.14 → pybaseutils-2.4.16}/test_py/converter/ucf101_dataset.py +0 -0
  220. {pybaseutils-2.4.14 → pybaseutils-2.4.16}/test_py/converter/voc_sbd2labelme.py +0 -0
  221. {pybaseutils-2.4.14 → pybaseutils-2.4.16}/test_py/cython_build/__init__.py +0 -0
  222. {pybaseutils-2.4.14 → pybaseutils-2.4.16}/test_py/cython_build/build_cython.py +0 -0
  223. {pybaseutils-2.4.14 → pybaseutils-2.4.16}/test_py/cython_build/build_pyarmor.py +0 -0
  224. {pybaseutils-2.4.14 → pybaseutils-2.4.16}/test_py/cython_build/cryptography_demo.py +0 -0
  225. {pybaseutils-2.4.14 → pybaseutils-2.4.16}/test_py/cython_build/fun_sum.py +0 -0
  226. {pybaseutils-2.4.14 → pybaseutils-2.4.16}/test_py/cython_build/main.py +0 -0
  227. {pybaseutils-2.4.14 → pybaseutils-2.4.16}/test_py/cython_build/model_des_enctypt.py +0 -0
  228. {pybaseutils-2.4.14 → pybaseutils-2.4.16}/test_py/cython_build/model_enctypt.py +0 -0
  229. {pybaseutils-2.4.14 → pybaseutils-2.4.16}/test_py/date_dataset.py +0 -0
  230. {pybaseutils-2.4.14 → pybaseutils-2.4.16}/test_py/date_demo.py +0 -0
  231. {pybaseutils-2.4.14 → pybaseutils-2.4.16}/test_py/datedataset_bk.py +0 -0
  232. {pybaseutils-2.4.14 → pybaseutils-2.4.16}/test_py/demo1.py +0 -0
  233. {pybaseutils-2.4.14 → pybaseutils-2.4.16}/test_py/demo2.py +0 -0
  234. {pybaseutils-2.4.14 → pybaseutils-2.4.16}/test_py/demo3.py +0 -0
  235. {pybaseutils-2.4.14 → pybaseutils-2.4.16}/test_py/demo4.py +0 -0
  236. {pybaseutils-2.4.14 → pybaseutils-2.4.16}/test_py/demo_async_await1.py +0 -0
  237. {pybaseutils-2.4.14 → pybaseutils-2.4.16}/test_py/demo_async_await2.py +0 -0
  238. {pybaseutils-2.4.14 → pybaseutils-2.4.16}/test_py/demo_coco_vis.py +0 -0
  239. {pybaseutils-2.4.14 → pybaseutils-2.4.16}/test_py/demo_copy_files.py +0 -0
  240. {pybaseutils-2.4.14 → pybaseutils-2.4.16}/test_py/demo_copy_files_for_voc.py +0 -0
  241. {pybaseutils-2.4.14 → pybaseutils-2.4.16}/test_py/demo_ffmpy.py +0 -0
  242. {pybaseutils-2.4.14 → pybaseutils-2.4.16}/test_py/demo_for_annular_to_rect.py +0 -0
  243. {pybaseutils-2.4.14 → pybaseutils-2.4.16}/test_py/demo_for_pair_file.py +0 -0
  244. {pybaseutils-2.4.14 → pybaseutils-2.4.16}/test_py/demo_for_polygon.py +0 -0
  245. {pybaseutils-2.4.14 → pybaseutils-2.4.16}/test_py/demo_for_trt.py +0 -0
  246. {pybaseutils-2.4.14 → pybaseutils-2.4.16}/test_py/demo_get_file_label.py +0 -0
  247. {pybaseutils-2.4.14 → pybaseutils-2.4.16}/test_py/demo_get_file_list.py +0 -0
  248. {pybaseutils-2.4.14 → pybaseutils-2.4.16}/test_py/demo_gif.py +0 -0
  249. {pybaseutils-2.4.14 → pybaseutils-2.4.16}/test_py/demo_gif_video.py +0 -0
  250. {pybaseutils-2.4.14 → pybaseutils-2.4.16}/test_py/demo_image_crop.py +0 -0
  251. {pybaseutils-2.4.14 → pybaseutils-2.4.16}/test_py/demo_kpts.py +0 -0
  252. {pybaseutils-2.4.14 → pybaseutils-2.4.16}/test_py/demo_labelme.py +0 -0
  253. {pybaseutils-2.4.14 → pybaseutils-2.4.16}/test_py/demo_labelme_crop.py +0 -0
  254. {pybaseutils-2.4.14 → pybaseutils-2.4.16}/test_py/demo_lableme_vis.py +0 -0
  255. {pybaseutils-2.4.14 → pybaseutils-2.4.16}/test_py/demo_letterbox.py +0 -0
  256. {pybaseutils-2.4.14 → pybaseutils-2.4.16}/test_py/demo_metrics.py +0 -0
  257. {pybaseutils-2.4.14 → pybaseutils-2.4.16}/test_py/demo_mosaic.py +0 -0
  258. {pybaseutils-2.4.14 → pybaseutils-2.4.16}/test_py/demo_mouse.py +0 -0
  259. {pybaseutils-2.4.14 → pybaseutils-2.4.16}/test_py/demo_nii.py +0 -0
  260. {pybaseutils-2.4.14 → pybaseutils-2.4.16}/test_py/demo_pandas.py +0 -0
  261. {pybaseutils-2.4.14 → pybaseutils-2.4.16}/test_py/demo_plot.py +0 -0
  262. {pybaseutils-2.4.14 → pybaseutils-2.4.16}/test_py/demo_prelabelme.py +0 -0
  263. {pybaseutils-2.4.14 → pybaseutils-2.4.16}/test_py/demo_rename.py +0 -0
  264. {pybaseutils-2.4.14 → pybaseutils-2.4.16}/test_py/demo_standard_image .py +0 -0
  265. {pybaseutils-2.4.14 → pybaseutils-2.4.16}/test_py/demo_standard_video .py +0 -0
  266. {pybaseutils-2.4.14 → pybaseutils-2.4.16}/test_py/demo_taichi.py +0 -0
  267. {pybaseutils-2.4.14 → pybaseutils-2.4.16}/test_py/demo_video2frame.py +0 -0
  268. {pybaseutils-2.4.14 → pybaseutils-2.4.16}/test_py/demo_video_crop.py +0 -0
  269. {pybaseutils-2.4.14 → pybaseutils-2.4.16}/test_py/demo_voc_crop.py +0 -0
  270. {pybaseutils-2.4.14 → pybaseutils-2.4.16}/test_py/demo_voc_vis.py +0 -0
  271. {pybaseutils-2.4.14 → pybaseutils-2.4.16}/test_py/demo_word_similar.py +0 -0
  272. {pybaseutils-2.4.14 → pybaseutils-2.4.16}/test_py/demo_worker1.py +0 -0
  273. {pybaseutils-2.4.14 → pybaseutils-2.4.16}/test_py/demo_worker2.py +0 -0
  274. {pybaseutils-2.4.14 → pybaseutils-2.4.16}/test_py/detector/__init__.py +0 -0
  275. {pybaseutils-2.4.14 → pybaseutils-2.4.16}/test_py/detector/demo.py +0 -0
  276. {pybaseutils-2.4.14 → pybaseutils-2.4.16}/test_py/detector/detect_face_person.py +0 -0
  277. {pybaseutils-2.4.14 → pybaseutils-2.4.16}/test_py/detector/predet_labelme.py +0 -0
  278. {pybaseutils-2.4.14 → pybaseutils-2.4.16}/test_py/edit_distance/__init__.py +0 -0
  279. {pybaseutils-2.4.14 → pybaseutils-2.4.16}/test_py/edit_distance/demo.py +0 -0
  280. {pybaseutils-2.4.14 → pybaseutils-2.4.16}/test_py/edit_distance/text_matching.py +0 -0
  281. {pybaseutils-2.4.14 → pybaseutils-2.4.16}/test_py/fast_api/__init__.py +0 -0
  282. {pybaseutils-2.4.14 → pybaseutils-2.4.16}/test_py/fast_api/create_image_url.py +0 -0
  283. {pybaseutils-2.4.14 → pybaseutils-2.4.16}/test_py/fast_api/get_image_url.py +0 -0
  284. {pybaseutils-2.4.14 → pybaseutils-2.4.16}/test_py/flask_demo/__init__.py +0 -0
  285. {pybaseutils-2.4.14 → pybaseutils-2.4.16}/test_py/flask_demo/app.py +0 -0
  286. {pybaseutils-2.4.14 → pybaseutils-2.4.16}/test_py/flask_demo/utils/__init__.py +0 -0
  287. {pybaseutils-2.4.14 → pybaseutils-2.4.16}/test_py/flask_demo/utils/utils.py +0 -0
  288. {pybaseutils-2.4.14 → pybaseutils-2.4.16}/test_py/get_file_list.py +0 -0
  289. {pybaseutils-2.4.14 → pybaseutils-2.4.16}/test_py/gradio_app.py +0 -0
  290. {pybaseutils-2.4.14 → pybaseutils-2.4.16}/test_py/gradio_app_v2.py +0 -0
  291. {pybaseutils-2.4.14 → pybaseutils-2.4.16}/test_py/image_correction/__init__.py +0 -0
  292. {pybaseutils-2.4.14 → pybaseutils-2.4.16}/test_py/image_correction/demo_correction_v1.py +0 -0
  293. {pybaseutils-2.4.14 → pybaseutils-2.4.16}/test_py/image_correction/demo_correction_v2.py +0 -0
  294. {pybaseutils-2.4.14 → pybaseutils-2.4.16}/test_py/image_correction/demo_correction_v3.py +0 -0
  295. {pybaseutils-2.4.14 → pybaseutils-2.4.16}/test_py/kafka_worker.py +0 -0
  296. {pybaseutils-2.4.14 → pybaseutils-2.4.16}/test_py/men_tracemalloc.py +0 -0
  297. {pybaseutils-2.4.14 → pybaseutils-2.4.16}/test_py/milvus_demo/__init__.py +0 -0
  298. {pybaseutils-2.4.14 → pybaseutils-2.4.16}/test_py/milvus_demo/demo01.py +0 -0
  299. {pybaseutils-2.4.14 → pybaseutils-2.4.16}/test_py/milvus_demo/demo02.py +0 -0
  300. {pybaseutils-2.4.14 → pybaseutils-2.4.16}/test_py/milvus_demo/hello_milvus.py +0 -0
  301. {pybaseutils-2.4.14 → pybaseutils-2.4.16}/test_py/milvus_demo/milvus_client.py +0 -0
  302. {pybaseutils-2.4.14 → pybaseutils-2.4.16}/test_py/model_process.py +0 -0
  303. {pybaseutils-2.4.14 → pybaseutils-2.4.16}/test_py/performance.py +0 -0
  304. {pybaseutils-2.4.14 → pybaseutils-2.4.16}/test_py/pose/__init__.py +0 -0
  305. {pybaseutils-2.4.14 → pybaseutils-2.4.16}/test_py/pose/human_pose.py +0 -0
  306. {pybaseutils-2.4.14 → pybaseutils-2.4.16}/test_py/qrcode/__init__.py +0 -0
  307. {pybaseutils-2.4.14 → pybaseutils-2.4.16}/test_py/qrcode/demo.py +0 -0
  308. {pybaseutils-2.4.14 → pybaseutils-2.4.16}/test_py/redis_py/__init__.py +0 -0
  309. {pybaseutils-2.4.14 → pybaseutils-2.4.16}/test_py/redis_py/knn_search.py +0 -0
  310. {pybaseutils-2.4.14 → pybaseutils-2.4.16}/test_py/redis_py/redis_client.py +0 -0
  311. {pybaseutils-2.4.14 → pybaseutils-2.4.16}/test_py/registry/__init__.py +0 -0
  312. {pybaseutils-2.4.14 → pybaseutils-2.4.16}/test_py/registry/base.py +0 -0
  313. {pybaseutils-2.4.14 → pybaseutils-2.4.16}/test_py/registry/component.py +0 -0
  314. {pybaseutils-2.4.14 → pybaseutils-2.4.16}/test_py/registry/main.py +0 -0
  315. {pybaseutils-2.4.14 → pybaseutils-2.4.16}/test_py/registry/register.py +0 -0
  316. {pybaseutils-2.4.14 → pybaseutils-2.4.16}/test_py/single_class/GRU.py +0 -0
  317. {pybaseutils-2.4.14 → pybaseutils-2.4.16}/test_py/single_class/TCN.py +0 -0
  318. {pybaseutils-2.4.14 → pybaseutils-2.4.16}/test_py/single_class/__init__.py +0 -0
  319. {pybaseutils-2.4.14 → pybaseutils-2.4.16}/test_py/single_class/demo.py +0 -0
  320. {pybaseutils-2.4.14 → pybaseutils-2.4.16}/test_py/slowfastnet.py +0 -0
  321. {pybaseutils-2.4.14 → pybaseutils-2.4.16}/test_py/test_camera.py +0 -0
  322. {pybaseutils-2.4.14 → pybaseutils-2.4.16}/test_py/test_fr/__init__.py +0 -0
  323. {pybaseutils-2.4.14 → pybaseutils-2.4.16}/test_py/test_fr/demo11.py +0 -0
  324. {pybaseutils-2.4.14 → pybaseutils-2.4.16}/test_py/test_fr/idcardocr.py +0 -0
  325. {pybaseutils-2.4.14 → pybaseutils-2.4.16}/test_py/web_socket/__init__.py +0 -0
  326. {pybaseutils-2.4.14 → pybaseutils-2.4.16}/test_py/web_socket/asr_clients.py +0 -0
  327. {pybaseutils-2.4.14 → pybaseutils-2.4.16}/test_py/web_socket/asr_service.py +0 -0
  328. {pybaseutils-2.4.14 → pybaseutils-2.4.16}/test_py/web_socket/chat_service.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: pybaseutils
3
- Version: 2.4.14
3
+ Version: 2.4.16
4
4
  Summary: pybaseutils
5
5
  Home-page: https://github.com/PanJinquan/base-utils
6
6
  Author: PanJinquan
@@ -8,4 +8,4 @@
8
8
  # --------------------------------------------------------
9
9
  """
10
10
 
11
- __version__ = '2.4.14'
11
+ __version__ = '2.4.16'
@@ -0,0 +1,182 @@
1
+ import cv2
2
+ import time
3
+ import numpy as np
4
+ import subprocess
5
+ import json
6
+ import numbers
7
+
8
+ def get_video_size(video, size=()):
9
+ """
10
+ 获取视频设备或文件的分辨率
11
+ :param video: 视频设备路径/索引 或 视频文件路径
12
+ :param size: 要设置的摄像头分辨率 (宽, 高),仅对摄像头设备有效
13
+ :return: tuple: (width, height) 或 (None, None)
14
+ """
15
+ if isinstance(video, int):
16
+ video = f"/dev/video{video}"
17
+ # 摄像头设备且需要设置分辨率
18
+ if video.startswith('/dev/video') and size:
19
+ cap = cv2.VideoCapture(video)
20
+ try:
21
+ if not cap.isOpened():
22
+ print(f"无法打开摄像头: {video}")
23
+ return None, None
24
+ cap.set(cv2.CAP_PROP_FRAME_WIDTH, size[0])
25
+ cap.set(cv2.CAP_PROP_FRAME_HEIGHT, size[1])
26
+ width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
27
+ height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
28
+ if (width, height) != size:
29
+ print(f"请求分辨率: {size},实际分辨率: {width}x{height}")
30
+ else:
31
+ print(f"摄像头分辨率设置为: {width}x{height}")
32
+
33
+ return width, height
34
+ except Exception as e:
35
+ print(f"获取摄像头分辨率失败: {e}")
36
+ return None, None
37
+ finally:
38
+ cap.release()
39
+
40
+ # 使用 ffprobe 获取分辨率
41
+ cmd = ['ffprobe', '-v', 'quiet', '-print_format', 'json', '-show_streams', video]
42
+ try:
43
+ result = subprocess.check_output(cmd, stderr=subprocess.STDOUT).decode()
44
+ info = json.loads(result)
45
+
46
+ for stream in info.get('streams', []):
47
+ if stream.get('codec_type') == 'video':
48
+ width, height = stream.get('width'), stream.get('height')
49
+ if width and height:
50
+ print(f"video={video}, width:{width}, height:{height}")
51
+ return width, height
52
+
53
+ print(f"未找到视频流: {video}")
54
+ return None, None
55
+
56
+ except (subprocess.CalledProcessError, json.JSONDecodeError) as e:
57
+ print(f"ffprobe 获取分辨率失败: {e}")
58
+ return None, None
59
+ except FileNotFoundError:
60
+ print("错误:未找到 ffprobe,请安装 ffmpeg")
61
+ return None, None
62
+ except Exception as e:
63
+ print(f"获取视频分辨率失败: {e}")
64
+ return None, None
65
+
66
+
67
+ class CameraCapture(object):
68
+ def __init__(self, video: str or int = 0, fps=30, size=(1920, 1080), scale=1.0):
69
+ """
70
+ 查询视频设备分辨率: ffmpeg -f v4l2 -list_formats all -i /dev/video0
71
+ 常见的视频分辨率 : 1920x1080 1280x720 640x480 352x288 320x240 176x144 160x120
72
+ :param video: 视频设备路径或索引(如 0 或 "/dev/video0")
73
+ :param fps: 视频帧率
74
+ :param size: 视频分辨率 (宽, 高),(1280,720),(1920,1080)
75
+ :param scale: 视频缩放比例
76
+ """
77
+ self.fps = fps
78
+ self.stopped = False
79
+ self.ssize = get_video_size(video, size=size)
80
+ self.dsize = self.ssize
81
+ if isinstance(video, int): # TODO 摄像头
82
+ video = f"/dev/video{video}"
83
+ self.video_size = f"{self.ssize[0]}x{self.ssize[1]}" # 视频文件没有这个参数
84
+ else: # TODO 视频文件
85
+ self.video_size = None
86
+ if size:
87
+ self.dsize = (int(size[0] * scale), int(size[1] * scale))
88
+ else:
89
+ self.dsize = (int(self.dsize[0] * scale), int(self.dsize[1] * scale))
90
+ vf = f'scale={self.dsize[0]}:{self.dsize[1]}'
91
+ # TODO FFmpeg 命令
92
+ # -re: 以原生帧率读取(模拟直播流)
93
+ # -fflags nobuffer: 关键!禁用缓冲区
94
+ # -flags low_delay: 关键!低延迟模式
95
+ # -probesize 32: 减小探测包大小,加快启动
96
+ # -pix_fmt bgr24: 直接输出 BGR 格式,方便 OpenCV/Numpy 使用,避免后续转换
97
+ if self.video_size: # TODO 如果是摄像头
98
+ command = [
99
+ 'ffmpeg',
100
+ '-re', # 按帧率读取
101
+ '-fflags', 'nobuffer', # 无缓冲
102
+ '-flags', 'low_delay', # 低延迟
103
+ '-probesize', '32', # 快速探测
104
+ '-video_size', f"{self.ssize[0]}x{self.ssize[1]}", # 视频分辨率
105
+ '-i', video, # 输入设备
106
+ '-f', 'rawvideo', # 输出原始视频流
107
+ '-pix_fmt', 'bgr24', # 像素格式 BGR
108
+ '-vf', vf, # 分辨率
109
+ '-r', str(fps), # 帧率
110
+ '-' # 输出到 stdout
111
+ ]
112
+ else:
113
+ command = [
114
+ 'ffmpeg',
115
+ '-re', # 按帧率读取
116
+ '-fflags', 'nobuffer', # 无缓冲
117
+ '-flags', 'low_delay', # 低延迟
118
+ '-probesize', '32', # 快速探测
119
+ '-i', video, # 输入设备
120
+ '-f', 'rawvideo', # 输出原始视频流
121
+ '-pix_fmt', 'bgr24', # 像素格式 BGR
122
+ '-vf', vf, # 分辨率
123
+ '-r', str(fps), # 帧率
124
+ '-' # 输出到 stdout
125
+ ]
126
+ # 启动进程
127
+ print(f"command: {' '.join(command)}")
128
+ self.pipe = subprocess.Popen(command, stdout=subprocess.PIPE, bufsize=10 ** 8)
129
+
130
+ def read(self):
131
+ if self.stopped:
132
+ self.stop()
133
+ return False, None
134
+ # 读取一帧的数据量 (宽 * 高 * 3通道)
135
+ buf = self.pipe.stdout.read(self.dsize[0] * self.dsize[1] * 3)
136
+ if len(buf) != self.dsize[0] * self.dsize[1] * 3:
137
+ self.stop()
138
+ return False, None # 读取失败或结束
139
+ # TODO 将字节流转换为numpy数组图像(bgr)
140
+ bgr = np.frombuffer(buf, dtype=np.uint8).reshape((self.dsize[1], self.dsize[0], 3))
141
+ return True, bgr
142
+
143
+ def release(self):
144
+ self.stop()
145
+
146
+ def stop(self):
147
+ self.stopped = True
148
+ time.sleep(0.1)
149
+ self.pipe.terminate() # 终止进程
150
+ try:
151
+ outs, errs = self.pipe.communicate(timeout=2)
152
+ except subprocess.TimeoutExpired as err:
153
+ # 如果 communicate 也超时(极少见),强制杀死
154
+ self.pipe.kill()
155
+ self.pipe.communicate() # 再次尝试清理
156
+ print(err)
157
+
158
+ def display(self, title="camera", delay=30):
159
+ while True:
160
+ t1 = time.time()
161
+ ret, frame = self.read()
162
+ t2 = time.time()
163
+ if not ret:
164
+ break
165
+ t21 = (t2 - t1) * 1000
166
+ print(f"image shape: {frame.shape},耗时: {t21:.3f}ms")
167
+ cv2.namedWindow(title, flags=cv2.WINDOW_NORMAL)
168
+ cv2.imshow(title, frame)
169
+ cv2.waitKey(delay)
170
+
171
+
172
+ if __name__ == '__main__':
173
+ from pybaseutils.cvutils import video_utils
174
+
175
+ fps = 10
176
+ # video = video_utils.get_usb_camera()
177
+ video = "/home/PKing/Videos/video1.mp4" # Windows 下可能是 0 或 "video=Integrated Webcam"
178
+ # video = "../../data/video/kunkun_cut.mp4" # Windows 下可能是 0 或 "video=Integrated Webcam"
179
+ # cap = CameraCapture(video=video, size=(), scale=1.0, fps=fps)
180
+ cap = CameraCapture(video=video, size=(1920, 1080), scale=1.0, fps=fps)
181
+ # cap = CameraCapture(video=video, size=(), scale=2,fps=fps)
182
+ cap.display()
@@ -41,7 +41,10 @@ def get_usb_camera(video=-1, max_index=50):
41
41
  camera = i
42
42
  cap.release()
43
43
  break
44
- print("检测到USB摄像头ID={}".format(camera))
44
+ if camera < 0:
45
+ print("未检测到USB摄像头ID={}".format(camera))
46
+ else:
47
+ print("检测到USB摄像头ID={}".format(camera))
45
48
  return camera
46
49
 
47
50
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: pybaseutils
3
- Version: 2.4.14
3
+ Version: 2.4.16
4
4
  Summary: pybaseutils
5
5
  Home-page: https://github.com/PanJinquan/base-utils
6
6
  Author: PanJinquan
@@ -143,6 +143,7 @@ pybaseutils/web/app_webio_image.py
143
143
  pybaseutils/web/demo.py
144
144
  test_py/__init__.py
145
145
  test_py/audio_demo1.py
146
+ test_py/camera.py
146
147
  test_py/class_attribute.py
147
148
  test_py/class_names.py
148
149
  test_py/date_dataset.py
@@ -0,0 +1,194 @@
1
+ import cv2
2
+ import time
3
+ import numpy as np
4
+ import subprocess
5
+ import json
6
+ import numbers
7
+
8
+ import cv2
9
+ import subprocess
10
+ import json
11
+
12
+ import cv2
13
+ import subprocess
14
+ import json
15
+
16
+
17
+ def get_video_size(video, size=()):
18
+ """
19
+ 获取视频设备或文件的分辨率
20
+ Args:
21
+ video: 视频设备路径/索引 或 视频文件路径
22
+ size: 要设置的摄像头分辨率 (宽, 高),仅对摄像头设备有效
23
+
24
+ Returns:
25
+ tuple: (width, height) 或 (None, None)
26
+ """
27
+ if isinstance(video, int):
28
+ video = f"/dev/video{video}"
29
+ # 摄像头设备且需要设置分辨率
30
+ if video.startswith('/dev/video') and size:
31
+ cap = cv2.VideoCapture(video)
32
+ try:
33
+ if not cap.isOpened():
34
+ print(f"无法打开摄像头: {video}")
35
+ return None, None
36
+ cap.set(cv2.CAP_PROP_FRAME_WIDTH, size[0])
37
+ cap.set(cv2.CAP_PROP_FRAME_HEIGHT, size[1])
38
+ width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
39
+ height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
40
+ if (width, height) != size:
41
+ print(f"请求分辨率: {size},实际分辨率: {width}x{height}")
42
+ else:
43
+ print(f"摄像头分辨率设置为: {width}x{height}")
44
+
45
+ return width, height
46
+ except Exception as e:
47
+ print(f"获取摄像头分辨率失败: {e}")
48
+ return None, None
49
+ finally:
50
+ cap.release()
51
+
52
+ # 使用 ffprobe 获取分辨率
53
+ cmd = ['ffprobe', '-v', 'quiet', '-print_format', 'json', '-show_streams', video]
54
+ try:
55
+ result = subprocess.check_output(cmd, stderr=subprocess.STDOUT).decode()
56
+ info = json.loads(result)
57
+
58
+ for stream in info.get('streams', []):
59
+ if stream.get('codec_type') == 'video':
60
+ width, height = stream.get('width'), stream.get('height')
61
+ if width and height:
62
+ print(f"video={video}, width:{width}, height:{height}")
63
+ return width, height
64
+
65
+ print(f"未找到视频流: {video}")
66
+ return None, None
67
+
68
+ except (subprocess.CalledProcessError, json.JSONDecodeError) as e:
69
+ print(f"ffprobe 获取分辨率失败: {e}")
70
+ return None, None
71
+ except FileNotFoundError:
72
+ print("错误:未找到 ffprobe,请安装 ffmpeg")
73
+ return None, None
74
+ except Exception as e:
75
+ print(f"获取视频分辨率失败: {e}")
76
+ return None, None
77
+
78
+
79
+ class CameraCapture(object):
80
+ def __init__(self, video: str or int = 0, fps=30, size=(1920, 1080), scale=1.0):
81
+ """
82
+ 查询视频设备分辨率: ffmpeg -f v4l2 -list_formats all -i /dev/video0
83
+ 常见的视频分辨率 : 1920x1080 1280x720 640x480 352x288 320x240 176x144 160x120
84
+ :param video: 视频设备路径或索引(如 0 或 "/dev/video0")
85
+ :param fps: 视频帧率
86
+ :param size: 视频分辨率 (宽, 高),(1280,720),(1920,1080)
87
+ :param scale: 视频缩放比例
88
+ """
89
+ self.fps = fps
90
+ self.stopped = False
91
+ self.ssize = get_video_size(video, size=size)
92
+ self.dsize = self.ssize
93
+ if isinstance(video, int): # TODO 摄像头
94
+ video = f"/dev/video{video}"
95
+ self.video_size = f"{self.ssize[0]}x{self.ssize[1]}" # 视频文件没有这个参数
96
+ else: # TODO 视频文件
97
+ self.video_size = None
98
+ if size:
99
+ self.dsize = (int(size[0] * scale), int(size[1] * scale))
100
+ else:
101
+ self.dsize = (int(self.dsize[0] * scale), int(self.dsize[1] * scale))
102
+ vf = f'scale={self.dsize[0]}:{self.dsize[1]}'
103
+ # TODO FFmpeg 命令
104
+ # -re: 以原生帧率读取(模拟直播流)
105
+ # -fflags nobuffer: 关键!禁用缓冲区
106
+ # -flags low_delay: 关键!低延迟模式
107
+ # -probesize 32: 减小探测包大小,加快启动
108
+ # -pix_fmt bgr24: 直接输出 BGR 格式,方便 OpenCV/Numpy 使用,避免后续转换
109
+ if self.video_size: # TODO 如果是摄像头
110
+ command = [
111
+ 'ffmpeg',
112
+ '-re', # 按帧率读取
113
+ '-fflags', 'nobuffer', # 无缓冲
114
+ '-flags', 'low_delay', # 低延迟
115
+ '-probesize', '32', # 快速探测
116
+ '-video_size', f"{self.ssize[0]}x{self.ssize[1]}", # 视频分辨率
117
+ '-i', video, # 输入设备
118
+ '-f', 'rawvideo', # 输出原始视频流
119
+ '-pix_fmt', 'bgr24', # 像素格式 BGR
120
+ '-vf', vf, # 分辨率
121
+ '-r', str(fps), # 帧率
122
+ '-' # 输出到 stdout
123
+ ]
124
+ else:
125
+ command = [
126
+ 'ffmpeg',
127
+ '-re', # 按帧率读取
128
+ '-fflags', 'nobuffer', # 无缓冲
129
+ '-flags', 'low_delay', # 低延迟
130
+ '-probesize', '32', # 快速探测
131
+ '-i', video, # 输入设备
132
+ '-f', 'rawvideo', # 输出原始视频流
133
+ '-pix_fmt', 'bgr24', # 像素格式 BGR
134
+ '-vf', vf, # 分辨率
135
+ '-r', str(fps), # 帧率
136
+ '-' # 输出到 stdout
137
+ ]
138
+ # 启动进程
139
+ print(f"command: {' '.join(command)}")
140
+ self.pipe = subprocess.Popen(command, stdout=subprocess.PIPE, bufsize=10 ** 8)
141
+
142
+ def read(self):
143
+ if self.stopped:
144
+ self.stop()
145
+ return False, None
146
+ # 读取一帧的数据量 (宽 * 高 * 3通道)
147
+ buf = self.pipe.stdout.read(self.dsize[0] * self.dsize[1] * 3)
148
+ if len(buf) != self.dsize[0] * self.dsize[1] * 3:
149
+ self.stop()
150
+ return False, None # 读取失败或结束
151
+ # TODO 将字节流转换为numpy数组图像(bgr)
152
+ bgr = np.frombuffer(buf, dtype=np.uint8).reshape((self.dsize[1], self.dsize[0], 3))
153
+ return True, bgr
154
+
155
+ def release(self):
156
+ self.stop()
157
+
158
+ def stop(self):
159
+ self.stopped = True
160
+ time.sleep(0.1)
161
+ self.pipe.terminate() # 终止进程
162
+ try:
163
+ outs, errs = self.pipe.communicate(timeout=2)
164
+ except subprocess.TimeoutExpired as err:
165
+ # 如果 communicate 也超时(极少见),强制杀死
166
+ self.pipe.kill()
167
+ self.pipe.communicate() # 再次尝试清理
168
+ print(err)
169
+
170
+ def display(self, title="camera", delay=30):
171
+ while True:
172
+ t1 = time.time()
173
+ ret, frame = self.read()
174
+ t2 = time.time()
175
+ if not ret:
176
+ break
177
+ t21 = (t2 - t1) * 1000
178
+ print(f"image shape: {frame.shape},耗时: {t21:.3f}ms")
179
+ cv2.namedWindow(title, flags=cv2.WINDOW_NORMAL)
180
+ cv2.imshow(title, frame)
181
+ cv2.waitKey(delay)
182
+
183
+
184
+ if __name__ == '__main__':
185
+ from pybaseutils.cvutils import video_utils
186
+
187
+ fps = 10
188
+ video = video_utils.get_usb_camera()
189
+ # video = "/home/PKing/Videos/video1.mp4" # Windows 下可能是 0 或 "video=Integrated Webcam"
190
+ # video = "../../data/video/kunkun_cut.mp4" # Windows 下可能是 0 或 "video=Integrated Webcam"
191
+ # cap = CameraCapture(video=video, size=(), scale=1.0, fps=fps)
192
+ cap = CameraCapture(video=video, size=(1920, 1080), scale=1.0, fps=fps)
193
+ # cap = CameraCapture(video=video, size=(), scale=2,fps=fps)
194
+ cap.display()
@@ -1,112 +0,0 @@
1
- import cv2
2
- import time
3
- import numpy as np
4
- import subprocess
5
- import json
6
-
7
-
8
- def get_video_size(video):
9
- """获取视频原始分辨率"""
10
- cmd = ['ffprobe', '-v', 'quiet', '-print_format', 'json', '-show_streams', video]
11
- result = subprocess.check_output(cmd).decode()
12
- info = json.loads(result)
13
- for stream in info['streams']:
14
- if stream['codec_type'] == 'video':
15
- return stream['width'], stream['height']
16
- return None, None
17
-
18
-
19
- class CameraCapture(object):
20
- def __init__(self, video: str or int = 0, fps=30, size=(1920, 1080), scale=1.0, pad=False):
21
- """
22
- :param video: 视频设备路径或索引(如 0 或 "/dev/video0")
23
- :param fps: 视频帧率
24
- :param size: 视频分辨率 (宽, 高),(1280,720),(1920,1080)
25
- :param scale: 视频缩放比例
26
- :param pad: 是否保持原始视频比例并填充到指定分辨率
27
- """
28
- self.fps = fps
29
- self.stopped = False
30
- if isinstance(video, int): video = f"/dev/video{video}"
31
- self.dsize = size
32
- self.ssize = get_video_size(video)
33
- if size and pad:
34
- vf = f'scale={self.dsize[0]}:{self.dsize[1]}:force_original_aspect_ratio=decrease,pad={self.dsize[0]}:{self.dsize[1]}:(ow-iw)/2:(oh-ih)/2'
35
- elif size:
36
- vf = f'scale={self.dsize[0]}:{self.dsize[1]}'
37
- else:
38
- vf = f'scale=trunc(iw*{scale}):trunc(ih*{scale})'
39
- self.dsize = (int(self.ssize[0] * scale), int(self.ssize[1] * scale))
40
- # TODO FFmpeg 命令
41
- # -re: 以原生帧率读取(模拟直播流)
42
- # -fflags nobuffer: 关键!禁用缓冲区
43
- # -flags low_delay: 关键!低延迟模式
44
- # -probesize 32: 减小探测包大小,加快启动
45
- # -pix_fmt bgr24: 直接输出 BGR 格式,方便 OpenCV/Numpy 使用,避免后续转换
46
- command = [
47
- 'ffmpeg',
48
- '-re', # 按帧率读取
49
- '-fflags', 'nobuffer', # 无缓冲
50
- '-flags', 'low_delay', # 低延迟
51
- '-probesize', '32', # 快速探测
52
- '-i', video, # 输入设备
53
- '-f', 'rawvideo', # 输出原始视频流
54
- '-pix_fmt', 'bgr24', # 像素格式 BGR (OpenCV 格式)
55
- '-vf', vf, # 分辨率
56
- '-r', str(fps), # 帧率
57
- '-' # 输出到 stdout
58
- ]
59
- # 启动进程
60
- print(f"command: {' '.join(command)}")
61
- self.pipe = subprocess.Popen(command, stdout=subprocess.PIPE, bufsize=10 ** 8)
62
-
63
- def read(self):
64
- if self.stopped:
65
- self.stop()
66
- return False, None
67
- # 读取一帧的数据量 (宽 * 高 * 3通道)
68
- buf = self.pipe.stdout.read(self.dsize[0] * self.dsize[1] * 3)
69
- if len(buf) != self.dsize[0] * self.dsize[1] * 3:
70
- self.stop()
71
- return False, None # 读取失败或结束
72
- # TODO 将字节流转换为numpy数组图像(bgr)
73
- bgr = np.frombuffer(buf, dtype=np.uint8).reshape((self.dsize[1], self.dsize[0], 3))
74
- return True, bgr
75
-
76
- def release(self):
77
- self.stop()
78
-
79
- def stop(self):
80
- self.stopped = True
81
- time.sleep(0.1)
82
- self.pipe.terminate() # 终止进程
83
- try:
84
- outs, errs = self.pipe.communicate(timeout=2)
85
- except subprocess.TimeoutExpired as err:
86
- # 如果 communicate 也超时(极少见),强制杀死
87
- self.pipe.kill()
88
- self.pipe.communicate() # 再次尝试清理
89
- print(err)
90
-
91
- def display(self, title="camera", delay=30):
92
- while True:
93
- t1 = time.time()
94
- ret, frame = self.read()
95
- t2 = time.time()
96
- if not ret:
97
- break
98
- t21 = (t2 - t1) * 1000
99
- print(f"image shape: {frame.shape},耗时: {t21:.3f}ms")
100
- cv2.namedWindow(title, flags=cv2.WINDOW_NORMAL)
101
- cv2.imshow(title, frame)
102
- cv2.waitKey(delay)
103
-
104
-
105
- if __name__ == '__main__':
106
- fps = 10
107
- # video = 0 # Windows 下可能是 0 或 "video=Integrated Webcam"
108
- video = "/home/PKing/Videos/video1.mp4" # Windows 下可能是 0 或 "video=Integrated Webcam"
109
- video = "/home/PKing/Videos/demo-src.mp4" # Windows 下可能是 0 或 "video=Integrated Webcam"
110
- cap = CameraCapture(video=video, size=(640, 640), scale=0.5, pad=True, fps=fps)
111
- # cap = CameraCapture(video=video, size=(), scale=0.5, fps=fps)
112
- cap.display()
File without changes
File without changes