pybaseutils 2.4.8__tar.gz → 2.4.9__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 (326) hide show
  1. {pybaseutils-2.4.8 → pybaseutils-2.4.9}/PKG-INFO +1 -1
  2. {pybaseutils-2.4.8 → pybaseutils-2.4.9}/pybaseutils/__init__.py +1 -1
  3. pybaseutils-2.4.9/pybaseutils/cvutils/camera.py +90 -0
  4. {pybaseutils-2.4.8 → pybaseutils-2.4.9}/pybaseutils/cvutils/video_utils.py +33 -13
  5. {pybaseutils-2.4.8 → pybaseutils-2.4.9}/pybaseutils/file_utils.py +1 -0
  6. {pybaseutils-2.4.8 → pybaseutils-2.4.9}/pybaseutils/image_utils.py +15 -14
  7. pybaseutils-2.4.9/pybaseutils/nets_utils.py +24 -0
  8. {pybaseutils-2.4.8 → pybaseutils-2.4.9}/pybaseutils.egg-info/PKG-INFO +1 -1
  9. {pybaseutils-2.4.8 → pybaseutils-2.4.9}/pybaseutils.egg-info/SOURCES.txt +3 -0
  10. pybaseutils-2.4.9/test_py/test_camera.py +28 -0
  11. {pybaseutils-2.4.8 → pybaseutils-2.4.9}/LICENCE +0 -0
  12. {pybaseutils-2.4.8 → pybaseutils-2.4.9}/README.md +0 -0
  13. {pybaseutils-2.4.8 → pybaseutils-2.4.9}/pybaseutils/audio/__init__.py +0 -0
  14. {pybaseutils-2.4.8 → pybaseutils-2.4.9}/pybaseutils/audio/audio_utils.py +0 -0
  15. {pybaseutils-2.4.8 → pybaseutils-2.4.9}/pybaseutils/audio/pyaudio_utils.py +0 -0
  16. {pybaseutils-2.4.8 → pybaseutils-2.4.9}/pybaseutils/audio/vad_utils.py +0 -0
  17. {pybaseutils-2.4.8 → pybaseutils-2.4.9}/pybaseutils/base/__init__.py +0 -0
  18. {pybaseutils-2.4.8 → pybaseutils-2.4.9}/pybaseutils/base/dict_queue.py +0 -0
  19. {pybaseutils-2.4.8 → pybaseutils-2.4.9}/pybaseutils/base/list_queue.py +0 -0
  20. {pybaseutils-2.4.8 → pybaseutils-2.4.9}/pybaseutils/base/producer_consumer.py +0 -0
  21. {pybaseutils-2.4.8 → pybaseutils-2.4.9}/pybaseutils/base64_utils.py +0 -0
  22. {pybaseutils-2.4.8 → pybaseutils-2.4.9}/pybaseutils/batch_utils.py +0 -0
  23. {pybaseutils-2.4.8 → pybaseutils-2.4.9}/pybaseutils/build_utils/__init__.py +0 -0
  24. {pybaseutils-2.4.8 → pybaseutils-2.4.9}/pybaseutils/build_utils/cython_utils.py +0 -0
  25. {pybaseutils-2.4.8 → pybaseutils-2.4.9}/pybaseutils/build_utils/pyarmor_utils.py +0 -0
  26. {pybaseutils-2.4.8 → pybaseutils-2.4.9}/pybaseutils/cluster/__init__.py +0 -0
  27. {pybaseutils-2.4.8 → pybaseutils-2.4.9}/pybaseutils/cluster/kmean.py +0 -0
  28. {pybaseutils-2.4.8 → pybaseutils-2.4.9}/pybaseutils/cluster/maxmin_distance.py +0 -0
  29. {pybaseutils-2.4.8 → pybaseutils-2.4.9}/pybaseutils/cluster/similarity.py +0 -0
  30. {pybaseutils-2.4.8 → pybaseutils-2.4.9}/pybaseutils/color_utils.py +0 -0
  31. {pybaseutils-2.4.8 → pybaseutils-2.4.9}/pybaseutils/config_utils.py +0 -0
  32. {pybaseutils-2.4.8 → pybaseutils-2.4.9}/pybaseutils/converter/__init__.py +0 -0
  33. {pybaseutils-2.4.8 → pybaseutils-2.4.9}/pybaseutils/converter/build_coco.py +0 -0
  34. {pybaseutils-2.4.8 → pybaseutils-2.4.9}/pybaseutils/converter/build_cvat.py +0 -0
  35. {pybaseutils-2.4.8 → pybaseutils-2.4.9}/pybaseutils/converter/build_labelme.py +0 -0
  36. {pybaseutils-2.4.8 → pybaseutils-2.4.9}/pybaseutils/converter/build_voc.py +0 -0
  37. {pybaseutils-2.4.8 → pybaseutils-2.4.9}/pybaseutils/converter/concat_coco.py +0 -0
  38. {pybaseutils-2.4.8 → pybaseutils-2.4.9}/pybaseutils/converter/convert_coco2labelme.py +0 -0
  39. {pybaseutils-2.4.8 → pybaseutils-2.4.9}/pybaseutils/converter/convert_coco2voc.py +0 -0
  40. {pybaseutils-2.4.8 → pybaseutils-2.4.9}/pybaseutils/converter/convert_cvat2labelme.py +0 -0
  41. {pybaseutils-2.4.8 → pybaseutils-2.4.9}/pybaseutils/converter/convert_labelme2coco.py +0 -0
  42. {pybaseutils-2.4.8 → pybaseutils-2.4.9}/pybaseutils/converter/convert_labelme2cvat.py +0 -0
  43. {pybaseutils-2.4.8 → pybaseutils-2.4.9}/pybaseutils/converter/convert_labelme2labelme.py +0 -0
  44. {pybaseutils-2.4.8 → pybaseutils-2.4.9}/pybaseutils/converter/convert_labelme2voc.py +0 -0
  45. {pybaseutils-2.4.8 → pybaseutils-2.4.9}/pybaseutils/converter/convert_labelme2yolo.py +0 -0
  46. {pybaseutils-2.4.8 → pybaseutils-2.4.9}/pybaseutils/converter/convert_voc2coco.py +0 -0
  47. {pybaseutils-2.4.8 → pybaseutils-2.4.9}/pybaseutils/converter/convert_voc2labelme.py +0 -0
  48. {pybaseutils-2.4.8 → pybaseutils-2.4.9}/pybaseutils/converter/convert_voc2voc.py +0 -0
  49. {pybaseutils-2.4.8 → pybaseutils-2.4.9}/pybaseutils/converter/convert_voc2yolo.py +0 -0
  50. {pybaseutils-2.4.8 → pybaseutils-2.4.9}/pybaseutils/converter/convert_yolo2labelme.py +0 -0
  51. {pybaseutils-2.4.8 → pybaseutils-2.4.9}/pybaseutils/converter/convert_yolo2voc.py +0 -0
  52. {pybaseutils-2.4.8 → pybaseutils-2.4.9}/pybaseutils/converter/prelabelme.py +0 -0
  53. {pybaseutils-2.4.8 → pybaseutils-2.4.9}/pybaseutils/coords_utils.py +0 -0
  54. {pybaseutils-2.4.8 → pybaseutils-2.4.9}/pybaseutils/cvutils/__init__.py +0 -0
  55. {pybaseutils-2.4.8 → pybaseutils-2.4.9}/pybaseutils/cvutils/corner_utils.py +0 -0
  56. {pybaseutils-2.4.8 → pybaseutils-2.4.9}/pybaseutils/cvutils/monitor.py +0 -0
  57. {pybaseutils-2.4.8 → pybaseutils-2.4.9}/pybaseutils/cvutils/mouse_utils.py +0 -0
  58. {pybaseutils-2.4.8 → pybaseutils-2.4.9}/pybaseutils/cvutils/nms_utils.py +0 -0
  59. {pybaseutils-2.4.8 → pybaseutils-2.4.9}/pybaseutils/data_utils.py +0 -0
  60. {pybaseutils-2.4.8 → pybaseutils-2.4.9}/pybaseutils/dataloader/__init__.py +0 -0
  61. {pybaseutils-2.4.8 → pybaseutils-2.4.9}/pybaseutils/dataloader/balanced_classes.py +0 -0
  62. {pybaseutils-2.4.8 → pybaseutils-2.4.9}/pybaseutils/dataloader/base_coco.py +0 -0
  63. {pybaseutils-2.4.8 → pybaseutils-2.4.9}/pybaseutils/dataloader/base_dataset.py +0 -0
  64. {pybaseutils-2.4.8 → pybaseutils-2.4.9}/pybaseutils/dataloader/data_resample.py +0 -0
  65. {pybaseutils-2.4.8 → pybaseutils-2.4.9}/pybaseutils/dataloader/parser_coco_det.py +0 -0
  66. {pybaseutils-2.4.8 → pybaseutils-2.4.9}/pybaseutils/dataloader/parser_coco_ins.py +0 -0
  67. {pybaseutils-2.4.8 → pybaseutils-2.4.9}/pybaseutils/dataloader/parser_coco_kps.py +0 -0
  68. {pybaseutils-2.4.8 → pybaseutils-2.4.9}/pybaseutils/dataloader/parser_image_folder.py +0 -0
  69. {pybaseutils-2.4.8 → pybaseutils-2.4.9}/pybaseutils/dataloader/parser_image_text.py +0 -0
  70. {pybaseutils-2.4.8 → pybaseutils-2.4.9}/pybaseutils/dataloader/parser_labelme.py +0 -0
  71. {pybaseutils-2.4.8 → pybaseutils-2.4.9}/pybaseutils/dataloader/parser_labelme_crop.py +0 -0
  72. {pybaseutils-2.4.8 → pybaseutils-2.4.9}/pybaseutils/dataloader/parser_labelme_line.py +0 -0
  73. {pybaseutils-2.4.8 → pybaseutils-2.4.9}/pybaseutils/dataloader/parser_video_folder.py +0 -0
  74. {pybaseutils-2.4.8 → pybaseutils-2.4.9}/pybaseutils/dataloader/parser_video_text.py +0 -0
  75. {pybaseutils-2.4.8 → pybaseutils-2.4.9}/pybaseutils/dataloader/parser_voc.py +0 -0
  76. {pybaseutils-2.4.8 → pybaseutils-2.4.9}/pybaseutils/dataloader/parser_yolo.py +0 -0
  77. {pybaseutils-2.4.8 → pybaseutils-2.4.9}/pybaseutils/dataloader/voc_seg_utils.py +0 -0
  78. {pybaseutils-2.4.8 → pybaseutils-2.4.9}/pybaseutils/dict_uils.py +0 -0
  79. {pybaseutils-2.4.8 → pybaseutils-2.4.9}/pybaseutils/filter/QueueTable.py +0 -0
  80. {pybaseutils-2.4.8 → pybaseutils-2.4.9}/pybaseutils/filter/__init__.py +0 -0
  81. {pybaseutils-2.4.8 → pybaseutils-2.4.9}/pybaseutils/filter/demo.py +0 -0
  82. {pybaseutils-2.4.8 → pybaseutils-2.4.9}/pybaseutils/filter/kalman_filter.py +0 -0
  83. {pybaseutils-2.4.8 → pybaseutils-2.4.9}/pybaseutils/filter/mean_filter.py +0 -0
  84. {pybaseutils-2.4.8 → pybaseutils-2.4.9}/pybaseutils/filter/motion_filter.py +0 -0
  85. {pybaseutils-2.4.8 → pybaseutils-2.4.9}/pybaseutils/filter/pose_filter.py +0 -0
  86. {pybaseutils-2.4.8 → pybaseutils-2.4.9}/pybaseutils/font_style/__init__.py +0 -0
  87. {pybaseutils-2.4.8 → pybaseutils-2.4.9}/pybaseutils/font_utils.py +0 -0
  88. {pybaseutils-2.4.8 → pybaseutils-2.4.9}/pybaseutils/geometry_tools.py +0 -0
  89. {pybaseutils-2.4.8 → pybaseutils-2.4.9}/pybaseutils/heatmap_utils.py +0 -0
  90. {pybaseutils-2.4.8 → pybaseutils-2.4.9}/pybaseutils/http_utils.py +0 -0
  91. {pybaseutils-2.4.8 → pybaseutils-2.4.9}/pybaseutils/json_utils.py +0 -0
  92. {pybaseutils-2.4.8 → pybaseutils-2.4.9}/pybaseutils/log.py +0 -0
  93. {pybaseutils-2.4.8 → pybaseutils-2.4.9}/pybaseutils/log_utils.py +0 -0
  94. {pybaseutils-2.4.8 → pybaseutils-2.4.9}/pybaseutils/media/__init__.py +0 -0
  95. {pybaseutils-2.4.8 → pybaseutils-2.4.9}/pybaseutils/media/ffmpeg_utils.py +0 -0
  96. {pybaseutils-2.4.8 → pybaseutils-2.4.9}/pybaseutils/metrics/__init__.py +0 -0
  97. {pybaseutils-2.4.8 → pybaseutils-2.4.9}/pybaseutils/metrics/accuracy.py +0 -0
  98. {pybaseutils-2.4.8 → pybaseutils-2.4.9}/pybaseutils/metrics/average_meter.py +0 -0
  99. {pybaseutils-2.4.8 → pybaseutils-2.4.9}/pybaseutils/metrics/class_report.py +0 -0
  100. {pybaseutils-2.4.8 → pybaseutils-2.4.9}/pybaseutils/metrics/plot_pr.py +0 -0
  101. {pybaseutils-2.4.8 → pybaseutils-2.4.9}/pybaseutils/metrics/plot_roc.py +0 -0
  102. {pybaseutils-2.4.8 → pybaseutils-2.4.9}/pybaseutils/numpy_utils.py +0 -0
  103. {pybaseutils-2.4.8 → pybaseutils-2.4.9}/pybaseutils/pandas_utils.py +0 -0
  104. {pybaseutils-2.4.8 → pybaseutils-2.4.9}/pybaseutils/plot_utils.py +0 -0
  105. {pybaseutils-2.4.8 → pybaseutils-2.4.9}/pybaseutils/pose/__init__.py +0 -0
  106. {pybaseutils-2.4.8 → pybaseutils-2.4.9}/pybaseutils/pose/bones_utils.py +0 -0
  107. {pybaseutils-2.4.8 → pybaseutils-2.4.9}/pybaseutils/pose/human_pose.py +0 -0
  108. {pybaseutils-2.4.8 → pybaseutils-2.4.9}/pybaseutils/pose/pose_utils.py +0 -0
  109. {pybaseutils-2.4.8 → pybaseutils-2.4.9}/pybaseutils/pycpp/__init__.py +0 -0
  110. {pybaseutils-2.4.8 → pybaseutils-2.4.9}/pybaseutils/pycpp/demo.py +0 -0
  111. {pybaseutils-2.4.8 → pybaseutils-2.4.9}/pybaseutils/pycpp/main.py +0 -0
  112. {pybaseutils-2.4.8 → pybaseutils-2.4.9}/pybaseutils/server/__init__.py +0 -0
  113. {pybaseutils-2.4.8 → pybaseutils-2.4.9}/pybaseutils/server/apm_server.py +0 -0
  114. {pybaseutils-2.4.8 → pybaseutils-2.4.9}/pybaseutils/setup_config.py +0 -0
  115. {pybaseutils-2.4.8 → pybaseutils-2.4.9}/pybaseutils/singleton_utils.py +0 -0
  116. {pybaseutils-2.4.8 → pybaseutils-2.4.9}/pybaseutils/text_utils.py +0 -0
  117. {pybaseutils-2.4.8 → pybaseutils-2.4.9}/pybaseutils/thread_utils.py +0 -0
  118. {pybaseutils-2.4.8 → pybaseutils-2.4.9}/pybaseutils/time_utils.py +0 -0
  119. {pybaseutils-2.4.8 → pybaseutils-2.4.9}/pybaseutils/tracemalloc_utils.py +0 -0
  120. {pybaseutils-2.4.8 → pybaseutils-2.4.9}/pybaseutils/tracemalloc_utils2.py +0 -0
  121. {pybaseutils-2.4.8 → pybaseutils-2.4.9}/pybaseutils/tracking/QueueTable.py +0 -0
  122. {pybaseutils-2.4.8 → pybaseutils-2.4.9}/pybaseutils/tracking/__init__.py +0 -0
  123. {pybaseutils-2.4.8 → pybaseutils-2.4.9}/pybaseutils/tracking/demo.py +0 -0
  124. {pybaseutils-2.4.8 → pybaseutils-2.4.9}/pybaseutils/tracking/kalman_filter.py +0 -0
  125. {pybaseutils-2.4.8 → pybaseutils-2.4.9}/pybaseutils/tracking/mean_filter.py +0 -0
  126. {pybaseutils-2.4.8 → pybaseutils-2.4.9}/pybaseutils/tracking/motion_filter.py +0 -0
  127. {pybaseutils-2.4.8 → pybaseutils-2.4.9}/pybaseutils/tracking/pose_filter.py +0 -0
  128. {pybaseutils-2.4.8 → pybaseutils-2.4.9}/pybaseutils/transforms/__init__.py +0 -0
  129. {pybaseutils-2.4.8 → pybaseutils-2.4.9}/pybaseutils/transforms/affine_transform.py +0 -0
  130. {pybaseutils-2.4.8 → pybaseutils-2.4.9}/pybaseutils/transforms/build_transform.py +0 -0
  131. {pybaseutils-2.4.8 → pybaseutils-2.4.9}/pybaseutils/transforms/face_alignment.py +0 -0
  132. {pybaseutils-2.4.8 → pybaseutils-2.4.9}/pybaseutils/transforms/imgaug_utils.py +0 -0
  133. {pybaseutils-2.4.8 → pybaseutils-2.4.9}/pybaseutils/transforms/transform_utils.py +0 -0
  134. {pybaseutils-2.4.8 → pybaseutils-2.4.9}/pybaseutils/web/__init__.py +0 -0
  135. {pybaseutils-2.4.8 → pybaseutils-2.4.9}/pybaseutils/web/app_gradio_image.py +0 -0
  136. {pybaseutils-2.4.8 → pybaseutils-2.4.9}/pybaseutils/web/app_stweb_image.py +0 -0
  137. {pybaseutils-2.4.8 → pybaseutils-2.4.9}/pybaseutils/web/app_webio_image.py +0 -0
  138. {pybaseutils-2.4.8 → pybaseutils-2.4.9}/pybaseutils/web/demo.py +0 -0
  139. {pybaseutils-2.4.8 → pybaseutils-2.4.9}/pybaseutils/word_utils.py +0 -0
  140. {pybaseutils-2.4.8 → pybaseutils-2.4.9}/pybaseutils/worker.py +0 -0
  141. {pybaseutils-2.4.8 → pybaseutils-2.4.9}/pybaseutils/yaml_utils.py +0 -0
  142. {pybaseutils-2.4.8 → pybaseutils-2.4.9}/pybaseutils.egg-info/dependency_links.txt +0 -0
  143. {pybaseutils-2.4.8 → pybaseutils-2.4.9}/pybaseutils.egg-info/not-zip-safe +0 -0
  144. {pybaseutils-2.4.8 → pybaseutils-2.4.9}/pybaseutils.egg-info/top_level.txt +0 -0
  145. {pybaseutils-2.4.8 → pybaseutils-2.4.9}/setup.cfg +0 -0
  146. {pybaseutils-2.4.8 → pybaseutils-2.4.9}/setup.py +0 -0
  147. {pybaseutils-2.4.8 → pybaseutils-2.4.9}/test_py/Image_enhance/__init__.py +0 -0
  148. {pybaseutils-2.4.8 → pybaseutils-2.4.9}/test_py/Image_enhance/dmeo01.py +0 -0
  149. {pybaseutils-2.4.8 → pybaseutils-2.4.9}/test_py/WebCrawler/__init__.py +0 -0
  150. {pybaseutils-2.4.8 → pybaseutils-2.4.9}/test_py/WebCrawler/search_baidu.py +0 -0
  151. {pybaseutils-2.4.8 → pybaseutils-2.4.9}/test_py/WebCrawler/search_biying.py +0 -0
  152. {pybaseutils-2.4.8 → pybaseutils-2.4.9}/test_py/__init__.py +0 -0
  153. {pybaseutils-2.4.8 → pybaseutils-2.4.9}/test_py/aije/__init__.py +0 -0
  154. {pybaseutils-2.4.8 → pybaseutils-2.4.9}/test_py/aije/action_dataset.py +0 -0
  155. {pybaseutils-2.4.8 → pybaseutils-2.4.9}/test_py/aije/build_cython.py +0 -0
  156. {pybaseutils-2.4.8 → pybaseutils-2.4.9}/test_py/aije/build_pyarmor.py +0 -0
  157. {pybaseutils-2.4.8 → pybaseutils-2.4.9}/test_py/aije/build_service.py +0 -0
  158. {pybaseutils-2.4.8 → pybaseutils-2.4.9}/test_py/aije/convert_cvat2labelme.py +0 -0
  159. {pybaseutils-2.4.8 → pybaseutils-2.4.9}/test_py/aije/convert_labelme2coco.py +0 -0
  160. {pybaseutils-2.4.8 → pybaseutils-2.4.9}/test_py/aije/convert_labelme2voc.py +0 -0
  161. {pybaseutils-2.4.8 → pybaseutils-2.4.9}/test_py/aije/copy_move.py +0 -0
  162. {pybaseutils-2.4.8 → pybaseutils-2.4.9}/test_py/aije/demo_labelme_crop_aije.py +0 -0
  163. {pybaseutils-2.4.8 → pybaseutils-2.4.9}/test_py/aije/demo_labelme_crop_ailt.py +0 -0
  164. {pybaseutils-2.4.8 → pybaseutils-2.4.9}/test_py/aije/demo_labelme_shock.py +0 -0
  165. {pybaseutils-2.4.8 → pybaseutils-2.4.9}/test_py/aije/demo_motion_blur.py +0 -0
  166. {pybaseutils-2.4.8 → pybaseutils-2.4.9}/test_py/aije/demo_video_aije.py +0 -0
  167. {pybaseutils-2.4.8 → pybaseutils-2.4.9}/test_py/aije/demo_voc_crop.py +0 -0
  168. {pybaseutils-2.4.8 → pybaseutils-2.4.9}/test_py/aije/demo_voc_vis.py +0 -0
  169. {pybaseutils-2.4.8 → pybaseutils-2.4.9}/test_py/aije/get_pair_data.py +0 -0
  170. {pybaseutils-2.4.8 → pybaseutils-2.4.9}/test_py/aije/mask_image.py +0 -0
  171. {pybaseutils-2.4.8 → pybaseutils-2.4.9}/test_py/aije/video_convertor.py +0 -0
  172. {pybaseutils-2.4.8 → pybaseutils-2.4.9}/test_py/audio/__init__.py +0 -0
  173. {pybaseutils-2.4.8 → pybaseutils-2.4.9}/test_py/audio/demo.py +0 -0
  174. {pybaseutils-2.4.8 → pybaseutils-2.4.9}/test_py/audio/main.py +0 -0
  175. {pybaseutils-2.4.8 → pybaseutils-2.4.9}/test_py/audio/main_read.py +0 -0
  176. {pybaseutils-2.4.8 → pybaseutils-2.4.9}/test_py/audio/segment.py +0 -0
  177. {pybaseutils-2.4.8 → pybaseutils-2.4.9}/test_py/audio/speechbrain_asr_indoor_prod.py +0 -0
  178. {pybaseutils-2.4.8 → pybaseutils-2.4.9}/test_py/audio/speechbrain_demo.py +0 -0
  179. {pybaseutils-2.4.8 → pybaseutils-2.4.9}/test_py/audio_demo1.py +0 -0
  180. {pybaseutils-2.4.8 → pybaseutils-2.4.9}/test_py/camera/__init__.py +0 -0
  181. {pybaseutils-2.4.8 → pybaseutils-2.4.9}/test_py/camera/demo.py +0 -0
  182. {pybaseutils-2.4.8 → pybaseutils-2.4.9}/test_py/captcha/__init__.py +0 -0
  183. {pybaseutils-2.4.8 → pybaseutils-2.4.9}/test_py/captcha/demo.py +0 -0
  184. {pybaseutils-2.4.8 → pybaseutils-2.4.9}/test_py/class_attribute.py +0 -0
  185. {pybaseutils-2.4.8 → pybaseutils-2.4.9}/test_py/class_names.py +0 -0
  186. {pybaseutils-2.4.8 → pybaseutils-2.4.9}/test_py/converter/AffectNet.py +0 -0
  187. {pybaseutils-2.4.8 → pybaseutils-2.4.9}/test_py/converter/AsianMovie.py +0 -0
  188. {pybaseutils-2.4.8 → pybaseutils-2.4.9}/test_py/converter/BITVehicle2voc.py +0 -0
  189. {pybaseutils-2.4.8 → pybaseutils-2.4.9}/test_py/converter/BSTLD2voc.py +0 -0
  190. {pybaseutils-2.4.8 → pybaseutils-2.4.9}/test_py/converter/CCPD.py +0 -0
  191. {pybaseutils-2.4.8 → pybaseutils-2.4.9}/test_py/converter/CCPD2voc.py +0 -0
  192. {pybaseutils-2.4.8 → pybaseutils-2.4.9}/test_py/converter/FL3D_dataset.py +0 -0
  193. {pybaseutils-2.4.8 → pybaseutils-2.4.9}/test_py/converter/FreiHAND2coco.py +0 -0
  194. {pybaseutils-2.4.8 → pybaseutils-2.4.9}/test_py/converter/MTFL2voc.py +0 -0
  195. {pybaseutils-2.4.8 → pybaseutils-2.4.9}/test_py/converter/TT100K.py +0 -0
  196. {pybaseutils-2.4.8 → pybaseutils-2.4.9}/test_py/converter/WaterMeters1.py +0 -0
  197. {pybaseutils-2.4.8 → pybaseutils-2.4.9}/test_py/converter/WaterMeters2.py +0 -0
  198. {pybaseutils-2.4.8 → pybaseutils-2.4.9}/test_py/converter/__init__.py +0 -0
  199. {pybaseutils-2.4.8 → pybaseutils-2.4.9}/test_py/converter/concat_coco.py +0 -0
  200. {pybaseutils-2.4.8 → pybaseutils-2.4.9}/test_py/converter/convert_coco2voc.py +0 -0
  201. {pybaseutils-2.4.8 → pybaseutils-2.4.9}/test_py/converter/convert_cvat2labelme.py +0 -0
  202. {pybaseutils-2.4.8 → pybaseutils-2.4.9}/test_py/converter/convert_gesture2hand.py +0 -0
  203. {pybaseutils-2.4.8 → pybaseutils-2.4.9}/test_py/converter/convert_labelme2coco.py +0 -0
  204. {pybaseutils-2.4.8 → pybaseutils-2.4.9}/test_py/converter/convert_labelme2cvat.py +0 -0
  205. {pybaseutils-2.4.8 → pybaseutils-2.4.9}/test_py/converter/convert_labelme2labelme.py +0 -0
  206. {pybaseutils-2.4.8 → pybaseutils-2.4.9}/test_py/converter/convert_labelme2voc.py +0 -0
  207. {pybaseutils-2.4.8 → pybaseutils-2.4.9}/test_py/converter/convert_voc2labelme.py +0 -0
  208. {pybaseutils-2.4.8 → pybaseutils-2.4.9}/test_py/converter/convert_yolo2labelme.py +0 -0
  209. {pybaseutils-2.4.8 → pybaseutils-2.4.9}/test_py/converter/fall_dataset.py +0 -0
  210. {pybaseutils-2.4.8 → pybaseutils-2.4.9}/test_py/converter/fatigue_driving.py +0 -0
  211. {pybaseutils-2.4.8 → pybaseutils-2.4.9}/test_py/converter/fdd_dataset.py +0 -0
  212. {pybaseutils-2.4.8 → pybaseutils-2.4.9}/test_py/converter/get_pair_data.py +0 -0
  213. {pybaseutils-2.4.8 → pybaseutils-2.4.9}/test_py/converter/handpose2coco.py +0 -0
  214. {pybaseutils-2.4.8 → pybaseutils-2.4.9}/test_py/converter/insects_for_aichallenger.py +0 -0
  215. {pybaseutils-2.4.8 → pybaseutils-2.4.9}/test_py/converter/parking_rois_gopro.py +0 -0
  216. {pybaseutils-2.4.8 → pybaseutils-2.4.9}/test_py/converter/tt100k_utils.py +0 -0
  217. {pybaseutils-2.4.8 → pybaseutils-2.4.9}/test_py/converter/ua_detrac2voc.py +0 -0
  218. {pybaseutils-2.4.8 → pybaseutils-2.4.9}/test_py/converter/ucf101_dataset.py +0 -0
  219. {pybaseutils-2.4.8 → pybaseutils-2.4.9}/test_py/converter/voc_sbd2labelme.py +0 -0
  220. {pybaseutils-2.4.8 → pybaseutils-2.4.9}/test_py/cython_build/__init__.py +0 -0
  221. {pybaseutils-2.4.8 → pybaseutils-2.4.9}/test_py/cython_build/build_cython.py +0 -0
  222. {pybaseutils-2.4.8 → pybaseutils-2.4.9}/test_py/cython_build/build_pyarmor.py +0 -0
  223. {pybaseutils-2.4.8 → pybaseutils-2.4.9}/test_py/cython_build/cryptography_demo.py +0 -0
  224. {pybaseutils-2.4.8 → pybaseutils-2.4.9}/test_py/cython_build/fun_sum.py +0 -0
  225. {pybaseutils-2.4.8 → pybaseutils-2.4.9}/test_py/cython_build/main.py +0 -0
  226. {pybaseutils-2.4.8 → pybaseutils-2.4.9}/test_py/cython_build/model_des_enctypt.py +0 -0
  227. {pybaseutils-2.4.8 → pybaseutils-2.4.9}/test_py/cython_build/model_enctypt.py +0 -0
  228. {pybaseutils-2.4.8 → pybaseutils-2.4.9}/test_py/date_dataset.py +0 -0
  229. {pybaseutils-2.4.8 → pybaseutils-2.4.9}/test_py/date_demo.py +0 -0
  230. {pybaseutils-2.4.8 → pybaseutils-2.4.9}/test_py/datedataset_bk.py +0 -0
  231. {pybaseutils-2.4.8 → pybaseutils-2.4.9}/test_py/demo1.py +0 -0
  232. {pybaseutils-2.4.8 → pybaseutils-2.4.9}/test_py/demo2.py +0 -0
  233. {pybaseutils-2.4.8 → pybaseutils-2.4.9}/test_py/demo3.py +0 -0
  234. {pybaseutils-2.4.8 → pybaseutils-2.4.9}/test_py/demo4.py +0 -0
  235. {pybaseutils-2.4.8 → pybaseutils-2.4.9}/test_py/demo_async_await1.py +0 -0
  236. {pybaseutils-2.4.8 → pybaseutils-2.4.9}/test_py/demo_async_await2.py +0 -0
  237. {pybaseutils-2.4.8 → pybaseutils-2.4.9}/test_py/demo_coco_vis.py +0 -0
  238. {pybaseutils-2.4.8 → pybaseutils-2.4.9}/test_py/demo_copy_files.py +0 -0
  239. {pybaseutils-2.4.8 → pybaseutils-2.4.9}/test_py/demo_copy_files_for_voc.py +0 -0
  240. {pybaseutils-2.4.8 → pybaseutils-2.4.9}/test_py/demo_ffmpy.py +0 -0
  241. {pybaseutils-2.4.8 → pybaseutils-2.4.9}/test_py/demo_for_annular_to_rect.py +0 -0
  242. {pybaseutils-2.4.8 → pybaseutils-2.4.9}/test_py/demo_for_pair_file.py +0 -0
  243. {pybaseutils-2.4.8 → pybaseutils-2.4.9}/test_py/demo_for_polygon.py +0 -0
  244. {pybaseutils-2.4.8 → pybaseutils-2.4.9}/test_py/demo_for_trt.py +0 -0
  245. {pybaseutils-2.4.8 → pybaseutils-2.4.9}/test_py/demo_get_file_label.py +0 -0
  246. {pybaseutils-2.4.8 → pybaseutils-2.4.9}/test_py/demo_get_file_list.py +0 -0
  247. {pybaseutils-2.4.8 → pybaseutils-2.4.9}/test_py/demo_gif.py +0 -0
  248. {pybaseutils-2.4.8 → pybaseutils-2.4.9}/test_py/demo_gif_video.py +0 -0
  249. {pybaseutils-2.4.8 → pybaseutils-2.4.9}/test_py/demo_image_crop.py +0 -0
  250. {pybaseutils-2.4.8 → pybaseutils-2.4.9}/test_py/demo_kpts.py +0 -0
  251. {pybaseutils-2.4.8 → pybaseutils-2.4.9}/test_py/demo_labelme.py +0 -0
  252. {pybaseutils-2.4.8 → pybaseutils-2.4.9}/test_py/demo_labelme_crop.py +0 -0
  253. {pybaseutils-2.4.8 → pybaseutils-2.4.9}/test_py/demo_lableme_vis.py +0 -0
  254. {pybaseutils-2.4.8 → pybaseutils-2.4.9}/test_py/demo_letterbox.py +0 -0
  255. {pybaseutils-2.4.8 → pybaseutils-2.4.9}/test_py/demo_metrics.py +0 -0
  256. {pybaseutils-2.4.8 → pybaseutils-2.4.9}/test_py/demo_mosaic.py +0 -0
  257. {pybaseutils-2.4.8 → pybaseutils-2.4.9}/test_py/demo_mouse.py +0 -0
  258. {pybaseutils-2.4.8 → pybaseutils-2.4.9}/test_py/demo_nii.py +0 -0
  259. {pybaseutils-2.4.8 → pybaseutils-2.4.9}/test_py/demo_pandas.py +0 -0
  260. {pybaseutils-2.4.8 → pybaseutils-2.4.9}/test_py/demo_plot.py +0 -0
  261. {pybaseutils-2.4.8 → pybaseutils-2.4.9}/test_py/demo_prelabelme.py +0 -0
  262. {pybaseutils-2.4.8 → pybaseutils-2.4.9}/test_py/demo_rename.py +0 -0
  263. {pybaseutils-2.4.8 → pybaseutils-2.4.9}/test_py/demo_standard_image .py +0 -0
  264. {pybaseutils-2.4.8 → pybaseutils-2.4.9}/test_py/demo_standard_video .py +0 -0
  265. {pybaseutils-2.4.8 → pybaseutils-2.4.9}/test_py/demo_taichi.py +0 -0
  266. {pybaseutils-2.4.8 → pybaseutils-2.4.9}/test_py/demo_video2frame.py +0 -0
  267. {pybaseutils-2.4.8 → pybaseutils-2.4.9}/test_py/demo_video_crop.py +0 -0
  268. {pybaseutils-2.4.8 → pybaseutils-2.4.9}/test_py/demo_voc_crop.py +0 -0
  269. {pybaseutils-2.4.8 → pybaseutils-2.4.9}/test_py/demo_voc_vis.py +0 -0
  270. {pybaseutils-2.4.8 → pybaseutils-2.4.9}/test_py/demo_word_similar.py +0 -0
  271. {pybaseutils-2.4.8 → pybaseutils-2.4.9}/test_py/demo_worker1.py +0 -0
  272. {pybaseutils-2.4.8 → pybaseutils-2.4.9}/test_py/demo_worker2.py +0 -0
  273. {pybaseutils-2.4.8 → pybaseutils-2.4.9}/test_py/detector/__init__.py +0 -0
  274. {pybaseutils-2.4.8 → pybaseutils-2.4.9}/test_py/detector/demo.py +0 -0
  275. {pybaseutils-2.4.8 → pybaseutils-2.4.9}/test_py/detector/detect_face_person.py +0 -0
  276. {pybaseutils-2.4.8 → pybaseutils-2.4.9}/test_py/detector/predet_labelme.py +0 -0
  277. {pybaseutils-2.4.8 → pybaseutils-2.4.9}/test_py/edit_distance/__init__.py +0 -0
  278. {pybaseutils-2.4.8 → pybaseutils-2.4.9}/test_py/edit_distance/demo.py +0 -0
  279. {pybaseutils-2.4.8 → pybaseutils-2.4.9}/test_py/edit_distance/text_matching.py +0 -0
  280. {pybaseutils-2.4.8 → pybaseutils-2.4.9}/test_py/fast_api/__init__.py +0 -0
  281. {pybaseutils-2.4.8 → pybaseutils-2.4.9}/test_py/fast_api/create_image_url.py +0 -0
  282. {pybaseutils-2.4.8 → pybaseutils-2.4.9}/test_py/fast_api/get_image_url.py +0 -0
  283. {pybaseutils-2.4.8 → pybaseutils-2.4.9}/test_py/flask_demo/__init__.py +0 -0
  284. {pybaseutils-2.4.8 → pybaseutils-2.4.9}/test_py/flask_demo/app.py +0 -0
  285. {pybaseutils-2.4.8 → pybaseutils-2.4.9}/test_py/flask_demo/utils/__init__.py +0 -0
  286. {pybaseutils-2.4.8 → pybaseutils-2.4.9}/test_py/flask_demo/utils/utils.py +0 -0
  287. {pybaseutils-2.4.8 → pybaseutils-2.4.9}/test_py/get_file_list.py +0 -0
  288. {pybaseutils-2.4.8 → pybaseutils-2.4.9}/test_py/gradio_app.py +0 -0
  289. {pybaseutils-2.4.8 → pybaseutils-2.4.9}/test_py/gradio_app_v2.py +0 -0
  290. {pybaseutils-2.4.8 → pybaseutils-2.4.9}/test_py/image_correction/__init__.py +0 -0
  291. {pybaseutils-2.4.8 → pybaseutils-2.4.9}/test_py/image_correction/demo_correction_v1.py +0 -0
  292. {pybaseutils-2.4.8 → pybaseutils-2.4.9}/test_py/image_correction/demo_correction_v2.py +0 -0
  293. {pybaseutils-2.4.8 → pybaseutils-2.4.9}/test_py/image_correction/demo_correction_v3.py +0 -0
  294. {pybaseutils-2.4.8 → pybaseutils-2.4.9}/test_py/kafka_worker.py +0 -0
  295. {pybaseutils-2.4.8 → pybaseutils-2.4.9}/test_py/men_tracemalloc.py +0 -0
  296. {pybaseutils-2.4.8 → pybaseutils-2.4.9}/test_py/milvus_demo/__init__.py +0 -0
  297. {pybaseutils-2.4.8 → pybaseutils-2.4.9}/test_py/milvus_demo/demo01.py +0 -0
  298. {pybaseutils-2.4.8 → pybaseutils-2.4.9}/test_py/milvus_demo/demo02.py +0 -0
  299. {pybaseutils-2.4.8 → pybaseutils-2.4.9}/test_py/milvus_demo/hello_milvus.py +0 -0
  300. {pybaseutils-2.4.8 → pybaseutils-2.4.9}/test_py/milvus_demo/milvus_client.py +0 -0
  301. {pybaseutils-2.4.8 → pybaseutils-2.4.9}/test_py/model_process.py +0 -0
  302. {pybaseutils-2.4.8 → pybaseutils-2.4.9}/test_py/performance.py +0 -0
  303. {pybaseutils-2.4.8 → pybaseutils-2.4.9}/test_py/pose/__init__.py +0 -0
  304. {pybaseutils-2.4.8 → pybaseutils-2.4.9}/test_py/pose/human_pose.py +0 -0
  305. {pybaseutils-2.4.8 → pybaseutils-2.4.9}/test_py/qrcode/__init__.py +0 -0
  306. {pybaseutils-2.4.8 → pybaseutils-2.4.9}/test_py/qrcode/demo.py +0 -0
  307. {pybaseutils-2.4.8 → pybaseutils-2.4.9}/test_py/redis_py/__init__.py +0 -0
  308. {pybaseutils-2.4.8 → pybaseutils-2.4.9}/test_py/redis_py/knn_search.py +0 -0
  309. {pybaseutils-2.4.8 → pybaseutils-2.4.9}/test_py/redis_py/redis_client.py +0 -0
  310. {pybaseutils-2.4.8 → pybaseutils-2.4.9}/test_py/registry/__init__.py +0 -0
  311. {pybaseutils-2.4.8 → pybaseutils-2.4.9}/test_py/registry/base.py +0 -0
  312. {pybaseutils-2.4.8 → pybaseutils-2.4.9}/test_py/registry/component.py +0 -0
  313. {pybaseutils-2.4.8 → pybaseutils-2.4.9}/test_py/registry/main.py +0 -0
  314. {pybaseutils-2.4.8 → pybaseutils-2.4.9}/test_py/registry/register.py +0 -0
  315. {pybaseutils-2.4.8 → pybaseutils-2.4.9}/test_py/single_class/GRU.py +0 -0
  316. {pybaseutils-2.4.8 → pybaseutils-2.4.9}/test_py/single_class/TCN.py +0 -0
  317. {pybaseutils-2.4.8 → pybaseutils-2.4.9}/test_py/single_class/__init__.py +0 -0
  318. {pybaseutils-2.4.8 → pybaseutils-2.4.9}/test_py/single_class/demo.py +0 -0
  319. {pybaseutils-2.4.8 → pybaseutils-2.4.9}/test_py/slowfastnet.py +0 -0
  320. {pybaseutils-2.4.8 → pybaseutils-2.4.9}/test_py/test_fr/__init__.py +0 -0
  321. {pybaseutils-2.4.8 → pybaseutils-2.4.9}/test_py/test_fr/demo11.py +0 -0
  322. {pybaseutils-2.4.8 → pybaseutils-2.4.9}/test_py/test_fr/idcardocr.py +0 -0
  323. {pybaseutils-2.4.8 → pybaseutils-2.4.9}/test_py/web_socket/__init__.py +0 -0
  324. {pybaseutils-2.4.8 → pybaseutils-2.4.9}/test_py/web_socket/asr_clients.py +0 -0
  325. {pybaseutils-2.4.8 → pybaseutils-2.4.9}/test_py/web_socket/asr_service.py +0 -0
  326. {pybaseutils-2.4.8 → pybaseutils-2.4.9}/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.8
