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.
- {pybaseutils-2.4.8 → pybaseutils-2.4.10}/PKG-INFO +1 -1
- {pybaseutils-2.4.8 → pybaseutils-2.4.10}/pybaseutils/__init__.py +1 -1
- pybaseutils-2.4.10/pybaseutils/cvutils/camera.py +90 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.10}/pybaseutils/cvutils/video_utils.py +34 -13
- {pybaseutils-2.4.8 → pybaseutils-2.4.10}/pybaseutils/file_utils.py +1 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.10}/pybaseutils/image_utils.py +15 -14
- pybaseutils-2.4.10/pybaseutils/nets_utils.py +24 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.10}/pybaseutils.egg-info/PKG-INFO +1 -1
- {pybaseutils-2.4.8 → pybaseutils-2.4.10}/pybaseutils.egg-info/SOURCES.txt +3 -0
- pybaseutils-2.4.10/test_py/test_camera.py +28 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.10}/LICENCE +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.10}/README.md +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.10}/pybaseutils/audio/__init__.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.10}/pybaseutils/audio/audio_utils.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.10}/pybaseutils/audio/pyaudio_utils.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.10}/pybaseutils/audio/vad_utils.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.10}/pybaseutils/base/__init__.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.10}/pybaseutils/base/dict_queue.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.10}/pybaseutils/base/list_queue.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.10}/pybaseutils/base/producer_consumer.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.10}/pybaseutils/base64_utils.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.10}/pybaseutils/batch_utils.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.10}/pybaseutils/build_utils/__init__.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.10}/pybaseutils/build_utils/cython_utils.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.10}/pybaseutils/build_utils/pyarmor_utils.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.10}/pybaseutils/cluster/__init__.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.10}/pybaseutils/cluster/kmean.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.10}/pybaseutils/cluster/maxmin_distance.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.10}/pybaseutils/cluster/similarity.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.10}/pybaseutils/color_utils.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.10}/pybaseutils/config_utils.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.10}/pybaseutils/converter/__init__.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.10}/pybaseutils/converter/build_coco.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.10}/pybaseutils/converter/build_cvat.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.10}/pybaseutils/converter/build_labelme.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.10}/pybaseutils/converter/build_voc.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.10}/pybaseutils/converter/concat_coco.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.10}/pybaseutils/converter/convert_coco2labelme.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.10}/pybaseutils/converter/convert_coco2voc.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.10}/pybaseutils/converter/convert_cvat2labelme.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.10}/pybaseutils/converter/convert_labelme2coco.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.10}/pybaseutils/converter/convert_labelme2cvat.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.10}/pybaseutils/converter/convert_labelme2labelme.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.10}/pybaseutils/converter/convert_labelme2voc.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.10}/pybaseutils/converter/convert_labelme2yolo.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.10}/pybaseutils/converter/convert_voc2coco.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.10}/pybaseutils/converter/convert_voc2labelme.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.10}/pybaseutils/converter/convert_voc2voc.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.10}/pybaseutils/converter/convert_voc2yolo.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.10}/pybaseutils/converter/convert_yolo2labelme.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.10}/pybaseutils/converter/convert_yolo2voc.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.10}/pybaseutils/converter/prelabelme.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.10}/pybaseutils/coords_utils.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.10}/pybaseutils/cvutils/__init__.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.10}/pybaseutils/cvutils/corner_utils.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.10}/pybaseutils/cvutils/monitor.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.10}/pybaseutils/cvutils/mouse_utils.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.10}/pybaseutils/cvutils/nms_utils.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.10}/pybaseutils/data_utils.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.10}/pybaseutils/dataloader/__init__.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.10}/pybaseutils/dataloader/balanced_classes.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.10}/pybaseutils/dataloader/base_coco.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.10}/pybaseutils/dataloader/base_dataset.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.10}/pybaseutils/dataloader/data_resample.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.10}/pybaseutils/dataloader/parser_coco_det.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.10}/pybaseutils/dataloader/parser_coco_ins.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.10}/pybaseutils/dataloader/parser_coco_kps.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.10}/pybaseutils/dataloader/parser_image_folder.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.10}/pybaseutils/dataloader/parser_image_text.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.10}/pybaseutils/dataloader/parser_labelme.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.10}/pybaseutils/dataloader/parser_labelme_crop.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.10}/pybaseutils/dataloader/parser_labelme_line.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.10}/pybaseutils/dataloader/parser_video_folder.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.10}/pybaseutils/dataloader/parser_video_text.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.10}/pybaseutils/dataloader/parser_voc.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.10}/pybaseutils/dataloader/parser_yolo.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.10}/pybaseutils/dataloader/voc_seg_utils.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.10}/pybaseutils/dict_uils.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.10}/pybaseutils/filter/QueueTable.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.10}/pybaseutils/filter/__init__.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.10}/pybaseutils/filter/demo.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.10}/pybaseutils/filter/kalman_filter.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.10}/pybaseutils/filter/mean_filter.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.10}/pybaseutils/filter/motion_filter.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.10}/pybaseutils/filter/pose_filter.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.10}/pybaseutils/font_style/__init__.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.10}/pybaseutils/font_utils.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.10}/pybaseutils/geometry_tools.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.10}/pybaseutils/heatmap_utils.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.10}/pybaseutils/http_utils.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.10}/pybaseutils/json_utils.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.10}/pybaseutils/log.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.10}/pybaseutils/log_utils.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.10}/pybaseutils/media/__init__.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.10}/pybaseutils/media/ffmpeg_utils.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.10}/pybaseutils/metrics/__init__.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.10}/pybaseutils/metrics/accuracy.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.10}/pybaseutils/metrics/average_meter.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.10}/pybaseutils/metrics/class_report.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.10}/pybaseutils/metrics/plot_pr.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.10}/pybaseutils/metrics/plot_roc.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.10}/pybaseutils/numpy_utils.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.10}/pybaseutils/pandas_utils.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.10}/pybaseutils/plot_utils.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.10}/pybaseutils/pose/__init__.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.10}/pybaseutils/pose/bones_utils.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.10}/pybaseutils/pose/human_pose.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.10}/pybaseutils/pose/pose_utils.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.10}/pybaseutils/pycpp/__init__.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.10}/pybaseutils/pycpp/demo.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.10}/pybaseutils/pycpp/main.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.10}/pybaseutils/server/__init__.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.10}/pybaseutils/server/apm_server.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.10}/pybaseutils/setup_config.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.10}/pybaseutils/singleton_utils.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.10}/pybaseutils/text_utils.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.10}/pybaseutils/thread_utils.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.10}/pybaseutils/time_utils.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.10}/pybaseutils/tracemalloc_utils.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.10}/pybaseutils/tracemalloc_utils2.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.10}/pybaseutils/tracking/QueueTable.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.10}/pybaseutils/tracking/__init__.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.10}/pybaseutils/tracking/demo.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.10}/pybaseutils/tracking/kalman_filter.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.10}/pybaseutils/tracking/mean_filter.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.10}/pybaseutils/tracking/motion_filter.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.10}/pybaseutils/tracking/pose_filter.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.10}/pybaseutils/transforms/__init__.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.10}/pybaseutils/transforms/affine_transform.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.10}/pybaseutils/transforms/build_transform.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.10}/pybaseutils/transforms/face_alignment.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.10}/pybaseutils/transforms/imgaug_utils.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.10}/pybaseutils/transforms/transform_utils.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.10}/pybaseutils/web/__init__.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.10}/pybaseutils/web/app_gradio_image.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.10}/pybaseutils/web/app_stweb_image.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.10}/pybaseutils/web/app_webio_image.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.10}/pybaseutils/web/demo.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.10}/pybaseutils/word_utils.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.10}/pybaseutils/worker.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.10}/pybaseutils/yaml_utils.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.10}/pybaseutils.egg-info/dependency_links.txt +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.10}/pybaseutils.egg-info/not-zip-safe +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.10}/pybaseutils.egg-info/top_level.txt +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.10}/setup.cfg +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.10}/setup.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.10}/test_py/Image_enhance/__init__.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.10}/test_py/Image_enhance/dmeo01.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.10}/test_py/WebCrawler/__init__.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.10}/test_py/WebCrawler/search_baidu.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.10}/test_py/WebCrawler/search_biying.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.10}/test_py/__init__.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.10}/test_py/aije/__init__.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.10}/test_py/aije/action_dataset.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.10}/test_py/aije/build_cython.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.10}/test_py/aije/build_pyarmor.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.10}/test_py/aije/build_service.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.10}/test_py/aije/convert_cvat2labelme.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.10}/test_py/aije/convert_labelme2coco.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.10}/test_py/aije/convert_labelme2voc.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.10}/test_py/aije/copy_move.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.10}/test_py/aije/demo_labelme_crop_aije.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.10}/test_py/aije/demo_labelme_crop_ailt.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.10}/test_py/aije/demo_labelme_shock.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.10}/test_py/aije/demo_motion_blur.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.10}/test_py/aije/demo_video_aije.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.10}/test_py/aije/demo_voc_crop.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.10}/test_py/aije/demo_voc_vis.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.10}/test_py/aije/get_pair_data.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.10}/test_py/aije/mask_image.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.10}/test_py/aije/video_convertor.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.10}/test_py/audio/__init__.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.10}/test_py/audio/demo.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.10}/test_py/audio/main.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.10}/test_py/audio/main_read.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.10}/test_py/audio/segment.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.10}/test_py/audio/speechbrain_asr_indoor_prod.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.10}/test_py/audio/speechbrain_demo.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.10}/test_py/audio_demo1.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.10}/test_py/camera/__init__.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.10}/test_py/camera/demo.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.10}/test_py/captcha/__init__.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.10}/test_py/captcha/demo.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.10}/test_py/class_attribute.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.10}/test_py/class_names.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.10}/test_py/converter/AffectNet.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.10}/test_py/converter/AsianMovie.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.10}/test_py/converter/BITVehicle2voc.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.10}/test_py/converter/BSTLD2voc.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.10}/test_py/converter/CCPD.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.10}/test_py/converter/CCPD2voc.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.10}/test_py/converter/FL3D_dataset.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.10}/test_py/converter/FreiHAND2coco.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.10}/test_py/converter/MTFL2voc.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.10}/test_py/converter/TT100K.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.10}/test_py/converter/WaterMeters1.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.10}/test_py/converter/WaterMeters2.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.10}/test_py/converter/__init__.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.10}/test_py/converter/concat_coco.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.10}/test_py/converter/convert_coco2voc.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.10}/test_py/converter/convert_cvat2labelme.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.10}/test_py/converter/convert_gesture2hand.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.10}/test_py/converter/convert_labelme2coco.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.10}/test_py/converter/convert_labelme2cvat.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.10}/test_py/converter/convert_labelme2labelme.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.10}/test_py/converter/convert_labelme2voc.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.10}/test_py/converter/convert_voc2labelme.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.10}/test_py/converter/convert_yolo2labelme.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.10}/test_py/converter/fall_dataset.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.10}/test_py/converter/fatigue_driving.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.10}/test_py/converter/fdd_dataset.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.10}/test_py/converter/get_pair_data.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.10}/test_py/converter/handpose2coco.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.10}/test_py/converter/insects_for_aichallenger.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.10}/test_py/converter/parking_rois_gopro.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.10}/test_py/converter/tt100k_utils.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.10}/test_py/converter/ua_detrac2voc.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.10}/test_py/converter/ucf101_dataset.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.10}/test_py/converter/voc_sbd2labelme.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.10}/test_py/cython_build/__init__.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.10}/test_py/cython_build/build_cython.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.10}/test_py/cython_build/build_pyarmor.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.10}/test_py/cython_build/cryptography_demo.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.10}/test_py/cython_build/fun_sum.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.10}/test_py/cython_build/main.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.10}/test_py/cython_build/model_des_enctypt.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.10}/test_py/cython_build/model_enctypt.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.10}/test_py/date_dataset.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.10}/test_py/date_demo.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.10}/test_py/datedataset_bk.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.10}/test_py/demo1.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.10}/test_py/demo2.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.10}/test_py/demo3.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.10}/test_py/demo4.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.10}/test_py/demo_async_await1.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.10}/test_py/demo_async_await2.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.10}/test_py/demo_coco_vis.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.10}/test_py/demo_copy_files.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.10}/test_py/demo_copy_files_for_voc.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.10}/test_py/demo_ffmpy.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.10}/test_py/demo_for_annular_to_rect.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.10}/test_py/demo_for_pair_file.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.10}/test_py/demo_for_polygon.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.10}/test_py/demo_for_trt.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.10}/test_py/demo_get_file_label.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.10}/test_py/demo_get_file_list.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.10}/test_py/demo_gif.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.10}/test_py/demo_gif_video.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.10}/test_py/demo_image_crop.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.10}/test_py/demo_kpts.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.10}/test_py/demo_labelme.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.10}/test_py/demo_labelme_crop.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.10}/test_py/demo_lableme_vis.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.10}/test_py/demo_letterbox.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.10}/test_py/demo_metrics.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.10}/test_py/demo_mosaic.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.10}/test_py/demo_mouse.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.10}/test_py/demo_nii.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.10}/test_py/demo_pandas.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.10}/test_py/demo_plot.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.10}/test_py/demo_prelabelme.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.10}/test_py/demo_rename.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.10}/test_py/demo_standard_image .py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.10}/test_py/demo_standard_video .py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.10}/test_py/demo_taichi.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.10}/test_py/demo_video2frame.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.10}/test_py/demo_video_crop.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.10}/test_py/demo_voc_crop.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.10}/test_py/demo_voc_vis.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.10}/test_py/demo_word_similar.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.10}/test_py/demo_worker1.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.10}/test_py/demo_worker2.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.10}/test_py/detector/__init__.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.10}/test_py/detector/demo.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.10}/test_py/detector/detect_face_person.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.10}/test_py/detector/predet_labelme.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.10}/test_py/edit_distance/__init__.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.10}/test_py/edit_distance/demo.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.10}/test_py/edit_distance/text_matching.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.10}/test_py/fast_api/__init__.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.10}/test_py/fast_api/create_image_url.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.10}/test_py/fast_api/get_image_url.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.10}/test_py/flask_demo/__init__.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.10}/test_py/flask_demo/app.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.10}/test_py/flask_demo/utils/__init__.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.10}/test_py/flask_demo/utils/utils.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.10}/test_py/get_file_list.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.10}/test_py/gradio_app.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.10}/test_py/gradio_app_v2.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.10}/test_py/image_correction/__init__.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.10}/test_py/image_correction/demo_correction_v1.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.10}/test_py/image_correction/demo_correction_v2.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.10}/test_py/image_correction/demo_correction_v3.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.10}/test_py/kafka_worker.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.10}/test_py/men_tracemalloc.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.10}/test_py/milvus_demo/__init__.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.10}/test_py/milvus_demo/demo01.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.10}/test_py/milvus_demo/demo02.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.10}/test_py/milvus_demo/hello_milvus.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.10}/test_py/milvus_demo/milvus_client.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.10}/test_py/model_process.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.10}/test_py/performance.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.10}/test_py/pose/__init__.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.10}/test_py/pose/human_pose.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.10}/test_py/qrcode/__init__.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.10}/test_py/qrcode/demo.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.10}/test_py/redis_py/__init__.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.10}/test_py/redis_py/knn_search.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.10}/test_py/redis_py/redis_client.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.10}/test_py/registry/__init__.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.10}/test_py/registry/base.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.10}/test_py/registry/component.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.10}/test_py/registry/main.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.10}/test_py/registry/register.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.10}/test_py/single_class/GRU.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.10}/test_py/single_class/TCN.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.10}/test_py/single_class/__init__.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.10}/test_py/single_class/demo.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.10}/test_py/slowfastnet.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.10}/test_py/test_fr/__init__.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.10}/test_py/test_fr/demo11.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.10}/test_py/test_fr/idcardocr.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.10}/test_py/web_socket/__init__.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.10}/test_py/web_socket/asr_clients.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.10}/test_py/web_socket/asr_service.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.10}/test_py/web_socket/chat_service.py +0 -0
|
@@ -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
|
-
|
|
308
|
-
w, h, num_frames, fps = image_utils.get_video_info(
|
|
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 =
|
|
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
|
-
|
|
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
|
-
|
|
351
|
-
for data_info in
|
|
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
|
-
|
|
376
|
-
w, h, num_frames, fps = image_utils.get_video_info(
|
|
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
|
|
397
|
-
t =
|
|
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
|
-
|
|
405
|
-
ret, frame =
|
|
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
|
-
|
|
445
|
+
cap.release()
|
|
425
446
|
if video_writer:
|
|
426
447
|
print("save video:{}".format(save_video))
|
|
427
448
|
video_writer.release()
|
|
@@ -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
|
-
|
|
3296
|
+
cap = cv2.VideoCapture(video)
|
|
3297
3297
|
# 设置分辨率
|
|
3298
3298
|
if width:
|
|
3299
|
-
|
|
3299
|
+
cap.set(cv2.CAP_PROP_FRAME_WIDTH, width)
|
|
3300
3300
|
if height:
|
|
3301
|
-
|
|
3301
|
+
cap.set(cv2.CAP_PROP_FRAME_HEIGHT, height)
|
|
3302
3302
|
if fps:
|
|
3303
|
-
|
|
3304
|
-
|
|
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(
|
|
3308
|
+
def get_video_info(cap, disp=True, **kwargs):
|
|
3308
3309
|
"""
|
|
3309
3310
|
获得视频的基础信息
|
|
3310
|
-
:param
|
|
3311
|
+
:param cap:视频对象 或者视频文件路径 int | str | cv2.VideoCapture
|
|
3311
3312
|
:param disp: 是否显示视频信息
|
|
3312
3313
|
:return:
|
|
3313
3314
|
"""
|
|
3314
|
-
isfile = isinstance(
|
|
3315
|
-
if isfile:
|
|
3316
|
-
width = int(
|
|
3317
|
-
height = int(
|
|
3318
|
-
num_frames = int(
|
|
3319
|
-
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:
|
|
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
|
+
|
|
@@ -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
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|