pybaseutils 2.4.8__tar.gz → 2.4.10__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.10}/PKG-INFO +1 -1
  2. {pybaseutils-2.4.8 → pybaseutils-2.4.10}/pybaseutils/__init__.py +1 -1
  3. pybaseutils-2.4.10/pybaseutils/cvutils/camera.py +90 -0
  4. {pybaseutils-2.4.8 → pybaseutils-2.4.10}/pybaseutils/cvutils/video_utils.py +34 -13
  5. {pybaseutils-2.4.8 → pybaseutils-2.4.10}/pybaseutils/file_utils.py +1 -0
  6. {pybaseutils-2.4.8 → pybaseutils-2.4.10}/pybaseutils/image_utils.py +15 -14
  7. pybaseutils-2.4.10/pybaseutils/nets_utils.py +24 -0
  8. {pybaseutils-2.4.8 → pybaseutils-2.4.10}/pybaseutils.egg-info/PKG-INFO +1 -1
  9. {pybaseutils-2.4.8 → pybaseutils-2.4.10}/pybaseutils.egg-info/SOURCES.txt +3 -0
  10. pybaseutils-2.4.10/test_py/test_camera.py +28 -0
  11. {pybaseutils-2.4.8 → pybaseutils-2.4.10}/LICENCE +0 -0
  12. {pybaseutils-2.4.8 → pybaseutils-2.4.10}/README.md +0 -0
  13. {pybaseutils-2.4.8 → pybaseutils-2.4.10}/pybaseutils/audio/__init__.py +0 -0
  14. {pybaseutils-2.4.8 → pybaseutils-2.4.10}/pybaseutils/audio/audio_utils.py +0 -0
  15. {pybaseutils-2.4.8 → pybaseutils-2.4.10}/pybaseutils/audio/pyaudio_utils.py +0 -0
  16. {pybaseutils-2.4.8 → pybaseutils-2.4.10}/pybaseutils/audio/vad_utils.py +0 -0
  17. {pybaseutils-2.4.8 → pybaseutils-2.4.10}/pybaseutils/base/__init__.py +0 -0
  18. {pybaseutils-2.4.8 → pybaseutils-2.4.10}/pybaseutils/base/dict_queue.py +0 -0
  19. {pybaseutils-2.4.8 → pybaseutils-2.4.10}/pybaseutils/base/list_queue.py +0 -0
  20. {pybaseutils-2.4.8 → pybaseutils-2.4.10}/pybaseutils/base/producer_consumer.py +0 -0
  21. {pybaseutils-2.4.8 → pybaseutils-2.4.10}/pybaseutils/base64_utils.py +0 -0
  22. {pybaseutils-2.4.8 → pybaseutils-2.4.10}/pybaseutils/batch_utils.py +0 -0
  23. {pybaseutils-2.4.8 → pybaseutils-2.4.10}/pybaseutils/build_utils/__init__.py +0 -0
  24. {pybaseutils-2.4.8 → pybaseutils-2.4.10}/pybaseutils/build_utils/cython_utils.py +0 -0
  25. {pybaseutils-2.4.8 → pybaseutils-2.4.10}/pybaseutils/build_utils/pyarmor_utils.py +0 -0
  26. {pybaseutils-2.4.8 → pybaseutils-2.4.10}/pybaseutils/cluster/__init__.py +0 -0
  27. {pybaseutils-2.4.8 → pybaseutils-2.4.10}/pybaseutils/cluster/kmean.py +0 -0
  28. {pybaseutils-2.4.8 → pybaseutils-2.4.10}/pybaseutils/cluster/maxmin_distance.py +0 -0
  29. {pybaseutils-2.4.8 → pybaseutils-2.4.10}/pybaseutils/cluster/similarity.py +0 -0
  30. {pybaseutils-2.4.8 → pybaseutils-2.4.10}/pybaseutils/color_utils.py +0 -0
  31. {pybaseutils-2.4.8 → pybaseutils-2.4.10}/pybaseutils/config_utils.py +0 -0
  32. {pybaseutils-2.4.8 → pybaseutils-2.4.10}/pybaseutils/converter/__init__.py +0 -0
  33. {pybaseutils-2.4.8 → pybaseutils-2.4.10}/pybaseutils/converter/build_coco.py +0 -0
  34. {pybaseutils-2.4.8 → pybaseutils-2.4.10}/pybaseutils/converter/build_cvat.py +0 -0
  35. {pybaseutils-2.4.8 → pybaseutils-2.4.10}/pybaseutils/converter/build_labelme.py +0 -0
  36. {pybaseutils-2.4.8 → pybaseutils-2.4.10}/pybaseutils/converter/build_voc.py +0 -0
  37. {pybaseutils-2.4.8 → pybaseutils-2.4.10}/pybaseutils/converter/concat_coco.py +0 -0
  38. {pybaseutils-2.4.8 → pybaseutils-2.4.10}/pybaseutils/converter/convert_coco2labelme.py +0 -0
  39. {pybaseutils-2.4.8 → pybaseutils-2.4.10}/pybaseutils/converter/convert_coco2voc.py +0 -0
  40. {pybaseutils-2.4.8 → pybaseutils-2.4.10}/pybaseutils/converter/convert_cvat2labelme.py +0 -0
  41. {pybaseutils-2.4.8 → pybaseutils-2.4.10}/pybaseutils/converter/convert_labelme2coco.py +0 -0
  42. {pybaseutils-2.4.8 → pybaseutils-2.4.10}/pybaseutils/converter/convert_labelme2cvat.py +0 -0
  43. {pybaseutils-2.4.8 → pybaseutils-2.4.10}/pybaseutils/converter/convert_labelme2labelme.py +0 -0
  44. {pybaseutils-2.4.8 → pybaseutils-2.4.10}/pybaseutils/converter/convert_labelme2voc.py +0 -0
  45. {pybaseutils-2.4.8 → pybaseutils-2.4.10}/pybaseutils/converter/convert_labelme2yolo.py +0 -0
  46. {pybaseutils-2.4.8 → pybaseutils-2.4.10}/pybaseutils/converter/convert_voc2coco.py +0 -0
  47. {pybaseutils-2.4.8 → pybaseutils-2.4.10}/pybaseutils/converter/convert_voc2labelme.py +0 -0
  48. {pybaseutils-2.4.8 → pybaseutils-2.4.10}/pybaseutils/converter/convert_voc2voc.py +0 -0
  49. {pybaseutils-2.4.8 → pybaseutils-2.4.10}/pybaseutils/converter/convert_voc2yolo.py +0 -0
  50. {pybaseutils-2.4.8 → pybaseutils-2.4.10}/pybaseutils/converter/convert_yolo2labelme.py +0 -0
  51. {pybaseutils-2.4.8 → pybaseutils-2.4.10}/pybaseutils/converter/convert_yolo2voc.py +0 -0
  52. {pybaseutils-2.4.8 → pybaseutils-2.4.10}/pybaseutils/converter/prelabelme.py +0 -0
  53. {pybaseutils-2.4.8 → pybaseutils-2.4.10}/pybaseutils/coords_utils.py +0 -0
  54. {pybaseutils-2.4.8 → pybaseutils-2.4.10}/pybaseutils/cvutils/__init__.py +0 -0
  55. {pybaseutils-2.4.8 → pybaseutils-2.4.10}/pybaseutils/cvutils/corner_utils.py +0 -0
  56. {pybaseutils-2.4.8 → pybaseutils-2.4.10}/pybaseutils/cvutils/monitor.py +0 -0
  57. {pybaseutils-2.4.8 → pybaseutils-2.4.10}/pybaseutils/cvutils/mouse_utils.py +0 -0
  58. {pybaseutils-2.4.8 → pybaseutils-2.4.10}/pybaseutils/cvutils/nms_utils.py +0 -0
  59. {pybaseutils-2.4.8 → pybaseutils-2.4.10}/pybaseutils/data_utils.py +0 -0
  60. {pybaseutils-2.4.8 → pybaseutils-2.4.10}/pybaseutils/dataloader/__init__.py +0 -0
  61. {pybaseutils-2.4.8 → pybaseutils-2.4.10}/pybaseutils/dataloader/balanced_classes.py +0 -0
  62. {pybaseutils-2.4.8 → pybaseutils-2.4.10}/pybaseutils/dataloader/base_coco.py +0 -0
  63. {pybaseutils-2.4.8 → pybaseutils-2.4.10}/pybaseutils/dataloader/base_dataset.py +0 -0
  64. {pybaseutils-2.4.8 → pybaseutils-2.4.10}/pybaseutils/dataloader/data_resample.py +0 -0
  65. {pybaseutils-2.4.8 → pybaseutils-2.4.10}/pybaseutils/dataloader/parser_coco_det.py +0 -0
  66. {pybaseutils-2.4.8 → pybaseutils-2.4.10}/pybaseutils/dataloader/parser_coco_ins.py +0 -0
  67. {pybaseutils-2.4.8 → pybaseutils-2.4.10}/pybaseutils/dataloader/parser_coco_kps.py +0 -0
  68. {pybaseutils-2.4.8 → pybaseutils-2.4.10}/pybaseutils/dataloader/parser_image_folder.py +0 -0
  69. {pybaseutils-2.4.8 → pybaseutils-2.4.10}/pybaseutils/dataloader/parser_image_text.py +0 -0
  70. {pybaseutils-2.4.8 → pybaseutils-2.4.10}/pybaseutils/dataloader/parser_labelme.py +0 -0
  71. {pybaseutils-2.4.8 → pybaseutils-2.4.10}/pybaseutils/dataloader/parser_labelme_crop.py +0 -0
  72. {pybaseutils-2.4.8 → pybaseutils-2.4.10}/pybaseutils/dataloader/parser_labelme_line.py +0 -0
  73. {pybaseutils-2.4.8 → pybaseutils-2.4.10}/pybaseutils/dataloader/parser_video_folder.py +0 -0
  74. {pybaseutils-2.4.8 → pybaseutils-2.4.10}/pybaseutils/dataloader/parser_video_text.py +0 -0
  75. {pybaseutils-2.4.8 → pybaseutils-2.4.10}/pybaseutils/dataloader/parser_voc.py +0 -0
  76. {pybaseutils-2.4.8 → pybaseutils-2.4.10}/pybaseutils/dataloader/parser_yolo.py +0 -0
  77. {pybaseutils-2.4.8 → pybaseutils-2.4.10}/pybaseutils/dataloader/voc_seg_utils.py +0 -0
  78. {pybaseutils-2.4.8 → pybaseutils-2.4.10}/pybaseutils/dict_uils.py +0 -0
  79. {pybaseutils-2.4.8 → pybaseutils-2.4.10}/pybaseutils/filter/QueueTable.py +0 -0
  80. {pybaseutils-2.4.8 → pybaseutils-2.4.10}/pybaseutils/filter/__init__.py +0 -0
  81. {pybaseutils-2.4.8 → pybaseutils-2.4.10}/pybaseutils/filter/demo.py +0 -0
  82. {pybaseutils-2.4.8 → pybaseutils-2.4.10}/pybaseutils/filter/kalman_filter.py +0 -0
  83. {pybaseutils-2.4.8 → pybaseutils-2.4.10}/pybaseutils/filter/mean_filter.py +0 -0
  84. {pybaseutils-2.4.8 → pybaseutils-2.4.10}/pybaseutils/filter/motion_filter.py +0 -0
  85. {pybaseutils-2.4.8 → pybaseutils-2.4.10}/pybaseutils/filter/pose_filter.py +0 -0
  86. {pybaseutils-2.4.8 → pybaseutils-2.4.10}/pybaseutils/font_style/__init__.py +0 -0
  87. {pybaseutils-2.4.8 → pybaseutils-2.4.10}/pybaseutils/font_utils.py +0 -0
  88. {pybaseutils-2.4.8 → pybaseutils-2.4.10}/pybaseutils/geometry_tools.py +0 -0
  89. {pybaseutils-2.4.8 → pybaseutils-2.4.10}/pybaseutils/heatmap_utils.py +0 -0
  90. {pybaseutils-2.4.8 → pybaseutils-2.4.10}/pybaseutils/http_utils.py +0 -0
  91. {pybaseutils-2.4.8 → pybaseutils-2.4.10}/pybaseutils/json_utils.py +0 -0
  92. {pybaseutils-2.4.8 → pybaseutils-2.4.10}/pybaseutils/log.py +0 -0
  93. {pybaseutils-2.4.8 → pybaseutils-2.4.10}/pybaseutils/log_utils.py +0 -0
  94. {pybaseutils-2.4.8 → pybaseutils-2.4.10}/pybaseutils/media/__init__.py +0 -0
  95. {pybaseutils-2.4.8 → pybaseutils-2.4.10}/pybaseutils/media/ffmpeg_utils.py +0 -0
  96. {pybaseutils-2.4.8 → pybaseutils-2.4.10}/pybaseutils/metrics/__init__.py +0 -0
  97. {pybaseutils-2.4.8 → pybaseutils-2.4.10}/pybaseutils/metrics/accuracy.py +0 -0
  98. {pybaseutils-2.4.8 → pybaseutils-2.4.10}/pybaseutils/metrics/average_meter.py +0 -0
  99. {pybaseutils-2.4.8 → pybaseutils-2.4.10}/pybaseutils/metrics/class_report.py +0 -0
  100. {pybaseutils-2.4.8 → pybaseutils-2.4.10}/pybaseutils/metrics/plot_pr.py +0 -0
  101. {pybaseutils-2.4.8 → pybaseutils-2.4.10}/pybaseutils/metrics/plot_roc.py +0 -0
  102. {pybaseutils-2.4.8 → pybaseutils-2.4.10}/pybaseutils/numpy_utils.py +0 -0
  103. {pybaseutils-2.4.8 → pybaseutils-2.4.10}/pybaseutils/pandas_utils.py +0 -0
  104. {pybaseutils-2.4.8 → pybaseutils-2.4.10}/pybaseutils/plot_utils.py +0 -0
  105. {pybaseutils-2.4.8 → pybaseutils-2.4.10}/pybaseutils/pose/__init__.py +0 -0
  106. {pybaseutils-2.4.8 → pybaseutils-2.4.10}/pybaseutils/pose/bones_utils.py +0 -0
  107. {pybaseutils-2.4.8 → pybaseutils-2.4.10}/pybaseutils/pose/human_pose.py +0 -0
  108. {pybaseutils-2.4.8 → pybaseutils-2.4.10}/pybaseutils/pose/pose_utils.py +0 -0
  109. {pybaseutils-2.4.8 → pybaseutils-2.4.10}/pybaseutils/pycpp/__init__.py +0 -0
  110. {pybaseutils-2.4.8 → pybaseutils-2.4.10}/pybaseutils/pycpp/demo.py +0 -0
  111. {pybaseutils-2.4.8 → pybaseutils-2.4.10}/pybaseutils/pycpp/main.py +0 -0
  112. {pybaseutils-2.4.8 → pybaseutils-2.4.10}/pybaseutils/server/__init__.py +0 -0
  113. {pybaseutils-2.4.8 → pybaseutils-2.4.10}/pybaseutils/server/apm_server.py +0 -0
  114. {pybaseutils-2.4.8 → pybaseutils-2.4.10}/pybaseutils/setup_config.py +0 -0
  115. {pybaseutils-2.4.8 → pybaseutils-2.4.10}/pybaseutils/singleton_utils.py +0 -0
  116. {pybaseutils-2.4.8 → pybaseutils-2.4.10}/pybaseutils/text_utils.py +0 -0
  117. {pybaseutils-2.4.8 → pybaseutils-2.4.10}/pybaseutils/thread_utils.py +0 -0
  118. {pybaseutils-2.4.8 → pybaseutils-2.4.10}/pybaseutils/time_utils.py +0 -0
  119. {pybaseutils-2.4.8 → pybaseutils-2.4.10}/pybaseutils/tracemalloc_utils.py +0 -0
  120. {pybaseutils-2.4.8 → pybaseutils-2.4.10}/pybaseutils/tracemalloc_utils2.py +0 -0
  121. {pybaseutils-2.4.8 → pybaseutils-2.4.10}/pybaseutils/tracking/QueueTable.py +0 -0
  122. {pybaseutils-2.4.8 → pybaseutils-2.4.10}/pybaseutils/tracking/__init__.py +0 -0
  123. {pybaseutils-2.4.8 → pybaseutils-2.4.10}/pybaseutils/tracking/demo.py +0 -0
  124. {pybaseutils-2.4.8 → pybaseutils-2.4.10}/pybaseutils/tracking/kalman_filter.py +0 -0
  125. {pybaseutils-2.4.8 → pybaseutils-2.4.10}/pybaseutils/tracking/mean_filter.py +0 -0
  126. {pybaseutils-2.4.8 → pybaseutils-2.4.10}/pybaseutils/tracking/motion_filter.py +0 -0
  127. {pybaseutils-2.4.8 → pybaseutils-2.4.10}/pybaseutils/tracking/pose_filter.py +0 -0
  128. {pybaseutils-2.4.8 → pybaseutils-2.4.10}/pybaseutils/transforms/__init__.py +0 -0
  129. {pybaseutils-2.4.8 → pybaseutils-2.4.10}/pybaseutils/transforms/affine_transform.py +0 -0
  130. {pybaseutils-2.4.8 → pybaseutils-2.4.10}/pybaseutils/transforms/build_transform.py +0 -0
  131. {pybaseutils-2.4.8 → pybaseutils-2.4.10}/pybaseutils/transforms/face_alignment.py +0 -0
  132. {pybaseutils-2.4.8 → pybaseutils-2.4.10}/pybaseutils/transforms/imgaug_utils.py +0 -0
  133. {pybaseutils-2.4.8 → pybaseutils-2.4.10}/pybaseutils/transforms/transform_utils.py +0 -0
  134. {pybaseutils-2.4.8 → pybaseutils-2.4.10}/pybaseutils/web/__init__.py +0 -0
  135. {pybaseutils-2.4.8 → pybaseutils-2.4.10}/pybaseutils/web/app_gradio_image.py +0 -0
  136. {pybaseutils-2.4.8 → pybaseutils-2.4.10}/pybaseutils/web/app_stweb_image.py +0 -0
  137. {pybaseutils-2.4.8 → pybaseutils-2.4.10}/pybaseutils/web/app_webio_image.py +0 -0
  138. {pybaseutils-2.4.8 → pybaseutils-2.4.10}/pybaseutils/web/demo.py +0 -0
  139. {pybaseutils-2.4.8 → pybaseutils-2.4.10}/pybaseutils/word_utils.py +0 -0
  140. {pybaseutils-2.4.8 → pybaseutils-2.4.10}/pybaseutils/worker.py +0 -0
  141. {pybaseutils-2.4.8 → pybaseutils-2.4.10}/pybaseutils/yaml_utils.py +0 -0
  142. {pybaseutils-2.4.8 → pybaseutils-2.4.10}/pybaseutils.egg-info/dependency_links.txt +0 -0
  143. {pybaseutils-2.4.8 → pybaseutils-2.4.10}/pybaseutils.egg-info/not-zip-safe +0 -0
  144. {pybaseutils-2.4.8 → pybaseutils-2.4.10}/pybaseutils.egg-info/top_level.txt +0 -0
  145. {pybaseutils-2.4.8 → pybaseutils-2.4.10}/setup.cfg +0 -0
  146. {pybaseutils-2.4.8 → pybaseutils-2.4.10}/setup.py +0 -0
  147. {pybaseutils-2.4.8 → pybaseutils-2.4.10}/test_py/Image_enhance/__init__.py +0 -0
  148. {pybaseutils-2.4.8 → pybaseutils-2.4.10}/test_py/Image_enhance/dmeo01.py +0 -0
  149. {pybaseutils-2.4.8 → pybaseutils-2.4.10}/test_py/WebCrawler/__init__.py +0 -0
  150. {pybaseutils-2.4.8 → pybaseutils-2.4.10}/test_py/WebCrawler/search_baidu.py +0 -0
  151. {pybaseutils-2.4.8 → pybaseutils-2.4.10}/test_py/WebCrawler/search_biying.py +0 -0
  152. {pybaseutils-2.4.8 → pybaseutils-2.4.10}/test_py/__init__.py +0 -0
  153. {pybaseutils-2.4.8 → pybaseutils-2.4.10}/test_py/aije/__init__.py +0 -0
  154. {pybaseutils-2.4.8 → pybaseutils-2.4.10}/test_py/aije/action_dataset.py +0 -0
  155. {pybaseutils-2.4.8 → pybaseutils-2.4.10}/test_py/aije/build_cython.py +0 -0
  156. {pybaseutils-2.4.8 → pybaseutils-2.4.10}/test_py/aije/build_pyarmor.py +0 -0
  157. {pybaseutils-2.4.8 → pybaseutils-2.4.10}/test_py/aije/build_service.py +0 -0
  158. {pybaseutils-2.4.8 → pybaseutils-2.4.10}/test_py/aije/convert_cvat2labelme.py +0 -0
  159. {pybaseutils-2.4.8 → pybaseutils-2.4.10}/test_py/aije/convert_labelme2coco.py +0 -0
  160. {pybaseutils-2.4.8 → pybaseutils-2.4.10}/test_py/aije/convert_labelme2voc.py +0 -0
  161. {pybaseutils-2.4.8 → pybaseutils-2.4.10}/test_py/aije/copy_move.py +0 -0
  162. {pybaseutils-2.4.8 → pybaseutils-2.4.10}/test_py/aije/demo_labelme_crop_aije.py +0 -0
  163. {pybaseutils-2.4.8 → pybaseutils-2.4.10}/test_py/aije/demo_labelme_crop_ailt.py +0 -0
  164. {pybaseutils-2.4.8 → pybaseutils-2.4.10}/test_py/aije/demo_labelme_shock.py +0 -0
  165. {pybaseutils-2.4.8 → pybaseutils-2.4.10}/test_py/aije/demo_motion_blur.py +0 -0
  166. {pybaseutils-2.4.8 → pybaseutils-2.4.10}/test_py/aije/demo_video_aije.py +0 -0
  167. {pybaseutils-2.4.8 → pybaseutils-2.4.10}/test_py/aije/demo_voc_crop.py +0 -0
  168. {pybaseutils-2.4.8 → pybaseutils-2.4.10}/test_py/aije/demo_voc_vis.py +0 -0
  169. {pybaseutils-2.4.8 → pybaseutils-2.4.10}/test_py/aije/get_pair_data.py +0 -0
  170. {pybaseutils-2.4.8 → pybaseutils-2.4.10}/test_py/aije/mask_image.py +0 -0
  171. {pybaseutils-2.4.8 → pybaseutils-2.4.10}/test_py/aije/video_convertor.py +0 -0
  172. {pybaseutils-2.4.8 → pybaseutils-2.4.10}/test_py/audio/__init__.py +0 -0
  173. {pybaseutils-2.4.8 → pybaseutils-2.4.10}/test_py/audio/demo.py +0 -0
  174. {pybaseutils-2.4.8 → pybaseutils-2.4.10}/test_py/audio/main.py +0 -0
  175. {pybaseutils-2.4.8 → pybaseutils-2.4.10}/test_py/audio/main_read.py +0 -0
  176. {pybaseutils-2.4.8 → pybaseutils-2.4.10}/test_py/audio/segment.py +0 -0
  177. {pybaseutils-2.4.8 → pybaseutils-2.4.10}/test_py/audio/speechbrain_asr_indoor_prod.py +0 -0
  178. {pybaseutils-2.4.8 → pybaseutils-2.4.10}/test_py/audio/speechbrain_demo.py +0 -0
  179. {pybaseutils-2.4.8 → pybaseutils-2.4.10}/test_py/audio_demo1.py +0 -0
  180. {pybaseutils-2.4.8 → pybaseutils-2.4.10}/test_py/camera/__init__.py +0 -0
  181. {pybaseutils-2.4.8 → pybaseutils-2.4.10}/test_py/camera/demo.py +0 -0
  182. {pybaseutils-2.4.8 → pybaseutils-2.4.10}/test_py/captcha/__init__.py +0 -0
  183. {pybaseutils-2.4.8 → pybaseutils-2.4.10}/test_py/captcha/demo.py +0 -0
  184. {pybaseutils-2.4.8 → pybaseutils-2.4.10}/test_py/class_attribute.py +0 -0
  185. {pybaseutils-2.4.8 → pybaseutils-2.4.10}/test_py/class_names.py +0 -0
  186. {pybaseutils-2.4.8 → pybaseutils-2.4.10}/test_py/converter/AffectNet.py +0 -0
  187. {pybaseutils-2.4.8 → pybaseutils-2.4.10}/test_py/converter/AsianMovie.py +0 -0
  188. {pybaseutils-2.4.8 → pybaseutils-2.4.10}/test_py/converter/BITVehicle2voc.py +0 -0
  189. {pybaseutils-2.4.8 → pybaseutils-2.4.10}/test_py/converter/BSTLD2voc.py +0 -0
  190. {pybaseutils-2.4.8 → pybaseutils-2.4.10}/test_py/converter/CCPD.py +0 -0
  191. {pybaseutils-2.4.8 → pybaseutils-2.4.10}/test_py/converter/CCPD2voc.py +0 -0
  192. {pybaseutils-2.4.8 → pybaseutils-2.4.10}/test_py/converter/FL3D_dataset.py +0 -0
  193. {pybaseutils-2.4.8 → pybaseutils-2.4.10}/test_py/converter/FreiHAND2coco.py +0 -0
  194. {pybaseutils-2.4.8 → pybaseutils-2.4.10}/test_py/converter/MTFL2voc.py +0 -0
  195. {pybaseutils-2.4.8 → pybaseutils-2.4.10}/test_py/converter/TT100K.py +0 -0
  196. {pybaseutils-2.4.8 → pybaseutils-2.4.10}/test_py/converter/WaterMeters1.py +0 -0
  197. {pybaseutils-2.4.8 → pybaseutils-2.4.10}/test_py/converter/WaterMeters2.py +0 -0
  198. {pybaseutils-2.4.8 → pybaseutils-2.4.10}/test_py/converter/__init__.py +0 -0
  199. {pybaseutils-2.4.8 → pybaseutils-2.4.10}/test_py/converter/concat_coco.py +0 -0
  200. {pybaseutils-2.4.8 → pybaseutils-2.4.10}/test_py/converter/convert_coco2voc.py +0 -0
  201. {pybaseutils-2.4.8 → pybaseutils-2.4.10}/test_py/converter/convert_cvat2labelme.py +0 -0
  202. {pybaseutils-2.4.8 → pybaseutils-2.4.10}/test_py/converter/convert_gesture2hand.py +0 -0
  203. {pybaseutils-2.4.8 → pybaseutils-2.4.10}/test_py/converter/convert_labelme2coco.py +0 -0
  204. {pybaseutils-2.4.8 → pybaseutils-2.4.10}/test_py/converter/convert_labelme2cvat.py +0 -0
  205. {pybaseutils-2.4.8 → pybaseutils-2.4.10}/test_py/converter/convert_labelme2labelme.py +0 -0
  206. {pybaseutils-2.4.8 → pybaseutils-2.4.10}/test_py/converter/convert_labelme2voc.py +0 -0
  207. {pybaseutils-2.4.8 → pybaseutils-2.4.10}/test_py/converter/convert_voc2labelme.py +0 -0
  208. {pybaseutils-2.4.8 → pybaseutils-2.4.10}/test_py/converter/convert_yolo2labelme.py +0 -0
  209. {pybaseutils-2.4.8 → pybaseutils-2.4.10}/test_py/converter/fall_dataset.py +0 -0
  210. {pybaseutils-2.4.8 → pybaseutils-2.4.10}/test_py/converter/fatigue_driving.py +0 -0
  211. {pybaseutils-2.4.8 → pybaseutils-2.4.10}/test_py/converter/fdd_dataset.py +0 -0
  212. {pybaseutils-2.4.8 → pybaseutils-2.4.10}/test_py/converter/get_pair_data.py +0 -0
  213. {pybaseutils-2.4.8 → pybaseutils-2.4.10}/test_py/converter/handpose2coco.py +0 -0
  214. {pybaseutils-2.4.8 → pybaseutils-2.4.10}/test_py/converter/insects_for_aichallenger.py +0 -0
  215. {pybaseutils-2.4.8 → pybaseutils-2.4.10}/test_py/converter/parking_rois_gopro.py +0 -0
  216. {pybaseutils-2.4.8 → pybaseutils-2.4.10}/test_py/converter/tt100k_utils.py +0 -0
  217. {pybaseutils-2.4.8 → pybaseutils-2.4.10}/test_py/converter/ua_detrac2voc.py +0 -0
  218. {pybaseutils-2.4.8 → pybaseutils-2.4.10}/test_py/converter/ucf101_dataset.py +0 -0
  219. {pybaseutils-2.4.8 → pybaseutils-2.4.10}/test_py/converter/voc_sbd2labelme.py +0 -0
  220. {pybaseutils-2.4.8 → pybaseutils-2.4.10}/test_py/cython_build/__init__.py +0 -0
  221. {pybaseutils-2.4.8 → pybaseutils-2.4.10}/test_py/cython_build/build_cython.py +0 -0
  222. {pybaseutils-2.4.8 → pybaseutils-2.4.10}/test_py/cython_build/build_pyarmor.py +0 -0
  223. {pybaseutils-2.4.8 → pybaseutils-2.4.10}/test_py/cython_build/cryptography_demo.py +0 -0
  224. {pybaseutils-2.4.8 → pybaseutils-2.4.10}/test_py/cython_build/fun_sum.py +0 -0
  225. {pybaseutils-2.4.8 → pybaseutils-2.4.10}/test_py/cython_build/main.py +0 -0
  226. {pybaseutils-2.4.8 → pybaseutils-2.4.10}/test_py/cython_build/model_des_enctypt.py +0 -0
  227. {pybaseutils-2.4.8 → pybaseutils-2.4.10}/test_py/cython_build/model_enctypt.py +0 -0
  228. {pybaseutils-2.4.8 → pybaseutils-2.4.10}/test_py/date_dataset.py +0 -0
  229. {pybaseutils-2.4.8 → pybaseutils-2.4.10}/test_py/date_demo.py +0 -0
  230. {pybaseutils-2.4.8 → pybaseutils-2.4.10}/test_py/datedataset_bk.py +0 -0
  231. {pybaseutils-2.4.8 → pybaseutils-2.4.10}/test_py/demo1.py +0 -0
  232. {pybaseutils-2.4.8 → pybaseutils-2.4.10}/test_py/demo2.py +0 -0
  233. {pybaseutils-2.4.8 → pybaseutils-2.4.10}/test_py/demo3.py +0 -0
  234. {pybaseutils-2.4.8 → pybaseutils-2.4.10}/test_py/demo4.py +0 -0
  235. {pybaseutils-2.4.8 → pybaseutils-2.4.10}/test_py/demo_async_await1.py +0 -0
  236. {pybaseutils-2.4.8 → pybaseutils-2.4.10}/test_py/demo_async_await2.py +0 -0
  237. {pybaseutils-2.4.8 → pybaseutils-2.4.10}/test_py/demo_coco_vis.py +0 -0
  238. {pybaseutils-2.4.8 → pybaseutils-2.4.10}/test_py/demo_copy_files.py +0 -0
  239. {pybaseutils-2.4.8 → pybaseutils-2.4.10}/test_py/demo_copy_files_for_voc.py +0 -0
  240. {pybaseutils-2.4.8 → pybaseutils-2.4.10}/test_py/demo_ffmpy.py +0 -0
  241. {pybaseutils-2.4.8 → pybaseutils-2.4.10}/test_py/demo_for_annular_to_rect.py +0 -0
  242. {pybaseutils-2.4.8 → pybaseutils-2.4.10}/test_py/demo_for_pair_file.py +0 -0
  243. {pybaseutils-2.4.8 → pybaseutils-2.4.10}/test_py/demo_for_polygon.py +0 -0
  244. {pybaseutils-2.4.8 → pybaseutils-2.4.10}/test_py/demo_for_trt.py +0 -0
  245. {pybaseutils-2.4.8 → pybaseutils-2.4.10}/test_py/demo_get_file_label.py +0 -0
  246. {pybaseutils-2.4.8 → pybaseutils-2.4.10}/test_py/demo_get_file_list.py +0 -0
  247. {pybaseutils-2.4.8 → pybaseutils-2.4.10}/test_py/demo_gif.py +0 -0
  248. {pybaseutils-2.4.8 → pybaseutils-2.4.10}/test_py/demo_gif_video.py +0 -0
  249. {pybaseutils-2.4.8 → pybaseutils-2.4.10}/test_py/demo_image_crop.py +0 -0
  250. {pybaseutils-2.4.8 → pybaseutils-2.4.10}/test_py/demo_kpts.py +0 -0
  251. {pybaseutils-2.4.8 → pybaseutils-2.4.10}/test_py/demo_labelme.py +0 -0
  252. {pybaseutils-2.4.8 → pybaseutils-2.4.10}/test_py/demo_labelme_crop.py +0 -0
  253. {pybaseutils-2.4.8 → pybaseutils-2.4.10}/test_py/demo_lableme_vis.py +0 -0
  254. {pybaseutils-2.4.8 → pybaseutils-2.4.10}/test_py/demo_letterbox.py +0 -0
  255. {pybaseutils-2.4.8 → pybaseutils-2.4.10}/test_py/demo_metrics.py +0 -0
  256. {pybaseutils-2.4.8 → pybaseutils-2.4.10}/test_py/demo_mosaic.py +0 -0
  257. {pybaseutils-2.4.8 → pybaseutils-2.4.10}/test_py/demo_mouse.py +0 -0
  258. {pybaseutils-2.4.8 → pybaseutils-2.4.10}/test_py/demo_nii.py +0 -0
  259. {pybaseutils-2.4.8 → pybaseutils-2.4.10}/test_py/demo_pandas.py +0 -0
  260. {pybaseutils-2.4.8 → pybaseutils-2.4.10}/test_py/demo_plot.py +0 -0
  261. {pybaseutils-2.4.8 → pybaseutils-2.4.10}/test_py/demo_prelabelme.py +0 -0
  262. {pybaseutils-2.4.8 → pybaseutils-2.4.10}/test_py/demo_rename.py +0 -0
  263. {pybaseutils-2.4.8 → pybaseutils-2.4.10}/test_py/demo_standard_image .py +0 -0
  264. {pybaseutils-2.4.8 → pybaseutils-2.4.10}/test_py/demo_standard_video .py +0 -0
  265. {pybaseutils-2.4.8 → pybaseutils-2.4.10}/test_py/demo_taichi.py +0 -0
  266. {pybaseutils-2.4.8 → pybaseutils-2.4.10}/test_py/demo_video2frame.py +0 -0
  267. {pybaseutils-2.4.8 → pybaseutils-2.4.10}/test_py/demo_video_crop.py +0 -0
  268. {pybaseutils-2.4.8 → pybaseutils-2.4.10}/test_py/demo_voc_crop.py +0 -0
  269. {pybaseutils-2.4.8 → pybaseutils-2.4.10}/test_py/demo_voc_vis.py +0 -0
  270. {pybaseutils-2.4.8 → pybaseutils-2.4.10}/test_py/demo_word_similar.py +0 -0
  271. {pybaseutils-2.4.8 → pybaseutils-2.4.10}/test_py/demo_worker1.py +0 -0
  272. {pybaseutils-2.4.8 → pybaseutils-2.4.10}/test_py/demo_worker2.py +0 -0
  273. {pybaseutils-2.4.8 → pybaseutils-2.4.10}/test_py/detector/__init__.py +0 -0
  274. {pybaseutils-2.4.8 → pybaseutils-2.4.10}/test_py/detector/demo.py +0 -0
  275. {pybaseutils-2.4.8 → pybaseutils-2.4.10}/test_py/detector/detect_face_person.py +0 -0
  276. {pybaseutils-2.4.8 → pybaseutils-2.4.10}/test_py/detector/predet_labelme.py +0 -0
  277. {pybaseutils-2.4.8 → pybaseutils-2.4.10}/test_py/edit_distance/__init__.py +0 -0
  278. {pybaseutils-2.4.8 → pybaseutils-2.4.10}/test_py/edit_distance/demo.py +0 -0
  279. {pybaseutils-2.4.8 → pybaseutils-2.4.10}/test_py/edit_distance/text_matching.py +0 -0
  280. {pybaseutils-2.4.8 → pybaseutils-2.4.10}/test_py/fast_api/__init__.py +0 -0
  281. {pybaseutils-2.4.8 → pybaseutils-2.4.10}/test_py/fast_api/create_image_url.py +0 -0
  282. {pybaseutils-2.4.8 → pybaseutils-2.4.10}/test_py/fast_api/get_image_url.py +0 -0
  283. {pybaseutils-2.4.8 → pybaseutils-2.4.10}/test_py/flask_demo/__init__.py +0 -0
  284. {pybaseutils-2.4.8 → pybaseutils-2.4.10}/test_py/flask_demo/app.py +0 -0
  285. {pybaseutils-2.4.8 → pybaseutils-2.4.10}/test_py/flask_demo/utils/__init__.py +0 -0
  286. {pybaseutils-2.4.8 → pybaseutils-2.4.10}/test_py/flask_demo/utils/utils.py +0 -0
  287. {pybaseutils-2.4.8 → pybaseutils-2.4.10}/test_py/get_file_list.py +0 -0
  288. {pybaseutils-2.4.8 → pybaseutils-2.4.10}/test_py/gradio_app.py +0 -0
  289. {pybaseutils-2.4.8 → pybaseutils-2.4.10}/test_py/gradio_app_v2.py +0 -0
  290. {pybaseutils-2.4.8 → pybaseutils-2.4.10}/test_py/image_correction/__init__.py +0 -0
  291. {pybaseutils-2.4.8 → pybaseutils-2.4.10}/test_py/image_correction/demo_correction_v1.py +0 -0
  292. {pybaseutils-2.4.8 → pybaseutils-2.4.10}/test_py/image_correction/demo_correction_v2.py +0 -0
  293. {pybaseutils-2.4.8 → pybaseutils-2.4.10}/test_py/image_correction/demo_correction_v3.py +0 -0
  294. {pybaseutils-2.4.8 → pybaseutils-2.4.10}/test_py/kafka_worker.py +0 -0
  295. {pybaseutils-2.4.8 → pybaseutils-2.4.10}/test_py/men_tracemalloc.py +0 -0
  296. {pybaseutils-2.4.8 → pybaseutils-2.4.10}/test_py/milvus_demo/__init__.py +0 -0
  297. {pybaseutils-2.4.8 → pybaseutils-2.4.10}/test_py/milvus_demo/demo01.py +0 -0
  298. {pybaseutils-2.4.8 → pybaseutils-2.4.10}/test_py/milvus_demo/demo02.py +0 -0
  299. {pybaseutils-2.4.8 → pybaseutils-2.4.10}/test_py/milvus_demo/hello_milvus.py +0 -0
  300. {pybaseutils-2.4.8 → pybaseutils-2.4.10}/test_py/milvus_demo/milvus_client.py +0 -0
  301. {pybaseutils-2.4.8 → pybaseutils-2.4.10}/test_py/model_process.py +0 -0
  302. {pybaseutils-2.4.8 → pybaseutils-2.4.10}/test_py/performance.py +0 -0
  303. {pybaseutils-2.4.8 → pybaseutils-2.4.10}/test_py/pose/__init__.py +0 -0
  304. {pybaseutils-2.4.8 → pybaseutils-2.4.10}/test_py/pose/human_pose.py +0 -0
  305. {pybaseutils-2.4.8 → pybaseutils-2.4.10}/test_py/qrcode/__init__.py +0 -0
  306. {pybaseutils-2.4.8 → pybaseutils-2.4.10}/test_py/qrcode/demo.py +0 -0
  307. {pybaseutils-2.4.8 → pybaseutils-2.4.10}/test_py/redis_py/__init__.py +0 -0
  308. {pybaseutils-2.4.8 → pybaseutils-2.4.10}/test_py/redis_py/knn_search.py +0 -0
  309. {pybaseutils-2.4.8 → pybaseutils-2.4.10}/test_py/redis_py/redis_client.py +0 -0
  310. {pybaseutils-2.4.8 → pybaseutils-2.4.10}/test_py/registry/__init__.py +0 -0
  311. {pybaseutils-2.4.8 → pybaseutils-2.4.10}/test_py/registry/base.py +0 -0
  312. {pybaseutils-2.4.8 → pybaseutils-2.4.10}/test_py/registry/component.py +0 -0
  313. {pybaseutils-2.4.8 → pybaseutils-2.4.10}/test_py/registry/main.py +0 -0
  314. {pybaseutils-2.4.8 → pybaseutils-2.4.10}/test_py/registry/register.py +0 -0
  315. {pybaseutils-2.4.8 → pybaseutils-2.4.10}/test_py/single_class/GRU.py +0 -0
  316. {pybaseutils-2.4.8 → pybaseutils-2.4.10}/test_py/single_class/TCN.py +0 -0
  317. {pybaseutils-2.4.8 → pybaseutils-2.4.10}/test_py/single_class/__init__.py +0 -0
  318. {pybaseutils-2.4.8 → pybaseutils-2.4.10}/test_py/single_class/demo.py +0 -0
  319. {pybaseutils-2.4.8 → pybaseutils-2.4.10}/test_py/slowfastnet.py +0 -0
  320. {pybaseutils-2.4.8 → pybaseutils-2.4.10}/test_py/test_fr/__init__.py +0 -0
  321. {pybaseutils-2.4.8 → pybaseutils-2.4.10}/test_py/test_fr/demo11.py +0 -0
  322. {pybaseutils-2.4.8 → pybaseutils-2.4.10}/test_py/test_fr/idcardocr.py +0 -0
  323. {pybaseutils-2.4.8 → pybaseutils-2.4.10}/test_py/web_socket/__init__.py +0 -0
  324. {pybaseutils-2.4.8 → pybaseutils-2.4.10}/test_py/web_socket/asr_clients.py +0 -0
  325. {pybaseutils-2.4.8 → pybaseutils-2.4.10}/test_py/web_socket/asr_service.py +0 -0
  326. {pybaseutils-2.4.8 → pybaseutils-2.4.10}/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.10
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.10'
@@ -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,27 @@ 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
+ ret, frame = cap.read()
40
+ if cap.isOpened() and ret:
41
+ camera = i
42
+ cap.release()
43
+ break
44
+ print("检测到USB摄像头ID={}".format(camera))
45
+ return camera
46
+
47
+
27
48
  def merge_video(video1, video2, output="./output.mp4"):