3
+ Version: 2.4.9
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.8'
11
+ __version__ = '2.4.9'
@@ -0,0 +1,90 @@
1
+ import cv2
2
+ import time
3
+ import numpy as np
4
+ import subprocess
5
+
6
+
7
+ class CameraCapture(object):
8
+ def __init__(self, video: str or int = 0, size=(1920, 1080), fps=30):
9
+ """
10
+ :param video: 视频设备路径或索引(如 0 或 "/dev/video0")
11
+ :param size: 视频分辨率 (宽, 高)
12
+ :param fps: 视频帧率
13
+ """
14
+ self.size = size
15
+ self.fps = fps
16
+ self.stopped = False
17
+ if isinstance(video, int): video = f"/dev/video{video}"
18
+ # 构建 FFmpeg 命令
19
+ # -re: 以原生帧率读取(模拟直播流)
20
+ # -fflags nobuffer: 关键!禁用缓冲区
21
+ # -flags low_delay: 关键!低延迟模式
22
+ # -probesize 32: 减小探测包大小,加快启动
23
+ # -pix_fmt bgr24: 直接输出 BGR 格式,方便 OpenCV/Numpy 使用,避免后续转换
24
+ command = [
25
+ 'ffmpeg',
26
+ '-re', # 按帧率读取
27
+ '-fflags', 'nobuffer', # 无缓冲
28
+ '-flags', 'low_delay', # 低延迟
29
+ '-probesize', '32', # 快速探测
30
+ '-i', video, # 输入设备
31
+ '-f', 'rawvideo', # 输出原始视频流
32
+ '-pix_fmt', 'bgr24', # 像素格式 BGR (OpenCV 格式)
33
+ '-s', f'{size[0]}x{size[1]}', # 分辨率
34
+ '-r', str(fps), # 帧率
35
+ '-' # 输出到 stdout
36
+ ]
37
+ # 启动进程
38
+ self.pipe = subprocess.Popen(command, stdout=subprocess.PIPE, bufsize=10 ** 8)
39
+ print(f"command: {' '.join(command)}")
40
+
41
+ def read(self):
42
+ if self.stopped:
43
+ self.stop()
44
+ return False, None
45
+ # 读取一帧的数据量 (宽 * 高 * 3通道)
46
+ buf = self.pipe.stdout.read(self.size[0] * self.size[1] * 3)
47
+ if len(buf) != self.size[0] * self.size[1] * 3:
48
+ self.stop()
49
+ return False, None # 读取失败或结束
50
+ # 将字节流转换为 numpy 数组
51
+ frame = np.frombuffer(buf, dtype=np.uint8).reshape((self.size[1], self.size[0], 3))
52
+ return True, frame
53
+
54
+ def release(self):
55
+ self.stop()
56
+
57
+ def stop(self):
58
+ self.stopped = True
59
+ time.sleep(0.1)
60
+ self.pipe.terminate() # 终止进程
61
+ try:
62
+ outs, errs = self.pipe.communicate(timeout=2)
63
+ except subprocess.TimeoutExpired as err:
64
+ # 如果 communicate 也超时(极少见),强制杀死
65
+ self.pipe.kill()
66
+ self.pipe.communicate() # 再次尝试清理
67
+ print(err)
68
+
69
+ def display(self):
70
+ while True:
71
+ t1 = time.time()
72
+ ret, frame = self.read()
73
+ t2 = time.time()
74
+ if not ret:
75
+ break
76
+ t21 = (t2 - t1) * 1000
77
+ print(f"image shape: {frame.shape},耗时: {t21:.3f}ms")
78
+ cv2.imshow('FFmpeg Low Latency', frame)
79
+ if cv2.waitKey(30) & 0xFF == ord('q'):
80
+ break
81
+
82
+
83
+ if __name__ == '__main__':
84
+ fps = 30
85
+ width = 1920
86
+ height = 1080
87
+ video = 0 # Windows 下可能是 0 或 "video=Integrated Webcam"
88
+ # video = "/home/PKing/Videos/demo-src.mp4" # Windows 下可能是 0 或 "video=Integrated Webcam"
89
+ cap = CameraCapture(video=video, size=(width, height), fps=fps)
90
+ cap.display()
@@ -24,6 +24,26 @@ get_video_info = image_utils.get_video_info
24
24
  get_video_writer = image_utils.get_video_writer
