pybaseutils 2.4.8__tar.gz → 2.4.9__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {pybaseutils-2.4.8 → pybaseutils-2.4.9}/PKG-INFO +1 -1
- {pybaseutils-2.4.8 → pybaseutils-2.4.9}/pybaseutils/__init__.py +1 -1
- pybaseutils-2.4.9/pybaseutils/cvutils/camera.py +90 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.9}/pybaseutils/cvutils/video_utils.py +33 -13
- {pybaseutils-2.4.8 → pybaseutils-2.4.9}/pybaseutils/file_utils.py +1 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.9}/pybaseutils/image_utils.py +15 -14
- pybaseutils-2.4.9/pybaseutils/nets_utils.py +24 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.9}/pybaseutils.egg-info/PKG-INFO +1 -1
- {pybaseutils-2.4.8 → pybaseutils-2.4.9}/pybaseutils.egg-info/SOURCES.txt +3 -0
- pybaseutils-2.4.9/test_py/test_camera.py +28 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.9}/LICENCE +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.9}/README.md +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.9}/pybaseutils/audio/__init__.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.9}/pybaseutils/audio/audio_utils.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.9}/pybaseutils/audio/pyaudio_utils.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.9}/pybaseutils/audio/vad_utils.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.9}/pybaseutils/base/__init__.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.9}/pybaseutils/base/dict_queue.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.9}/pybaseutils/base/list_queue.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.9}/pybaseutils/base/producer_consumer.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.9}/pybaseutils/base64_utils.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.9}/pybaseutils/batch_utils.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.9}/pybaseutils/build_utils/__init__.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.9}/pybaseutils/build_utils/cython_utils.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.9}/pybaseutils/build_utils/pyarmor_utils.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.9}/pybaseutils/cluster/__init__.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.9}/pybaseutils/cluster/kmean.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.9}/pybaseutils/cluster/maxmin_distance.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.9}/pybaseutils/cluster/similarity.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.9}/pybaseutils/color_utils.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.9}/pybaseutils/config_utils.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.9}/pybaseutils/converter/__init__.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.9}/pybaseutils/converter/build_coco.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.9}/pybaseutils/converter/build_cvat.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.9}/pybaseutils/converter/build_labelme.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.9}/pybaseutils/converter/build_voc.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.9}/pybaseutils/converter/concat_coco.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.9}/pybaseutils/converter/convert_coco2labelme.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.9}/pybaseutils/converter/convert_coco2voc.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.9}/pybaseutils/converter/convert_cvat2labelme.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.9}/pybaseutils/converter/convert_labelme2coco.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.9}/pybaseutils/converter/convert_labelme2cvat.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.9}/pybaseutils/converter/convert_labelme2labelme.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.9}/pybaseutils/converter/convert_labelme2voc.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.9}/pybaseutils/converter/convert_labelme2yolo.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.9}/pybaseutils/converter/convert_voc2coco.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.9}/pybaseutils/converter/convert_voc2labelme.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.9}/pybaseutils/converter/convert_voc2voc.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.9}/pybaseutils/converter/convert_voc2yolo.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.9}/pybaseutils/converter/convert_yolo2labelme.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.9}/pybaseutils/converter/convert_yolo2voc.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.9}/pybaseutils/converter/prelabelme.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.9}/pybaseutils/coords_utils.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.9}/pybaseutils/cvutils/__init__.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.9}/pybaseutils/cvutils/corner_utils.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.9}/pybaseutils/cvutils/monitor.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.9}/pybaseutils/cvutils/mouse_utils.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.9}/pybaseutils/cvutils/nms_utils.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.9}/pybaseutils/data_utils.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.9}/pybaseutils/dataloader/__init__.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.9}/pybaseutils/dataloader/balanced_classes.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.9}/pybaseutils/dataloader/base_coco.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.9}/pybaseutils/dataloader/base_dataset.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.9}/pybaseutils/dataloader/data_resample.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.9}/pybaseutils/dataloader/parser_coco_det.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.9}/pybaseutils/dataloader/parser_coco_ins.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.9}/pybaseutils/dataloader/parser_coco_kps.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.9}/pybaseutils/dataloader/parser_image_folder.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.9}/pybaseutils/dataloader/parser_image_text.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.9}/pybaseutils/dataloader/parser_labelme.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.9}/pybaseutils/dataloader/parser_labelme_crop.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.9}/pybaseutils/dataloader/parser_labelme_line.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.9}/pybaseutils/dataloader/parser_video_folder.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.9}/pybaseutils/dataloader/parser_video_text.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.9}/pybaseutils/dataloader/parser_voc.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.9}/pybaseutils/dataloader/parser_yolo.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.9}/pybaseutils/dataloader/voc_seg_utils.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.9}/pybaseutils/dict_uils.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.9}/pybaseutils/filter/QueueTable.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.9}/pybaseutils/filter/__init__.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.9}/pybaseutils/filter/demo.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.9}/pybaseutils/filter/kalman_filter.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.9}/pybaseutils/filter/mean_filter.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.9}/pybaseutils/filter/motion_filter.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.9}/pybaseutils/filter/pose_filter.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.9}/pybaseutils/font_style/__init__.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.9}/pybaseutils/font_utils.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.9}/pybaseutils/geometry_tools.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.9}/pybaseutils/heatmap_utils.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.9}/pybaseutils/http_utils.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.9}/pybaseutils/json_utils.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.9}/pybaseutils/log.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.9}/pybaseutils/log_utils.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.9}/pybaseutils/media/__init__.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.9}/pybaseutils/media/ffmpeg_utils.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.9}/pybaseutils/metrics/__init__.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.9}/pybaseutils/metrics/accuracy.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.9}/pybaseutils/metrics/average_meter.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.9}/pybaseutils/metrics/class_report.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.9}/pybaseutils/metrics/plot_pr.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.9}/pybaseutils/metrics/plot_roc.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.9}/pybaseutils/numpy_utils.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.9}/pybaseutils/pandas_utils.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.9}/pybaseutils/plot_utils.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.9}/pybaseutils/pose/__init__.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.9}/pybaseutils/pose/bones_utils.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.9}/pybaseutils/pose/human_pose.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.9}/pybaseutils/pose/pose_utils.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.9}/pybaseutils/pycpp/__init__.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.9}/pybaseutils/pycpp/demo.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.9}/pybaseutils/pycpp/main.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.9}/pybaseutils/server/__init__.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.9}/pybaseutils/server/apm_server.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.9}/pybaseutils/setup_config.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.9}/pybaseutils/singleton_utils.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.9}/pybaseutils/text_utils.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.9}/pybaseutils/thread_utils.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.9}/pybaseutils/time_utils.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.9}/pybaseutils/tracemalloc_utils.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.9}/pybaseutils/tracemalloc_utils2.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.9}/pybaseutils/tracking/QueueTable.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.9}/pybaseutils/tracking/__init__.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.9}/pybaseutils/tracking/demo.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.9}/pybaseutils/tracking/kalman_filter.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.9}/pybaseutils/tracking/mean_filter.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.9}/pybaseutils/tracking/motion_filter.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.9}/pybaseutils/tracking/pose_filter.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.9}/pybaseutils/transforms/__init__.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.9}/pybaseutils/transforms/affine_transform.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.9}/pybaseutils/transforms/build_transform.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.9}/pybaseutils/transforms/face_alignment.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.9}/pybaseutils/transforms/imgaug_utils.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.9}/pybaseutils/transforms/transform_utils.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.9}/pybaseutils/web/__init__.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.9}/pybaseutils/web/app_gradio_image.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.9}/pybaseutils/web/app_stweb_image.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.9}/pybaseutils/web/app_webio_image.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.9}/pybaseutils/web/demo.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.9}/pybaseutils/word_utils.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.9}/pybaseutils/worker.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.9}/pybaseutils/yaml_utils.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.9}/pybaseutils.egg-info/dependency_links.txt +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.9}/pybaseutils.egg-info/not-zip-safe +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.9}/pybaseutils.egg-info/top_level.txt +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.9}/setup.cfg +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.9}/setup.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.9}/test_py/Image_enhance/__init__.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.9}/test_py/Image_enhance/dmeo01.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.9}/test_py/WebCrawler/__init__.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.9}/test_py/WebCrawler/search_baidu.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.9}/test_py/WebCrawler/search_biying.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.9}/test_py/__init__.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.9}/test_py/aije/__init__.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.9}/test_py/aije/action_dataset.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.9}/test_py/aije/build_cython.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.9}/test_py/aije/build_pyarmor.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.9}/test_py/aije/build_service.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.9}/test_py/aije/convert_cvat2labelme.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.9}/test_py/aije/convert_labelme2coco.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.9}/test_py/aije/convert_labelme2voc.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.9}/test_py/aije/copy_move.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.9}/test_py/aije/demo_labelme_crop_aije.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.9}/test_py/aije/demo_labelme_crop_ailt.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.9}/test_py/aije/demo_labelme_shock.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.9}/test_py/aije/demo_motion_blur.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.9}/test_py/aije/demo_video_aije.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.9}/test_py/aije/demo_voc_crop.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.9}/test_py/aije/demo_voc_vis.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.9}/test_py/aije/get_pair_data.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.9}/test_py/aije/mask_image.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.9}/test_py/aije/video_convertor.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.9}/test_py/audio/__init__.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.9}/test_py/audio/demo.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.9}/test_py/audio/main.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.9}/test_py/audio/main_read.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.9}/test_py/audio/segment.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.9}/test_py/audio/speechbrain_asr_indoor_prod.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.9}/test_py/audio/speechbrain_demo.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.9}/test_py/audio_demo1.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.9}/test_py/camera/__init__.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.9}/test_py/camera/demo.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.9}/test_py/captcha/__init__.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.9}/test_py/captcha/demo.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.9}/test_py/class_attribute.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.9}/test_py/class_names.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.9}/test_py/converter/AffectNet.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.9}/test_py/converter/AsianMovie.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.9}/test_py/converter/BITVehicle2voc.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.9}/test_py/converter/BSTLD2voc.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.9}/test_py/converter/CCPD.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.9}/test_py/converter/CCPD2voc.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.9}/test_py/converter/FL3D_dataset.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.9}/test_py/converter/FreiHAND2coco.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.9}/test_py/converter/MTFL2voc.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.9}/test_py/converter/TT100K.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.9}/test_py/converter/WaterMeters1.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.9}/test_py/converter/WaterMeters2.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.9}/test_py/converter/__init__.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.9}/test_py/converter/concat_coco.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.9}/test_py/converter/convert_coco2voc.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.9}/test_py/converter/convert_cvat2labelme.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.9}/test_py/converter/convert_gesture2hand.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.9}/test_py/converter/convert_labelme2coco.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.9}/test_py/converter/convert_labelme2cvat.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.9}/test_py/converter/convert_labelme2labelme.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.9}/test_py/converter/convert_labelme2voc.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.9}/test_py/converter/convert_voc2labelme.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.9}/test_py/converter/convert_yolo2labelme.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.9}/test_py/converter/fall_dataset.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.9}/test_py/converter/fatigue_driving.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.9}/test_py/converter/fdd_dataset.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.9}/test_py/converter/get_pair_data.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.9}/test_py/converter/handpose2coco.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.9}/test_py/converter/insects_for_aichallenger.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.9}/test_py/converter/parking_rois_gopro.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.9}/test_py/converter/tt100k_utils.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.9}/test_py/converter/ua_detrac2voc.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.9}/test_py/converter/ucf101_dataset.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.9}/test_py/converter/voc_sbd2labelme.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.9}/test_py/cython_build/__init__.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.9}/test_py/cython_build/build_cython.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.9}/test_py/cython_build/build_pyarmor.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.9}/test_py/cython_build/cryptography_demo.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.9}/test_py/cython_build/fun_sum.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.9}/test_py/cython_build/main.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.9}/test_py/cython_build/model_des_enctypt.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.9}/test_py/cython_build/model_enctypt.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.9}/test_py/date_dataset.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.9}/test_py/date_demo.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.9}/test_py/datedataset_bk.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.9}/test_py/demo1.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.9}/test_py/demo2.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.9}/test_py/demo3.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.9}/test_py/demo4.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.9}/test_py/demo_async_await1.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.9}/test_py/demo_async_await2.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.9}/test_py/demo_coco_vis.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.9}/test_py/demo_copy_files.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.9}/test_py/demo_copy_files_for_voc.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.9}/test_py/demo_ffmpy.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.9}/test_py/demo_for_annular_to_rect.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.9}/test_py/demo_for_pair_file.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.9}/test_py/demo_for_polygon.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.9}/test_py/demo_for_trt.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.9}/test_py/demo_get_file_label.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.9}/test_py/demo_get_file_list.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.9}/test_py/demo_gif.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.9}/test_py/demo_gif_video.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.9}/test_py/demo_image_crop.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.9}/test_py/demo_kpts.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.9}/test_py/demo_labelme.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.9}/test_py/demo_labelme_crop.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.9}/test_py/demo_lableme_vis.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.9}/test_py/demo_letterbox.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.9}/test_py/demo_metrics.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.9}/test_py/demo_mosaic.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.9}/test_py/demo_mouse.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.9}/test_py/demo_nii.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.9}/test_py/demo_pandas.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.9}/test_py/demo_plot.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.9}/test_py/demo_prelabelme.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.9}/test_py/demo_rename.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.9}/test_py/demo_standard_image .py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.9}/test_py/demo_standard_video .py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.9}/test_py/demo_taichi.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.9}/test_py/demo_video2frame.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.9}/test_py/demo_video_crop.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.9}/test_py/demo_voc_crop.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.9}/test_py/demo_voc_vis.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.9}/test_py/demo_word_similar.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.9}/test_py/demo_worker1.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.9}/test_py/demo_worker2.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.9}/test_py/detector/__init__.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.9}/test_py/detector/demo.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.9}/test_py/detector/detect_face_person.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.9}/test_py/detector/predet_labelme.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.9}/test_py/edit_distance/__init__.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.9}/test_py/edit_distance/demo.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.9}/test_py/edit_distance/text_matching.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.9}/test_py/fast_api/__init__.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.9}/test_py/fast_api/create_image_url.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.9}/test_py/fast_api/get_image_url.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.9}/test_py/flask_demo/__init__.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.9}/test_py/flask_demo/app.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.9}/test_py/flask_demo/utils/__init__.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.9}/test_py/flask_demo/utils/utils.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.9}/test_py/get_file_list.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.9}/test_py/gradio_app.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.9}/test_py/gradio_app_v2.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.9}/test_py/image_correction/__init__.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.9}/test_py/image_correction/demo_correction_v1.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.9}/test_py/image_correction/demo_correction_v2.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.9}/test_py/image_correction/demo_correction_v3.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.9}/test_py/kafka_worker.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.9}/test_py/men_tracemalloc.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.9}/test_py/milvus_demo/__init__.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.9}/test_py/milvus_demo/demo01.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.9}/test_py/milvus_demo/demo02.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.9}/test_py/milvus_demo/hello_milvus.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.9}/test_py/milvus_demo/milvus_client.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.9}/test_py/model_process.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.9}/test_py/performance.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.9}/test_py/pose/__init__.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.9}/test_py/pose/human_pose.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.9}/test_py/qrcode/__init__.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.9}/test_py/qrcode/demo.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.9}/test_py/redis_py/__init__.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.9}/test_py/redis_py/knn_search.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.9}/test_py/redis_py/redis_client.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.9}/test_py/registry/__init__.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.9}/test_py/registry/base.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.9}/test_py/registry/component.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.9}/test_py/registry/main.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.9}/test_py/registry/register.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.9}/test_py/single_class/GRU.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.9}/test_py/single_class/TCN.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.9}/test_py/single_class/__init__.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.9}/test_py/single_class/demo.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.9}/test_py/slowfastnet.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.9}/test_py/test_fr/__init__.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.9}/test_py/test_fr/demo11.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.9}/test_py/test_fr/idcardocr.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.9}/test_py/web_socket/__init__.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.9}/test_py/web_socket/asr_clients.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.9}/test_py/web_socket/asr_service.py +0 -0
- {pybaseutils-2.4.8 → pybaseutils-2.4.9}/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,26 @@ get_video_info = image_utils.get_video_info
|
|
|
24
24
|
get_video_writer = image_utils.get_video_writer
|
|
25
25
|
|
|
26
26
|
|
|
27
|
+
def get_usb_camera(video=-1, max_index=50):
|
|
28
|
+
"""
|
|
29
|
+
获取当前系统中连接的USB摄像头索引。
|
|
30
|
+
:param video: 视频路径或摄像头索引,默认值为-1表示自动检测。当video>=0时,不进行检测,直接返回video。
|
|
31
|
+
:param max_index: 最大检测索引范围,默认值为50。
|
|
32
|
+
:return: 一摄像头索引,camera=-1表示未检测到摄像头。
|
|
33
|
+
"""
|
|
34
|
+
if video >= 0: return video
|
|
35
|
+
print("正在检测USB摄像头ID...")
|
|
36
|
+
camera = -1
|
|
37
|
+
for i in range(max_index):
|
|
38
|
+
cap = cv2.VideoCapture(i)
|
|
39
|
+
if cap.isOpened():
|
|
40
|
+
camera = i
|
|
41
|
+
cap.release()
|
|
42
|
+
break
|
|
43
|
+
print("检测到USB摄像头ID={}".format(camera))
|
|
44
|
+
return camera
|
|
45
|
+
|
|
46
|
+
|
|
27
47
|
def merge_video(video1, video2, output="./output.mp4"):
|
|
28
48
|
cmd = f'ffmpeg -i {video1} -i {video2} -filter_complex "[0:v:0][1:v:0]concat=n=2:v=1:a=0[outv]" -map "[outv]" {output}'
|
|
29
49
|
|
|
@@ -304,8 +324,8 @@ def video_capture(video: int or str, save_video: str or int = None, interval=1,
|
|
|
304
324
|
video = file_utils.str2number(video)
|
|
305
325
|
if isinstance(video, str) and os.path.isfile(video):
|
|
306
326
|
assert os.path.exists(video), f"video={video}"
|
|
307
|
-
|
|
308
|
-
w, h, num_frames, fps = image_utils.get_video_info(
|
|
327
|
+
cap = image_utils.get_video_capture(video, fps=None)
|
|
328
|
+
w, h, num_frames, fps = image_utils.get_video_info(cap, **kwargs)
|
|
309
329
|
time = kwargs.get("time", tuple()) # TODO 开始播放时间time[0],结束播放时间time[1],单位秒S
|
|
310
330
|
clip = kwargs.get("clip", tuple()) # TODO 开始播放位置clip[0],结束播放位置clip[1]
|
|
311
331
|
start, end = 0, -1
|
|
@@ -321,7 +341,7 @@ def video_capture(video: int or str, save_video: str or int = None, interval=1,
|
|
|
321
341
|
count = 0
|
|
322
342
|
video_writer = None
|
|
323
343
|
while True:
|
|
324
|
-
ret, frame =
|
|
344
|
+
ret, frame = cap.read()
|
|
325
345
|
if count % interval == 0 and count >= start:
|
|
326
346
|
# TODO 设置抽帧的位置,但某些格式视频容易出现问题
|
|
327
347
|
# if isinstance(video, str): video_cap.set(cv2.CAP_PROP_POS_FRAMES, count)
|
|
@@ -335,7 +355,7 @@ def video_capture(video: int or str, save_video: str or int = None, interval=1,
|
|
|
335
355
|
if not video_writer: video_writer = image_utils.get_video_writer(save_video, w, h, save_fps)
|
|
336
356
|
video_writer.write(frame)
|
|
337
357
|
count += 1
|
|
338
|
-
|
|
358
|
+
cap.release()
|
|
339
359
|
if video_writer:
|
|
340
360
|
print("save video:{}".format(save_video))
|
|
341
361
|
video_writer.release()
|
|
@@ -347,8 +367,8 @@ def video_iterator(video, save_video: str or int = None, interval=1, size=(), fr
|
|
|
347
367
|
读取摄像头或者视频流迭代器
|
|
348
368
|
Usage:
|
|
349
369
|
from pybaseutils.cvutils import video_utils
|
|
350
|
-
|
|
351
|
-
for data_info in
|
|
370
|
+
cap = video_utils.video_iterator(video, save_video, time=(4, 10))
|
|
371
|
+
for data_info in cap:
|
|
352
372
|
frame = data_info["frame"]
|
|
353
373
|
...
|
|
354
374
|
:param video: String 视频文件,如*.avi,*.mp4,...
|
|
@@ -372,8 +392,8 @@ def video_iterator(video, save_video: str or int = None, interval=1, size=(), fr
|
|
|
372
392
|
video = file_utils.str2number(video)
|
|
373
393
|
if isinstance(video, str) and os.path.isfile(video):
|
|
374
394
|
assert os.path.exists(video), f"video={video}"
|
|
375
|
-
|
|
376
|
-
w, h, num_frames, fps = image_utils.get_video_info(
|
|
395
|
+
cap = image_utils.get_video_capture(video, fps=None)
|
|
396
|
+
w, h, num_frames, fps = image_utils.get_video_info(cap, **kwargs)
|
|
377
397
|
time = kwargs.get("time", tuple()) # TODO 开始播放时间time[0],结束播放时间time[1],单位秒S
|
|
378
398
|
clip = kwargs.get("clip", tuple()) # TODO 开始播放位置clip[0],结束播放位置clip[1]
|
|
379
399
|
start, end = 0, -1
|
|
@@ -393,16 +413,16 @@ def video_iterator(video, save_video: str or int = None, interval=1, size=(), fr
|
|
|
393
413
|
t0 = -1
|
|
394
414
|
while True:
|
|
395
415
|
systime = timelib.time()
|
|
396
|
-
ret, frame = (False, None) if use_fast else
|
|
397
|
-
t =
|
|
416
|
+
ret, frame = (False, None) if use_fast else cap.read() # 读取视频很快,但读取USB摄像头比较耗时
|
|
417
|
+
t = cap.get(cv2.CAP_PROP_POS_MSEC) / 1000 # 获得视频偏移量毫秒为单位
|
|
398
418
|
if t0 < 0 < t: t0 = t
|
|
399
419
|
if t0 > 0: t = t - t0 # 获得视频偏移量毫秒为单位
|
|
400
420
|
finish = 0 < end <= (count + interval)
|
|
401
421
|
if count % interval == 0 and count >= start:
|
|
402
422
|
# TODO 设置抽帧的位置,但某些格式视频容易出现问题
|
|
403
423
|
if use_fast and isinstance(video, str):
|
|
404
|
-
|
|
405
|
-
ret, frame =
|
|
424
|
+
cap.set(cv2.CAP_PROP_POS_FRAMES, count)
|
|
425
|
+
ret, frame = cap.read()
|
|
406
426
|
if not ret or 0 < end <= count or frame is None: break
|
|
407
427
|
if size: frame = image_utils.resize_image(frame, size=size)
|
|
408
428
|
if task: frame = task(frame, **kwargs)
|
|
@@ -421,7 +441,7 @@ def video_iterator(video, save_video: str or int = None, interval=1, size=(), fr
|
|
|
421
441
|
video_writer.write(frame)
|
|
422
442
|
if data_info['finish']: break # 控制结束
|
|
423
443
|
count += 1
|
|
424
|
-
|
|
444
|
+
cap.release()
|
|
425
445
|
if video_writer:
|
|
426
446
|
print("save video:{}".format(save_video))
|
|
427
447
|
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 = 5
|
|
23
|
+
width = 1920
|
|
24
|
+
height = 1080
|
|
25
|
+
# video = 0 # Windows 下可能是 0 或 "video=Integrated Webcam"
|
|
26
|
+
video = "/home/PKing/Videos/demo-src.mp4" # Windows 下可能是 0 或 "video=Integrated Webcam"
|
|
27
|
+
cap = CameraCapture(video=video, size=(width, height), fps=fps)
|
|
28
|
+
display(cap)
|
|
File without changes
|
|
File without changes
|
|
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
|