28
49
  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
50
 
@@ -304,8 +325,8 @@ def video_capture(video: int or str, save_video: str or int = None, interval=1,
304
325
  video = file_utils.str2number(video)
305
326
  if isinstance(video, str) and os.path.isfile(video):
306
327
  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)
328
+ cap = image_utils.get_video_capture(video, fps=None)
329
+ w, h, num_frames, fps = image_utils.get_video_info(cap, **kwargs)
309
330
  time = kwargs.get("time", tuple()) # TODO 开始播放时间time[0],结束播放时间time[1],单位秒S
310
331
  clip = kwargs.get("clip", tuple()) # TODO 开始播放位置clip[0],结束播放位置clip[1]
311
332
  start, end = 0, -1
@@ -321,7 +342,7 @@ def video_capture(video: int or str, save_video: str or int = None, interval=1,
321
342
  count = 0
322
343
  video_writer = None
323
344
  while True:
324
- ret, frame = video_cap.read()
345
+ ret, frame = cap.read()
325
346
  if count % interval == 0 and count >= start:
326
347
  # TODO 设置抽帧的位置,但某些格式视频容易出现问题
327
348
  # if isinstance(video, str): video_cap.set(cv2.CAP_PROP_POS_FRAMES, count)
@@ -335,7 +356,7 @@ def video_capture(video: int or str, save_video: str or int = None, interval=1,
335
356
  if not video_writer: video_writer = image_utils.get_video_writer(save_video, w, h, save_fps)
336
357
  video_writer.write(frame)
337
358
  count += 1
338
- video_cap.release()
359
+ cap.release()
339
360
  if video_writer:
340
361
  print("save video:{}".format(save_video))
341
362
  video_writer.release()
@@ -347,8 +368,8 @@ def video_iterator(video, save_video: str or int = None, interval=1, size=(), fr
347
368
  读取摄像头或者视频流迭代器
348
369
  Usage:
349
370
  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:
371
+ cap = video_utils.video_iterator(video, save_video, time=(4, 10))
372
+ for data_info in cap:
352
373
  frame = data_info["frame"]
353
374
  ...
354
375
  :param video: String 视频文件,如*.avi,*.mp4,...
@@ -372,8 +393,8 @@ def video_iterator(video, save_video: str or int = None, interval=1, size=(), fr
372
393
  video = file_utils.str2number(video)
373
394
  if isinstance(video, str) and os.path.isfile(video):
374
395
  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)
396
+ cap = image_utils.get_video_capture(video, fps=None)
397
+ w, h, num_frames, fps = image_utils.get_video_info(cap, **kwargs)
377
398
  time = kwargs.get("time", tuple()) # TODO 开始播放时间time[0],结束播放时间time[1],单位秒S
378
399
  clip = kwargs.get("clip", tuple()) # TODO 开始播放位置clip[0],结束播放位置clip[1]
379
400
  start, end = 0, -1
@@ -393,16 +414,16 @@ def video_iterator(video, save_video: str or int = None, interval=1, size=(), fr
393
414
  t0 = -1
394
415
  while True:
395
416
  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 # 获得视频偏移量毫秒为单位
417
+ ret, frame = (False, None) if use_fast else cap.read() # 读取视频很快,但读取USB摄像头比较耗时
418
+ t = cap.get(cv2.CAP_PROP_POS_MSEC) / 1000 # 获得视频偏移量毫秒为单位
398
419
  if t0 < 0 < t: t0 = t
399
420
  if t0 > 0: t = t - t0 # 获得视频偏移量毫秒为单位
400
421
  finish = 0 < end <= (count + interval)
401
422
  if count % interval == 0 and count >= start:
402
423
  # TODO 设置抽帧的位置,但某些格式视频容易出现问题
403
424
  if use_fast and isinstance(video, str):
404
- video_cap.set(cv2.CAP_PROP_POS_FRAMES, count)
405
- ret, frame = video_cap.read()
425
+ cap.set(cv2.CAP_PROP_POS_FRAMES, count)
426
+ ret, frame = cap.read()
406
427
  if not ret or 0 < end <= count or frame is None: break
407
428
  if size: frame = image_utils.resize_image(frame, size=size)
408
429
  if task: frame = task(frame, **kwargs)
@@ -421,7 +442,7 @@ def video_iterator(video, save_video: str or int = None, interval=1, size=(), fr
421
442
  video_writer.write(frame)
422
443
  if data_info['finish']: break # 控制结束
423
444
  count += 1
424
- video_cap.release()
445
+ cap.release()
425
446
  if video_writer:
426
447
  print("save video:{}".format(save_video))
427
448
  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.10
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 = 15
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