25
25
 
26
26
 
27
+ def get_usb_camera(video=-1, max_index=50):
28
+ """
29
+ 获取当前系统中连接的USB摄像头索引。
30
+ :param video: 视频路径或摄像头索引,默认值为-1表示自动检测。当video>=0时,不进行检测,直接返回video。
31
+ :param max_index: 最大检测索引范围,默认值为50。
32
+ :return: 一摄像头索引,camera=-1表示未检测到摄像头。
33
+ """
34
+ if video >= 0: return video
35
+ print("正在检测USB摄像头ID...")
36
+ camera = -1
37
+ for i in range(max_index):
38
+ cap = cv2.VideoCapture(i)
39
+ if cap.isOpened():
40
+ camera = i
41
+ cap.release()
42
+ break
43
+ print("检测到USB摄像头ID={}".format(camera))
44
+ return camera
45
+
46
+
27
47
  def merge_video(video1, video2, output="./output.mp4"):
28
48
  cmd = f'ffmpeg -i {video1} -i {video2} -filter_complex "[0:v:0][1:v:0]concat=n=2:v=1:a=0[outv]" -map "[outv]" {output}'
29
49
 
@@ -304,8 +324,8 @@ def video_capture(video: int or str, save_video: str or int = None, interval=1,
304
324
  video = file_utils.str2number(video)
305
325
  if isinstance(video, str) and os.path.isfile(video):
306
326
  assert os.path.exists(video), f"video={video}"
307
- video_cap = image_utils.get_video_capture(video, fps=None)
308
- w, h, num_frames, fps = image_utils.get_video_info(video_cap, **kwargs)
327
+ cap = image_utils.get_video_capture(video, fps=None)
328
+ w, h, num_frames, fps = image_utils.get_video_info(cap, **kwargs)
309
329
  time = kwargs.get("time", tuple()) # TODO 开始播放时间time[0],结束播放时间time[1],单位秒S
310
330
  clip = kwargs.get("clip", tuple()) # TODO 开始播放位置clip[0],结束播放位置clip[1]
311
331
  start, end = 0, -1
@@ -321,7 +341,7 @@ def video_capture(video: int or str, save_video: str or int = None, interval=1,
321
341
  count = 0
322
342
  video_writer = None
323
343
  while True:
324
- ret, frame = video_cap.read()
344
+ ret, frame = cap.read()
325
345
  if count % interval == 0 and count >= start:
326
346
  # TODO 设置抽帧的位置,但某些格式视频容易出现问题
327
347
  # if isinstance(video, str): video_cap.set(cv2.CAP_PROP_POS_FRAMES, count)
@@ -335,7 +355,7 @@ def video_capture(video: int or str, save_video: str or int = None, interval=1,
335
355
  if not video_writer: video_writer = image_utils.get_video_writer(save_video, w, h, save_fps)
336
356
  video_writer.write(frame)
337
357
  count += 1
338
- video_cap.release()
358
+ cap.release()
339
359
  if video_writer:
340
360
  print("save video:{}".format(save_video))
341
361
  video_writer.release()
@@ -347,8 +367,8 @@ def video_iterator(video, save_video: str or int = None, interval=1, size=(), fr
347
367
  读取摄像头或者视频流迭代器
348
368
  Usage:
349
369
  from pybaseutils.cvutils import video_utils
350
- video_cap = video_utils.video_iterator(video, save_video, time=(4, 10))
351
- for data_info in video_cap:
370
+ cap = video_utils.video_iterator(video, save_video, time=(4, 10))
371
+ for data_info in cap:
352
372
  frame = data_info["frame"]
353
373
  ...
354
374
  :param video: String 视频文件,如*.avi,*.mp4,...
@@ -372,8 +392,8 @@ def video_iterator(video, save_video: str or int = None, interval=1, size=(), fr
372
392
  video = file_utils.str2number(video)
373
393
  if isinstance(video, str) and os.path.isfile(video):
374
394
  assert os.path.exists(video), f"video={video}"
375
- video_cap = image_utils.get_video_capture(video, fps=None)
376
- w, h, num_frames, fps = image_utils.get_video_info(video_cap, **kwargs)
395
+ cap = image_utils.get_video_capture(video, fps=None)
396
+ w, h, num_frames, fps = image_utils.get_video_info(cap, **kwargs)
377
397
  time = kwargs.get("time", tuple()) # TODO 开始播放时间time[0],结束播放时间time[1],单位秒S
378
398
  clip = kwargs.get("clip", tuple()) # TODO 开始播放位置clip[0],结束播放位置clip[1]
379
399
  start, end = 0, -1
@@ -393,16 +413,16 @@ def video_iterator(video, save_video: str or int = None, interval=1, size=(), fr
393
413
  t0 = -1
394
414
  while True:
395
415
  systime = timelib.time()
396
- ret, frame = (False, None) if use_fast else video_cap.read() # 读取视频很快,但读取USB摄像头比较耗时
397
- t = video_cap.get(cv2.CAP_PROP_POS_MSEC) / 1000 # 获得视频偏移量毫秒为单位
416
+ ret, frame = (False, None) if use_fast else cap.read() # 读取视频很快,但读取USB摄像头比较耗时
417
+ t = cap.get(cv2.CAP_PROP_POS_MSEC) / 1000 # 获得视频偏移量毫秒为单位
398
418
  if t0 < 0 < t: t0 = t
399
419
  if t0 > 0: t = t - t0 # 获得视频偏移量毫秒为单位
400
420
  finish = 0 < end <= (count + interval)
401
421
  if count % interval == 0 and count >= start:
402
422
  # TODO 设置抽帧的位置,但某些格式视频容易出现问题
403
423
  if use_fast and isinstance(video, str):
404
- video_cap.set(cv2.CAP_PROP_POS_FRAMES, count)
405
- ret, frame = video_cap.read()
424
+ cap.set(cv2.CAP_PROP_POS_FRAMES, count)
425
+ ret, frame = cap.read()
406
426
  if not ret or 0 < end <= count or frame is None: break
407
427
  if size: frame = image_utils.resize_image(frame, size=size)
408
428
  if task: frame = task(frame, **kwargs)
@@ -421,7 +441,7 @@ def video_iterator(video, save_video: str or int = None, interval=1, size=(), fr
421
441
  video_writer.write(frame)
422
442
  if data_info['finish']: break # 控制结束
423
443
  count += 1
424
- video_cap.release()
444
+ cap.release()
425
445
  if video_writer:
426
446
  print("save video:{}".format(save_video))
427
447
  video_writer.release()
@@ -1579,6 +1579,7 @@ def zip_file(src, dst=None, s=None):
1579
1579
  return dst
1580
1580
 
1581
1581
 
1582
+
1582
1583
  if __name__ == '__main__':
1583
1584
  from pybaseutils import time_utils
1584
1585
 
@@ -3293,33 +3293,34 @@ def get_video_capture(video, width=None, height=None, fps=None):
3293
3293
  :param fps: 设置视频播放帧率
3294
3294
  :return:
3295
3295
  """
3296
- video_cap = cv2.VideoCapture(video)
3296
+ cap = cv2.VideoCapture(video)
3297
3297
  # 设置分辨率
3298
3298
  if width:
3299
- video_cap.set(cv2.CAP_PROP_FRAME_WIDTH, width)
3299
+ cap.set(cv2.CAP_PROP_FRAME_WIDTH, width)
3300
3300
  if height:
3301
- video_cap.set(cv2.CAP_PROP_FRAME_HEIGHT, height)
3301
+ cap.set(cv2.CAP_PROP_FRAME_HEIGHT, height)
3302
3302
  if fps:
3303
- video_cap.set(cv2.CAP_PROP_FPS, fps)
3304
- return video_cap
3303
+ cap.set(cv2.CAP_PROP_FPS, fps)
3304
+ # cap.set(cv2.CAP_PROP_BUFFERSIZE, 1) # 设置缓冲区大小为1,确保每次读取的都是最新,避免旧帧积压导致的延迟。
3305
+ return cap
3305
3306
 
3306
3307
 
3307
- def get_video_info(video_cap, disp=True, **kwargs):
3308
+ def get_video_info(cap, disp=True, **kwargs):
3308
3309
  """
3309
3310
  获得视频的基础信息
3310
- :param video_cap:视频对象 或者视频文件路径 int | str | cv2.VideoCapture
3311
+ :param cap:视频对象 或者视频文件路径 int | str | cv2.VideoCapture
3311
3312
  :param disp: 是否显示视频信息
3312
3313
  :return:
3313
3314
  """
3314
- isfile = isinstance(video_cap, str) or isinstance(video_cap, int)
3315
- if isfile: video_cap = get_video_capture(video_cap)
3316
- width = int(video_cap.get(cv2.CAP_PROP_FRAME_WIDTH))
3317
- height = int(video_cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
3318
- num_frames = int(video_cap.get(cv2.CAP_PROP_FRAME_COUNT))
3319
- fps = video_cap.get(cv2.CAP_PROP_FPS)
3315
+ isfile = isinstance(cap, str) or isinstance(cap, int)
3316
+ if isfile: cap = get_video_capture(cap)
3317
+ width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
3318
+ height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
3319
+ num_frames = int(cap.get(cv2.CAP_PROP_FRAME_COUNT))
3320
+ fps = cap.get(cv2.CAP_PROP_FPS)
3320
3321
  fps = math.ceil(fps)
3321
3322
  if disp: print("read video:width:{},height:{},fps:{},num_frames:{}".format(width, height, fps, num_frames))
3322
- if isfile: video_cap.release()
3323
+ if isfile: cap.release()
3323
3324
  return width, height, num_frames, fps
3324
3325
 
3325
3326
 
@@ -0,0 +1,24 @@
1
+ # -*- coding: utf-8 -*-
2
+ """
3
+ # --------------------------------------------------------
4
+ # @Author : Pan
5
+ # @E-mail :
6
+ # @Date : 2026-03-02 11:26:43
7
+ # @Brief :
8
+ # --------------------------------------------------------
9
+ """
10
+ import cv2
11
+ import socket
12
+
13
+
14
+ def get_local_ip():
15
+ """获取本机真实局域网IP地址"""
16
+ try:
17
+ s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
18
+ s.connect(("8.8.8.8", 80))
19
+ ip = s.getsockname()[0]
20
+ s.close()
21
+ return ip
22
+ except Exception:
23
+ return "127.0.0.1"
24
+
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: pybaseutils
3
- Version: 2.4.8
3
+ Version: 2.4.9
4
4
  Summary: pybaseutils
5
5
  Home-page: https://github.com/PanJinquan/base-utils
6
6
  Author: PanJinquan
@@ -18,6 +18,7 @@ pybaseutils/image_utils.py
18
18
  pybaseutils/json_utils.py
19
19
  pybaseutils/log.py
20
20
  pybaseutils/log_utils.py
21
+ pybaseutils/nets_utils.py
21
22
  pybaseutils/numpy_utils.py
22
23
  pybaseutils/pandas_utils.py
23
24
  pybaseutils/plot_utils.py
@@ -73,6 +74,7 @@ pybaseutils/converter/convert_yolo2labelme.py
73
74
  pybaseutils/converter/convert_yolo2voc.py
74
75
  pybaseutils/converter/prelabelme.py
75
76
  pybaseutils/cvutils/__init__.py
77
+ pybaseutils/cvutils/camera.py
76
78
  pybaseutils/cvutils/corner_utils.py
77
79
  pybaseutils/cvutils/monitor.py
78
80
  pybaseutils/cvutils/mouse_utils.py
@@ -196,6 +198,7 @@ test_py/men_tracemalloc.py
196
198
  test_py/model_process.py
197
199
  test_py/performance.py
198
200
  test_py/slowfastnet.py
201
+ test_py/test_camera.py
199
202
  test_py/Image_enhance/__init__.py
200
203
  test_py/Image_enhance/dmeo01.py
201
204
  test_py/WebCrawler/__init__.py
@@ -0,0 +1,28 @@
1
+ import numpy as np
2
+ import cv2
3
+ import time
4
+ from pybaseutils.cvutils.camera import CameraCapture
5
+
6
+
7
+ def display(cap: CameraCapture):
8
+ while True:
9
+ t1 = time.time()
10
+ ret, frame = cap.read()
11
+ t2 = time.time()
12
+ if not ret:
13
+ break
14
+ t21 = (t2 - t1) * 1000
15
+ print(f"image shape: {frame.shape},耗时: {t21:.3f}ms")
16
+ cv2.imshow('FFmpeg Low Latency', frame)
17
+ if cv2.waitKey(30) & 0xFF == ord('q'):
18
+ break
19
+
20
+
21
+ if __name__ == '__main__':
22
+ fps = 5
23
+ width = 1920
24
+ height = 1080
25
+ # video = 0 # Windows 下可能是 0 或 "video=Integrated Webcam"
26
+ video = "/home/PKing/Videos/demo-src.mp4" # Windows 下可能是 0 或 "video=Integrated Webcam"
27
+ cap = CameraCapture(video=video, size=(width, height), fps=fps)
28
+ display(cap)
File without changes
File without changes