pybaseutils 2.4.15__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 (327) hide show
  1. {pybaseutils-2.4.15 → pybaseutils-2.4.16}/PKG-INFO +1 -1
  2. {pybaseutils-2.4.15 → pybaseutils-2.4.16}/pybaseutils/__init__.py +1 -1
  3. pybaseutils-2.4.16/pybaseutils/cvutils/camera.py +182 -0
  4. {pybaseutils-2.4.15 → pybaseutils-2.4.16}/pybaseutils/cvutils/video_utils.py +4 -1
  5. {pybaseutils-2.4.15 → pybaseutils-2.4.16}/pybaseutils.egg-info/PKG-INFO +1 -1
  6. {pybaseutils-2.4.15 → pybaseutils-2.4.16}/pybaseutils.egg-info/SOURCES.txt +1 -0
  7. {pybaseutils-2.4.15/pybaseutils/cvutils → pybaseutils-2.4.16/test_py}/camera.py +69 -21
  8. {pybaseutils-2.4.15 → pybaseutils-2.4.16}/LICENCE +0 -0
  9. {pybaseutils-2.4.15 → pybaseutils-2.4.16}/README.md +0 -0
  10. {pybaseutils-2.4.15 → pybaseutils-2.4.16}/pybaseutils/audio/__init__.py +0 -0
  11. {pybaseutils-2.4.15 → pybaseutils-2.4.16}/pybaseutils/audio/audio_utils.py +0 -0
  12. {pybaseutils-2.4.15 → pybaseutils-2.4.16}/pybaseutils/audio/pyaudio_utils.py +0 -0
  13. {pybaseutils-2.4.15 → pybaseutils-2.4.16}/pybaseutils/audio/vad_utils.py +0 -0
  14. {pybaseutils-2.4.15 → pybaseutils-2.4.16}/pybaseutils/base/__init__.py +0 -0
  15. {pybaseutils-2.4.15 → pybaseutils-2.4.16}/pybaseutils/base/dict_queue.py +0 -0
  16. {pybaseutils-2.4.15 → pybaseutils-2.4.16}/pybaseutils/base/list_queue.py +0 -0
  17. {pybaseutils-2.4.15 → pybaseutils-2.4.16}/pybaseutils/base/producer_consumer.py +0 -0
  18. {pybaseutils-2.4.15 → pybaseutils-2.4.16}/pybaseutils/base64_utils.py +0 -0
  19. {pybaseutils-2.4.15 → pybaseutils-2.4.16}/pybaseutils/batch_utils.py +0 -0
  20. {pybaseutils-2.4.15 → pybaseutils-2.4.16}/pybaseutils/build_utils/__init__.py +0 -0
  21. {pybaseutils-2.4.15 → pybaseutils-2.4.16}/pybaseutils/build_utils/cython_utils.py +0 -0
  22. {pybaseutils-2.4.15 → pybaseutils-2.4.16}/pybaseutils/build_utils/pyarmor_utils.py +0 -0
  23. {pybaseutils-2.4.15 → pybaseutils-2.4.16}/pybaseutils/cluster/__init__.py +0 -0
  24. {pybaseutils-2.4.15 → pybaseutils-2.4.16}/pybaseutils/cluster/kmean.py +0 -0
  25. {pybaseutils-2.4.15 → pybaseutils-2.4.16}/pybaseutils/cluster/maxmin_distance.py +0 -0
  26. {pybaseutils-2.4.15 → pybaseutils-2.4.16}/pybaseutils/cluster/similarity.py +0 -0
  27. {pybaseutils-2.4.15 → pybaseutils-2.4.16}/pybaseutils/color_utils.py +0 -0
  28. {pybaseutils-2.4.15 → pybaseutils-2.4.16}/pybaseutils/config_utils.py +0 -0
  29. {pybaseutils-2.4.15 → pybaseutils-2.4.16}/pybaseutils/converter/__init__.py +0 -0
  30. {pybaseutils-2.4.15 → pybaseutils-2.4.16}/pybaseutils/converter/build_coco.py +0 -0
  31. {pybaseutils-2.4.15 → pybaseutils-2.4.16}/pybaseutils/converter/build_cvat.py +0 -0
  32. {pybaseutils-2.4.15 → pybaseutils-2.4.16}/pybaseutils/converter/build_labelme.py +0 -0
  33. {pybaseutils-2.4.15 → pybaseutils-2.4.16}/pybaseutils/converter/build_voc.py +0 -0
  34. {pybaseutils-2.4.15 → pybaseutils-2.4.16}/pybaseutils/converter/concat_coco.py +0 -0
  35. {pybaseutils-2.4.15 → pybaseutils-2.4.16}/pybaseutils/converter/convert_coco2labelme.py +0 -0
  36. {pybaseutils-2.4.15 → pybaseutils-2.4.16}/pybaseutils/converter/convert_coco2voc.py +0 -0
  37. {pybaseutils-2.4.15 → pybaseutils-2.4.16}/pybaseutils/converter/convert_cvat2labelme.py +0 -0
  38. {pybaseutils-2.4.15 → pybaseutils-2.4.16}/pybaseutils/converter/convert_labelme2coco.py +0 -0
  39. {pybaseutils-2.4.15 → pybaseutils-2.4.16}/pybaseutils/converter/convert_labelme2cvat.py +0 -0
  40. {pybaseutils-2.4.15 → pybaseutils-2.4.16}/pybaseutils/converter/convert_labelme2labelme.py +0 -0
  41. {pybaseutils-2.4.15 → pybaseutils-2.4.16}/pybaseutils/converter/convert_labelme2voc.py +0 -0
  42. {pybaseutils-2.4.15 → pybaseutils-2.4.16}/pybaseutils/converter/convert_labelme2yolo.py +0 -0
  43. {pybaseutils-2.4.15 → pybaseutils-2.4.16}/pybaseutils/converter/convert_voc2coco.py +0 -0
  44. {pybaseutils-2.4.15 → pybaseutils-2.4.16}/pybaseutils/converter/convert_voc2labelme.py +0 -0
  45. {pybaseutils-2.4.15 → pybaseutils-2.4.16}/pybaseutils/converter/convert_voc2voc.py +0 -0
  46. {pybaseutils-2.4.15 → pybaseutils-2.4.16}/pybaseutils/converter/convert_voc2yolo.py +0 -0
  47. {pybaseutils-2.4.15 → pybaseutils-2.4.16}/pybaseutils/converter/convert_yolo2labelme.py +0 -0
  48. {pybaseutils-2.4.15 → pybaseutils-2.4.16}/pybaseutils/converter/convert_yolo2voc.py +0 -0
  49. {pybaseutils-2.4.15 → pybaseutils-2.4.16}/pybaseutils/converter/prelabelme.py +0 -0
  50. {pybaseutils-2.4.15 → pybaseutils-2.4.16}/pybaseutils/coords_utils.py +0 -0
  51. {pybaseutils-2.4.15 → pybaseutils-2.4.16}/pybaseutils/cvutils/__init__.py +0 -0
  52. {pybaseutils-2.4.15 → pybaseutils-2.4.16}/pybaseutils/cvutils/corner_utils.py +0 -0
  53. {pybaseutils-2.4.15 → pybaseutils-2.4.16}/pybaseutils/cvutils/monitor.py +0 -0
  54. {pybaseutils-2.4.15 → pybaseutils-2.4.16}/pybaseutils/cvutils/mouse_utils.py +0 -0
  55. {pybaseutils-2.4.15 → pybaseutils-2.4.16}/pybaseutils/cvutils/nms_utils.py +0 -0
  56. {pybaseutils-2.4.15 → pybaseutils-2.4.16}/pybaseutils/data_utils.py +0 -0
  57. {pybaseutils-2.4.15 → pybaseutils-2.4.16}/pybaseutils/dataloader/__init__.py +0 -0
  58. {pybaseutils-2.4.15 → pybaseutils-2.4.16}/pybaseutils/dataloader/balanced_classes.py +0 -0
  59. {pybaseutils-2.4.15 → pybaseutils-2.4.16}/pybaseutils/dataloader/base_coco.py +0 -0
  60. {pybaseutils-2.4.15 → pybaseutils-2.4.16}/pybaseutils/dataloader/base_dataset.py +0 -0
  61. {pybaseutils-2.4.15 → pybaseutils-2.4.16}/pybaseutils/dataloader/data_resample.py +0 -0
  62. {pybaseutils-2.4.15 → pybaseutils-2.4.16}/pybaseutils/dataloader/parser_coco_det.py +0 -0
  63. {pybaseutils-2.4.15 → pybaseutils-2.4.16}/pybaseutils/dataloader/parser_coco_ins.py +0 -0
  64. {pybaseutils-2.4.15 → pybaseutils-2.4.16}/pybaseutils/dataloader/parser_coco_kps.py +0 -0
  65. {pybaseutils-2.4.15 → pybaseutils-2.4.16}/pybaseutils/dataloader/parser_image_folder.py +0 -0
  66. {pybaseutils-2.4.15 → pybaseutils-2.4.16}/pybaseutils/dataloader/parser_image_text.py +0 -0
  67. {pybaseutils-2.4.15 → pybaseutils-2.4.16}/pybaseutils/dataloader/parser_labelme.py +0 -0
  68. {pybaseutils-2.4.15 → pybaseutils-2.4.16}/pybaseutils/dataloader/parser_labelme_crop.py +0 -0
  69. {pybaseutils-2.4.15 → pybaseutils-2.4.16}/pybaseutils/dataloader/parser_labelme_line.py +0 -0
  70. {pybaseutils-2.4.15 → pybaseutils-2.4.16}/pybaseutils/dataloader/parser_video_folder.py +0 -0
  71. {pybaseutils-2.4.15 → pybaseutils-2.4.16}/pybaseutils/dataloader/parser_video_text.py +0 -0
  72. {pybaseutils-2.4.15 → pybaseutils-2.4.16}/pybaseutils/dataloader/parser_voc.py +0 -0
  73. {pybaseutils-2.4.15 → pybaseutils-2.4.16}/pybaseutils/dataloader/parser_yolo.py +0 -0
  74. {pybaseutils-2.4.15 → pybaseutils-2.4.16}/pybaseutils/dataloader/voc_seg_utils.py +0 -0
  75. {pybaseutils-2.4.15 → pybaseutils-2.4.16}/pybaseutils/dict_uils.py +0 -0
  76. {pybaseutils-2.4.15 → pybaseutils-2.4.16}/pybaseutils/file_utils.py +0 -0
  77. {pybaseutils-2.4.15 → pybaseutils-2.4.16}/pybaseutils/filter/QueueTable.py +0 -0
  78. {pybaseutils-2.4.15 → pybaseutils-2.4.16}/pybaseutils/filter/__init__.py +0 -0
  79. {pybaseutils-2.4.15 → pybaseutils-2.4.16}/pybaseutils/filter/demo.py +0 -0
  80. {pybaseutils-2.4.15 → pybaseutils-2.4.16}/pybaseutils/filter/kalman_filter.py +0 -0
  81. {pybaseutils-2.4.15 → pybaseutils-2.4.16}/pybaseutils/filter/mean_filter.py +0 -0
  82. {pybaseutils-2.4.15 → pybaseutils-2.4.16}/pybaseutils/filter/motion_filter.py +0 -0
  83. {pybaseutils-2.4.15 → pybaseutils-2.4.16}/pybaseutils/filter/pose_filter.py +0 -0
  84. {pybaseutils-2.4.15 → pybaseutils-2.4.16}/pybaseutils/font_style/__init__.py +0 -0
  85. {pybaseutils-2.4.15 → pybaseutils-2.4.16}/pybaseutils/font_utils.py +0 -0
  86. {pybaseutils-2.4.15 → pybaseutils-2.4.16}/pybaseutils/geometry_tools.py +0 -0
  87. {pybaseutils-2.4.15 → pybaseutils-2.4.16}/pybaseutils/heatmap_utils.py +0 -0
  88. {pybaseutils-2.4.15 → pybaseutils-2.4.16}/pybaseutils/http_utils.py +0 -0
  89. {pybaseutils-2.4.15 → pybaseutils-2.4.16}/pybaseutils/image_utils.py +0 -0
  90. {pybaseutils-2.4.15 → pybaseutils-2.4.16}/pybaseutils/json_utils.py +0 -0
  91. {pybaseutils-2.4.15 → pybaseutils-2.4.16}/pybaseutils/log.py +0 -0
  92. {pybaseutils-2.4.15 → pybaseutils-2.4.16}/pybaseutils/log_utils.py +0 -0
  93. {pybaseutils-2.4.15 → pybaseutils-2.4.16}/pybaseutils/media/__init__.py +0 -0
  94. {pybaseutils-2.4.15 → pybaseutils-2.4.16}/pybaseutils/media/ffmpeg_utils.py +0 -0
  95. {pybaseutils-2.4.15 → pybaseutils-2.4.16}/pybaseutils/metrics/__init__.py +0 -0
  96. {pybaseutils-2.4.15 → pybaseutils-2.4.16}/pybaseutils/metrics/accuracy.py +0 -0
  97. {pybaseutils-2.4.15 → pybaseutils-2.4.16}/pybaseutils/metrics/average_meter.py +0 -0
  98. {pybaseutils-2.4.15 → pybaseutils-2.4.16}/pybaseutils/metrics/class_report.py +0 -0
  99. {pybaseutils-2.4.15 → pybaseutils-2.4.16}/pybaseutils/metrics/plot_pr.py +0 -0
  100. {pybaseutils-2.4.15 → pybaseutils-2.4.16}/pybaseutils/metrics/plot_roc.py +0 -0
  101. {pybaseutils-2.4.15 → pybaseutils-2.4.16}/pybaseutils/nets_utils.py +0 -0
  102. {pybaseutils-2.4.15 → pybaseutils-2.4.16}/pybaseutils/numpy_utils.py +0 -0
  103. {pybaseutils-2.4.15 → pybaseutils-2.4.16}/pybaseutils/pandas_utils.py +0 -0
  104. {pybaseutils-2.4.15 → pybaseutils-2.4.16}/pybaseutils/plot_utils.py +0 -0
  105. {pybaseutils-2.4.15 → pybaseutils-2.4.16}/pybaseutils/pose/__init__.py +0 -0
  106. {pybaseutils-2.4.15 → pybaseutils-2.4.16}/pybaseutils/pose/bones_utils.py +0 -0
  107. {pybaseutils-2.4.15 → pybaseutils-2.4.16}/pybaseutils/pose/human_pose.py +0 -0
  108. {pybaseutils-2.4.15 → pybaseutils-2.4.16}/pybaseutils/pose/pose_utils.py +0 -0
  109. {pybaseutils-2.4.15 → pybaseutils-2.4.16}/pybaseutils/pycpp/__init__.py +0 -0
  110. {pybaseutils-2.4.15 → pybaseutils-2.4.16}/pybaseutils/pycpp/demo.py +0 -0
  111. {pybaseutils-2.4.15 → pybaseutils-2.4.16}/pybaseutils/pycpp/main.py +0 -0
  112. {pybaseutils-2.4.15 → pybaseutils-2.4.16}/pybaseutils/server/__init__.py +0 -0
  113. {pybaseutils-2.4.15 → pybaseutils-2.4.16}/pybaseutils/server/apm_server.py +0 -0
  114. {pybaseutils-2.4.15 → pybaseutils-2.4.16}/pybaseutils/setup_config.py +0 -0
  115. {pybaseutils-2.4.15 → pybaseutils-2.4.16}/pybaseutils/singleton_utils.py +0 -0
  116. {pybaseutils-2.4.15 → pybaseutils-2.4.16}/pybaseutils/text_utils.py +0 -0
  117. {pybaseutils-2.4.15 → pybaseutils-2.4.16}/pybaseutils/thread_utils.py +0 -0
  118. {pybaseutils-2.4.15 → pybaseutils-2.4.16}/pybaseutils/time_utils.py +0 -0
  119. {pybaseutils-2.4.15 → pybaseutils-2.4.16}/pybaseutils/tracemalloc_utils.py +0 -0
  120. {pybaseutils-2.4.15 → pybaseutils-2.4.16}/pybaseutils/tracemalloc_utils2.py +0 -0
  121. {pybaseutils-2.4.15 → pybaseutils-2.4.16}/pybaseutils/tracking/QueueTable.py +0 -0
  122. {pybaseutils-2.4.15 → pybaseutils-2.4.16}/pybaseutils/tracking/__init__.py +0 -0
  123. {pybaseutils-2.4.15 → pybaseutils-2.4.16}/pybaseutils/tracking/demo.py +0 -0
  124. {pybaseutils-2.4.15 → pybaseutils-2.4.16}/pybaseutils/tracking/kalman_filter.py +0 -0
  125. {pybaseutils-2.4.15 → pybaseutils-2.4.16}/pybaseutils/tracking/mean_filter.py +0 -0
  126. {pybaseutils-2.4.15 → pybaseutils-2.4.16}/pybaseutils/tracking/motion_filter.py +0 -0
  127. {pybaseutils-2.4.15 → pybaseutils-2.4.16}/pybaseutils/tracking/pose_filter.py +0 -0
  128. {pybaseutils-2.4.15 → pybaseutils-2.4.16}/pybaseutils/transforms/__init__.py +0 -0
  129. {pybaseutils-2.4.15 → pybaseutils-2.4.16}/pybaseutils/transforms/affine_transform.py +0 -0
  130. {pybaseutils-2.4.15 → pybaseutils-2.4.16}/pybaseutils/transforms/build_transform.py +0 -0
  131. {pybaseutils-2.4.15 → pybaseutils-2.4.16}/pybaseutils/transforms/face_alignment.py +0 -0
  132. {pybaseutils-2.4.15 → pybaseutils-2.4.16}/pybaseutils/transforms/imgaug_utils.py +0 -0
  133. {pybaseutils-2.4.15 → pybaseutils-2.4.16}/pybaseutils/transforms/transform_utils.py +0 -0
  134. {pybaseutils-2.4.15 → pybaseutils-2.4.16}/pybaseutils/web/__init__.py +0 -0
  135. {pybaseutils-2.4.15 → pybaseutils-2.4.16}/pybaseutils/web/app_gradio_image.py +0 -0
  136. {pybaseutils-2.4.15 → pybaseutils-2.4.16}/pybaseutils/web/app_stweb_image.py +0 -0
  137. {pybaseutils-2.4.15 → pybaseutils-2.4.16}/pybaseutils/web/app_webio_image.py +0 -0
  138. {pybaseutils-2.4.15 → pybaseutils-2.4.16}/pybaseutils/web/demo.py +0 -0
  139. {pybaseutils-2.4.15 → pybaseutils-2.4.16}/pybaseutils/word_utils.py +0 -0
  140. {pybaseutils-2.4.15 → pybaseutils-2.4.16}/pybaseutils/worker.py +0 -0
  141. {pybaseutils-2.4.15 → pybaseutils-2.4.16}/pybaseutils/yaml_utils.py +0 -0
  142. {pybaseutils-2.4.15 → pybaseutils-2.4.16}/pybaseutils.egg-info/dependency_links.txt +0 -0
  143. {pybaseutils-2.4.15 → pybaseutils-2.4.16}/pybaseutils.egg-info/not-zip-safe +0 -0
  144. {pybaseutils-2.4.15 → pybaseutils-2.4.16}/pybaseutils.egg-info/top_level.txt +0 -0
  145. {pybaseutils-2.4.15 → pybaseutils-2.4.16}/setup.cfg +0 -0
  146. {pybaseutils-2.4.15 → pybaseutils-2.4.16}/setup.py +0 -0
  147. {pybaseutils-2.4.15 → pybaseutils-2.4.16}/test_py/Image_enhance/__init__.py +0 -0
  148. {pybaseutils-2.4.15 → pybaseutils-2.4.16}/test_py/Image_enhance/dmeo01.py +0 -0
  149. {pybaseutils-2.4.15 → pybaseutils-2.4.16}/test_py/WebCrawler/__init__.py +0 -0
  150. {pybaseutils-2.4.15 → pybaseutils-2.4.16}/test_py/WebCrawler/search_baidu.py +0 -0
  151. {pybaseutils-2.4.15 → pybaseutils-2.4.16}/test_py/WebCrawler/search_biying.py +0 -0
  152. {pybaseutils-2.4.15 → pybaseutils-2.4.16}/test_py/__init__.py +0 -0
  153. {pybaseutils-2.4.15 → pybaseutils-2.4.16}/test_py/aije/__init__.py +0 -0
  154. {pybaseutils-2.4.15 → pybaseutils-2.4.16}/test_py/aije/action_dataset.py +0 -0
  155. {pybaseutils-2.4.15 → pybaseutils-2.4.16}/test_py/aije/build_cython.py +0 -0
  156. {pybaseutils-2.4.15 → pybaseutils-2.4.16}/test_py/aije/build_pyarmor.py +0 -0
  157. {pybaseutils-2.4.15 → pybaseutils-2.4.16}/test_py/aije/build_service.py +0 -0
  158. {pybaseutils-2.4.15 → pybaseutils-2.4.16}/test_py/aije/convert_cvat2labelme.py +0 -0
  159. {pybaseutils-2.4.15 → pybaseutils-2.4.16}/test_py/aije/convert_labelme2coco.py +0 -0
  160. {pybaseutils-2.4.15 → pybaseutils-2.4.16}/test_py/aije/convert_labelme2voc.py +0 -0
  161. {pybaseutils-2.4.15 → pybaseutils-2.4.16}/test_py/aije/copy_move.py +0 -0
  162. {pybaseutils-2.4.15 → pybaseutils-2.4.16}/test_py/aije/demo_labelme_crop_aije.py +0 -0
  163. {pybaseutils-2.4.15 → pybaseutils-2.4.16}/test_py/aije/demo_labelme_crop_ailt.py +0 -0
  164. {pybaseutils-2.4.15 → pybaseutils-2.4.16}/test_py/aije/demo_labelme_shock.py +0 -0
  165. {pybaseutils-2.4.15 → pybaseutils-2.4.16}/test_py/aije/demo_motion_blur.py +0 -0
  166. {pybaseutils-2.4.15 → pybaseutils-2.4.16}/test_py/aije/demo_video_aije.py +0 -0
  167. {pybaseutils-2.4.15 → pybaseutils-2.4.16}/test_py/aije/demo_voc_crop.py +0 -0
  168. {pybaseutils-2.4.15 → pybaseutils-2.4.16}/test_py/aije/demo_voc_vis.py +0 -0
  169. {pybaseutils-2.4.15 → pybaseutils-2.4.16}/test_py/aije/get_pair_data.py +0 -0
  170. {pybaseutils-2.4.15 → pybaseutils-2.4.16}/test_py/aije/mask_image.py +0 -0
  171. {pybaseutils-2.4.15 → pybaseutils-2.4.16}/test_py/aije/video_convertor.py +0 -0
  172. {pybaseutils-2.4.15 → pybaseutils-2.4.16}/test_py/audio/__init__.py +0 -0
  173. {pybaseutils-2.4.15 → pybaseutils-2.4.16}/test_py/audio/demo.py +0 -0
  174. {pybaseutils-2.4.15 → pybaseutils-2.4.16}/test_py/audio/main.py +0 -0
  175. {pybaseutils-2.4.15 → pybaseutils-2.4.16}/test_py/audio/main_read.py +0 -0
  176. {pybaseutils-2.4.15 → pybaseutils-2.4.16}/test_py/audio/segment.py +0 -0
  177. {pybaseutils-2.4.15 → pybaseutils-2.4.16}/test_py/audio/speechbrain_asr_indoor_prod.py +0 -0
  178. {pybaseutils-2.4.15 → pybaseutils-2.4.16}/test_py/audio/speechbrain_demo.py +0 -0
  179. {pybaseutils-2.4.15 → pybaseutils-2.4.16}/test_py/audio_demo1.py +0 -0
  180. {pybaseutils-2.4.15 → pybaseutils-2.4.16}/test_py/camera/__init__.py +0 -0
  181. {pybaseutils-2.4.15 → pybaseutils-2.4.16}/test_py/camera/demo.py +0 -0
  182. {pybaseutils-2.4.15 → pybaseutils-2.4.16}/test_py/captcha/__init__.py +0 -0
  183. {pybaseutils-2.4.15 → pybaseutils-2.4.16}/test_py/captcha/demo.py +0 -0
  184. {pybaseutils-2.4.15 → pybaseutils-2.4.16}/test_py/class_attribute.py +0 -0
  185. {pybaseutils-2.4.15 → pybaseutils-2.4.16}/test_py/class_names.py +0 -0
  186. {pybaseutils-2.4.15 → pybaseutils-2.4.16}/test_py/converter/AffectNet.py +0 -0
  187. {pybaseutils-2.4.15 → pybaseutils-2.4.16}/test_py/converter/AsianMovie.py +0 -0
  188. {pybaseutils-2.4.15 → pybaseutils-2.4.16}/test_py/converter/BITVehicle2voc.py +0 -0
  189. {pybaseutils-2.4.15 → pybaseutils-2.4.16}/test_py/converter/BSTLD2voc.py +0 -0
  190. {pybaseutils-2.4.15 → pybaseutils-2.4.16}/test_py/converter/CCPD.py +0 -0
  191. {pybaseutils-2.4.15 → pybaseutils-2.4.16}/test_py/converter/CCPD2voc.py +0 -0
  192. {pybaseutils-2.4.15 → pybaseutils-2.4.16}/test_py/converter/FL3D_dataset.py +0 -0
  193. {pybaseutils-2.4.15 → pybaseutils-2.4.16}/test_py/converter/FreiHAND2coco.py +0 -0
  194. {pybaseutils-2.4.15 → pybaseutils-2.4.16}/test_py/converter/MTFL2voc.py +0 -0
  195. {pybaseutils-2.4.15 → pybaseutils-2.4.16}/test_py/converter/TT100K.py +0 -0
  196. {pybaseutils-2.4.15 → pybaseutils-2.4.16}/test_py/converter/WaterMeters1.py +0 -0
  197. {pybaseutils-2.4.15 → pybaseutils-2.4.16}/test_py/converter/WaterMeters2.py +0 -0
  198. {pybaseutils-2.4.15 → pybaseutils-2.4.16}/test_py/converter/__init__.py +0 -0
  199. {pybaseutils-2.4.15 → pybaseutils-2.4.16}/test_py/converter/concat_coco.py +0 -0
  200. {pybaseutils-2.4.15 → pybaseutils-2.4.16}/test_py/converter/convert_coco2voc.py +0 -0
  201. {pybaseutils-2.4.15 → pybaseutils-2.4.16}/test_py/converter/convert_cvat2labelme.py +0 -0
  202. {pybaseutils-2.4.15 → pybaseutils-2.4.16}/test_py/converter/convert_gesture2hand.py +0 -0
  203. {pybaseutils-2.4.15 → pybaseutils-2.4.16}/test_py/converter/convert_labelme2coco.py +0 -0
  204. {pybaseutils-2.4.15 → pybaseutils-2.4.16}/test_py/converter/convert_labelme2cvat.py +0 -0
  205. {pybaseutils-2.4.15 → pybaseutils-2.4.16}/test_py/converter/convert_labelme2labelme.py +0 -0
  206. {pybaseutils-2.4.15 → pybaseutils-2.4.16}/test_py/converter/convert_labelme2voc.py +0 -0
  207. {pybaseutils-2.4.15 → pybaseutils-2.4.16}/test_py/converter/convert_voc2labelme.py +0 -0
  208. {pybaseutils-2.4.15 → pybaseutils-2.4.16}/test_py/converter/convert_yolo2labelme.py +0 -0
  209. {pybaseutils-2.4.15 → pybaseutils-2.4.16}/test_py/converter/fall_dataset.py +0 -0
  210. {pybaseutils-2.4.15 → pybaseutils-2.4.16}/test_py/converter/fatigue_driving.py +0 -0
  211. {pybaseutils-2.4.15 → pybaseutils-2.4.16}/test_py/converter/fdd_dataset.py +0 -0
  212. {pybaseutils-2.4.15 → pybaseutils-2.4.16}/test_py/converter/get_pair_data.py +0 -0
  213. {pybaseutils-2.4.15 → pybaseutils-2.4.16}/test_py/converter/handpose2coco.py +0 -0
  214. {pybaseutils-2.4.15 → pybaseutils-2.4.16}/test_py/converter/insects_for_aichallenger.py +0 -0
  215. {pybaseutils-2.4.15 → pybaseutils-2.4.16}/test_py/converter/parking_rois_gopro.py +0 -0
  216. {pybaseutils-2.4.15 → pybaseutils-2.4.16}/test_py/converter/tt100k_utils.py +0 -0
  217. {pybaseutils-2.4.15 → pybaseutils-2.4.16}/test_py/converter/ua_detrac2voc.py +0 -0
  218. {pybaseutils-2.4.15 → pybaseutils-2.4.16}/test_py/converter/ucf101_dataset.py +0 -0
  219. {pybaseutils-2.4.15 → pybaseutils-2.4.16}/test_py/converter/voc_sbd2labelme.py +0 -0
  220. {pybaseutils-2.4.15 → pybaseutils-2.4.16}/test_py/cython_build/__init__.py +0 -0
  221. {pybaseutils-2.4.15 → pybaseutils-2.4.16}/test_py/cython_build/build_cython.py +0 -0
  222. {pybaseutils-2.4.15 → pybaseutils-2.4.16}/test_py/cython_build/build_pyarmor.py +0 -0
  223. {pybaseutils-2.4.15 → pybaseutils-2.4.16}/test_py/cython_build/cryptography_demo.py +0 -0
  224. {pybaseutils-2.4.15 → pybaseutils-2.4.16}/test_py/cython_build/fun_sum.py +0 -0
  225. {pybaseutils-2.4.15 → pybaseutils-2.4.16}/test_py/cython_build/main.py +0 -0
  226. {pybaseutils-2.4.15 → pybaseutils-2.4.16}/test_py/cython_build/model_des_enctypt.py +0 -0
  227. {pybaseutils-2.4.15 → pybaseutils-2.4.16}/test_py/cython_build/model_enctypt.py +0 -0
  228. {pybaseutils-2.4.15 → pybaseutils-2.4.16}/test_py/date_dataset.py +0 -0
  229. {pybaseutils-2.4.15 → pybaseutils-2.4.16}/test_py/date_demo.py +0 -0
  230. {pybaseutils-2.4.15 → pybaseutils-2.4.16}/test_py/datedataset_bk.py +0 -0
  231. {pybaseutils-2.4.15 → pybaseutils-2.4.16}/test_py/demo1.py +0 -0
  232. {pybaseutils-2.4.15 → pybaseutils-2.4.16}/test_py/demo2.py +0 -0
  233. {pybaseutils-2.4.15 → pybaseutils-2.4.16}/test_py/demo3.py +0 -0
  234. {pybaseutils-2.4.15 → pybaseutils-2.4.16}/test_py/demo4.py +0 -0
  235. {pybaseutils-2.4.15 → pybaseutils-2.4.16}/test_py/demo_async_await1.py +0 -0
  236. {pybaseutils-2.4.15 → pybaseutils-2.4.16}/test_py/demo_async_await2.py +0 -0
  237. {pybaseutils-2.4.15 → pybaseutils-2.4.16}/test_py/demo_coco_vis.py +0 -0
  238. {pybaseutils-2.4.15 → pybaseutils-2.4.16}/test_py/demo_copy_files.py +0 -0
  239. {pybaseutils-2.4.15 → pybaseutils-2.4.16}/test_py/demo_copy_files_for_voc.py +0 -0
  240. {pybaseutils-2.4.15 → pybaseutils-2.4.16}/test_py/demo_ffmpy.py +0 -0
  241. {pybaseutils-2.4.15 → pybaseutils-2.4.16}/test_py/demo_for_annular_to_rect.py +0 -0
  242. {pybaseutils-2.4.15 → pybaseutils-2.4.16}/test_py/demo_for_pair_file.py +0 -0
  243. {pybaseutils-2.4.15 → pybaseutils-2.4.16}/test_py/demo_for_polygon.py +0 -0
  244. {pybaseutils-2.4.15 → pybaseutils-2.4.16}/test_py/demo_for_trt.py +0 -0
  245. {pybaseutils-2.4.15 → pybaseutils-2.4.16}/test_py/demo_get_file_label.py +0 -0
  246. {pybaseutils-2.4.15 → pybaseutils-2.4.16}/test_py/demo_get_file_list.py +0 -0
  247. {pybaseutils-2.4.15 → pybaseutils-2.4.16}/test_py/demo_gif.py +0 -0
  248. {pybaseutils-2.4.15 → pybaseutils-2.4.16}/test_py/demo_gif_video.py +0 -0
  249. {pybaseutils-2.4.15 → pybaseutils-2.4.16}/test_py/demo_image_crop.py +0 -0
  250. {pybaseutils-2.4.15 → pybaseutils-2.4.16}/test_py/demo_kpts.py +0 -0
  251. {pybaseutils-2.4.15 → pybaseutils-2.4.16}/test_py/demo_labelme.py +0 -0
  252. {pybaseutils-2.4.15 → pybaseutils-2.4.16}/test_py/demo_labelme_crop.py +0 -0
  253. {pybaseutils-2.4.15 → pybaseutils-2.4.16}/test_py/demo_lableme_vis.py +0 -0
  254. {pybaseutils-2.4.15 → pybaseutils-2.4.16}/test_py/demo_letterbox.py +0 -0
  255. {pybaseutils-2.4.15 → pybaseutils-2.4.16}/test_py/demo_metrics.py +0 -0
  256. {pybaseutils-2.4.15 → pybaseutils-2.4.16}/test_py/demo_mosaic.py +0 -0
  257. {pybaseutils-2.4.15 → pybaseutils-2.4.16}/test_py/demo_mouse.py +0 -0
  258. {pybaseutils-2.4.15 → pybaseutils-2.4.16}/test_py/demo_nii.py +0 -0
  259. {pybaseutils-2.4.15 → pybaseutils-2.4.16}/test_py/demo_pandas.py +0 -0
  260. {pybaseutils-2.4.15 → pybaseutils-2.4.16}/test_py/demo_plot.py +0 -0
  261. {pybaseutils-2.4.15 → pybaseutils-2.4.16}/test_py/demo_prelabelme.py +0 -0
  262. {pybaseutils-2.4.15 → pybaseutils-2.4.16}/test_py/demo_rename.py +0 -0
  263. {pybaseutils-2.4.15 → pybaseutils-2.4.16}/test_py/demo_standard_image .py +0 -0
  264. {pybaseutils-2.4.15 → pybaseutils-2.4.16}/test_py/demo_standard_video .py +0 -0
  265. {pybaseutils-2.4.15 → pybaseutils-2.4.16}/test_py/demo_taichi.py +0 -0
  266. {pybaseutils-2.4.15 → pybaseutils-2.4.16}/test_py/demo_video2frame.py +0 -0
  267. {pybaseutils-2.4.15 → pybaseutils-2.4.16}/test_py/demo_video_crop.py +0 -0
  268. {pybaseutils-2.4.15 → pybaseutils-2.4.16}/test_py/demo_voc_crop.py +0 -0
  269. {pybaseutils-2.4.15 → pybaseutils-2.4.16}/test_py/demo_voc_vis.py +0 -0
  270. {pybaseutils-2.4.15 → pybaseutils-2.4.16}/test_py/demo_word_similar.py +0 -0
  271. {pybaseutils-2.4.15 → pybaseutils-2.4.16}/test_py/demo_worker1.py +0 -0
  272. {pybaseutils-2.4.15 → pybaseutils-2.4.16}/test_py/demo_worker2.py +0 -0
  273. {pybaseutils-2.4.15 → pybaseutils-2.4.16}/test_py/detector/__init__.py +0 -0
  274. {pybaseutils-2.4.15 → pybaseutils-2.4.16}/test_py/detector/demo.py +0 -0
  275. {pybaseutils-2.4.15 → pybaseutils-2.4.16}/test_py/detector/detect_face_person.py +0 -0
  276. {pybaseutils-2.4.15 → pybaseutils-2.4.16}/test_py/detector/predet_labelme.py +0 -0
  277. {pybaseutils-2.4.15 → pybaseutils-2.4.16}/test_py/edit_distance/__init__.py +0 -0
  278. {pybaseutils-2.4.15 → pybaseutils-2.4.16}/test_py/edit_distance/demo.py +0 -0
  279. {pybaseutils-2.4.15 → pybaseutils-2.4.16}/test_py/edit_distance/text_matching.py +0 -0
  280. {pybaseutils-2.4.15 → pybaseutils-2.4.16}/test_py/fast_api/__init__.py +0 -0
  281. {pybaseutils-2.4.15 → pybaseutils-2.4.16}/test_py/fast_api/create_image_url.py +0 -0
  282. {pybaseutils-2.4.15 → pybaseutils-2.4.16}/test_py/fast_api/get_image_url.py +0 -0
  283. {pybaseutils-2.4.15 → pybaseutils-2.4.16}/test_py/flask_demo/__init__.py +0 -0
  284. {pybaseutils-2.4.15 → pybaseutils-2.4.16}/test_py/flask_demo/app.py +0 -0
  285. {pybaseutils-2.4.15 → pybaseutils-2.4.16}/test_py/flask_demo/utils/__init__.py +0 -0
  286. {pybaseutils-2.4.15 → pybaseutils-2.4.16}/test_py/flask_demo/utils/utils.py +0 -0
  287. {pybaseutils-2.4.15 → pybaseutils-2.4.16}/test_py/get_file_list.py +0 -0
  288. {pybaseutils-2.4.15 → pybaseutils-2.4.16}/test_py/gradio_app.py +0 -0
  289. {pybaseutils-2.4.15 → pybaseutils-2.4.16}/test_py/gradio_app_v2.py +0 -0
  290. {pybaseutils-2.4.15 → pybaseutils-2.4.16}/test_py/image_correction/__init__.py +0 -0
  291. {pybaseutils-2.4.15 → pybaseutils-2.4.16}/test_py/image_correction/demo_correction_v1.py +0 -0
  292. {pybaseutils-2.4.15 → pybaseutils-2.4.16}/test_py/image_correction/demo_correction_v2.py +0 -0
  293. {pybaseutils-2.4.15 → pybaseutils-2.4.16}/test_py/image_correction/demo_correction_v3.py +0 -0
  294. {pybaseutils-2.4.15 → pybaseutils-2.4.16}/test_py/kafka_worker.py +0 -0
  295. {pybaseutils-2.4.15 → pybaseutils-2.4.16}/test_py/men_tracemalloc.py +0 -0
  296. {pybaseutils-2.4.15 → pybaseutils-2.4.16}/test_py/milvus_demo/__init__.py +0 -0
  297. {pybaseutils-2.4.15 → pybaseutils-2.4.16}/test_py/milvus_demo/demo01.py +0 -0
  298. {pybaseutils-2.4.15 → pybaseutils-2.4.16}/test_py/milvus_demo/demo02.py +0 -0
  299. {pybaseutils-2.4.15 → pybaseutils-2.4.16}/test_py/milvus_demo/hello_milvus.py +0 -0
  300. {pybaseutils-2.4.15 → pybaseutils-2.4.16}/test_py/milvus_demo/milvus_client.py +0 -0
  301. {pybaseutils-2.4.15 → pybaseutils-2.4.16}/test_py/model_process.py +0 -0
  302. {pybaseutils-2.4.15 → pybaseutils-2.4.16}/test_py/performance.py +0 -0
  303. {pybaseutils-2.4.15 → pybaseutils-2.4.16}/test_py/pose/__init__.py +0 -0
  304. {pybaseutils-2.4.15 → pybaseutils-2.4.16}/test_py/pose/human_pose.py +0 -0
  305. {pybaseutils-2.4.15 → pybaseutils-2.4.16}/test_py/qrcode/__init__.py +0 -0
  306. {pybaseutils-2.4.15 → pybaseutils-2.4.16}/test_py/qrcode/demo.py +0 -0
  307. {pybaseutils-2.4.15 → pybaseutils-2.4.16}/test_py/redis_py/__init__.py +0 -0
  308. {pybaseutils-2.4.15 → pybaseutils-2.4.16}/test_py/redis_py/knn_search.py +0 -0
  309. {pybaseutils-2.4.15 → pybaseutils-2.4.16}/test_py/redis_py/redis_client.py +0 -0
  310. {pybaseutils-2.4.15 → pybaseutils-2.4.16}/test_py/registry/__init__.py +0 -0
  311. {pybaseutils-2.4.15 → pybaseutils-2.4.16}/test_py/registry/base.py +0 -0
  312. {pybaseutils-2.4.15 → pybaseutils-2.4.16}/test_py/registry/component.py +0 -0
  313. {pybaseutils-2.4.15 → pybaseutils-2.4.16}/test_py/registry/main.py +0 -0
  314. {pybaseutils-2.4.15 → pybaseutils-2.4.16}/test_py/registry/register.py +0 -0
  315. {pybaseutils-2.4.15 → pybaseutils-2.4.16}/test_py/single_class/GRU.py +0 -0
  316. {pybaseutils-2.4.15 → pybaseutils-2.4.16}/test_py/single_class/TCN.py +0 -0
  317. {pybaseutils-2.4.15 → pybaseutils-2.4.16}/test_py/single_class/__init__.py +0 -0
  318. {pybaseutils-2.4.15 → pybaseutils-2.4.16}/test_py/single_class/demo.py +0 -0
  319. {pybaseutils-2.4.15 → pybaseutils-2.4.16}/test_py/slowfastnet.py +0 -0
  320. {pybaseutils-2.4.15 → pybaseutils-2.4.16}/test_py/test_camera.py +0 -0
  321. {pybaseutils-2.4.15 → pybaseutils-2.4.16}/test_py/test_fr/__init__.py +0 -0
  322. {pybaseutils-2.4.15 → pybaseutils-2.4.16}/test_py/test_fr/demo11.py +0 -0
  323. {pybaseutils-2.4.15 → pybaseutils-2.4.16}/test_py/test_fr/idcardocr.py +0 -0
  324. {pybaseutils-2.4.15 → pybaseutils-2.4.16}/test_py/web_socket/__init__.py +0 -0
  325. {pybaseutils-2.4.15 → pybaseutils-2.4.16}/test_py/web_socket/asr_clients.py +0 -0
  326. {pybaseutils-2.4.15 → pybaseutils-2.4.16}/test_py/web_socket/asr_service.py +0 -0
  327. {pybaseutils-2.4.15 → 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.15
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.15'
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.15
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
@@ -5,29 +5,75 @@ import subprocess
5
5
  import json
6
6
  import numbers
7
7
 
8
+ import cv2
9
+ import subprocess
10
+ import json
11
+
12
+ import cv2
13
+ import subprocess
14
+ import json
15
+
8
16
 
9
17
  def get_video_size(video, size=()):
10
- """获取视频原始分辨率"""
11
- if isinstance(video, int): # TODO 摄像头
18
+ """
19
+ 获取视频设备或文件的分辨率
20
+ Args:
21
+ video: 视频设备路径/索引 或 视频文件路径
22
+ size: 要设置的摄像头分辨率 (宽, 高),仅对摄像头设备有效
23
+
24
+ Returns:
25
+ tuple: (width, height) 或 (None, None)
26
+ """
27
+ if isinstance(video, int):
12
28
  video = f"/dev/video{video}"
13
- if size:
14
- cmd = ['ffprobe', '-v', 'quiet',
15
- '-video_size', f"{size[0]}x{size[1]}", # 视频分辨率
16
- '-print_format', 'json',
17
- '-show_streams', video]
18
- else:
19
- cmd = ['ffprobe', '-v', 'quiet',
20
- '-print_format', 'json',
21
- '-show_streams', video]
22
- result = subprocess.check_output(cmd).decode()
23
- info = json.loads(result)
24
- width = None
25
- height = None
26
- for stream in info['streams']:
27
- if stream['codec_type'] == 'video':
28
- width, height = stream['width'], stream['height']
29
- print("video={},width:{}, height:{}".format(video, width, height))
30
- return width, height
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
31
77
 
32
78
 
33
79
  class CameraCapture(object):
@@ -136,8 +182,10 @@ class CameraCapture(object):
136
182
 
137
183
 
138
184
  if __name__ == '__main__':
185
+ from pybaseutils.cvutils import video_utils
186
+
139
187
  fps = 10
140
- video = 0 # Windows 下可能是 0 或 "video=Integrated Webcam"
188
+ video = video_utils.get_usb_camera()
141
189
  # video = "/home/PKing/Videos/video1.mp4" # Windows 下可能是 0 或 "video=Integrated Webcam"
142
190
  # video = "../../data/video/kunkun_cut.mp4" # Windows 下可能是 0 或 "video=Integrated Webcam"
143
191
  # cap = CameraCapture(video=video, size=(), scale=1.0, fps=fps)
File without changes
File without changes