pybaseutils 2.4.14__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.
- {pybaseutils-2.4.14 → pybaseutils-2.4.16}/PKG-INFO +1 -1
- {pybaseutils-2.4.14 → pybaseutils-2.4.16}/pybaseutils/__init__.py +1 -1
- pybaseutils-2.4.16/pybaseutils/cvutils/camera.py +182 -0
- {pybaseutils-2.4.14 → pybaseutils-2.4.16}/pybaseutils/cvutils/video_utils.py +4 -1
- {pybaseutils-2.4.14 → pybaseutils-2.4.16}/pybaseutils.egg-info/PKG-INFO +1 -1
- {pybaseutils-2.4.14 → pybaseutils-2.4.16}/pybaseutils.egg-info/SOURCES.txt +1 -0
- pybaseutils-2.4.16/test_py/camera.py +194 -0
- pybaseutils-2.4.14/pybaseutils/cvutils/camera.py +0 -112
- {pybaseutils-2.4.14 → pybaseutils-2.4.16}/LICENCE +0 -0
- {pybaseutils-2.4.14 → pybaseutils-2.4.16}/README.md +0 -0
- {pybaseutils-2.4.14 → pybaseutils-2.4.16}/pybaseutils/audio/__init__.py +0 -0
- {pybaseutils-2.4.14 → pybaseutils-2.4.16}/pybaseutils/audio/audio_utils.py +0 -0
- {pybaseutils-2.4.14 → pybaseutils-2.4.16}/pybaseutils/audio/pyaudio_utils.py +0 -0
- {pybaseutils-2.4.14 → pybaseutils-2.4.16}/pybaseutils/audio/vad_utils.py +0 -0
- {pybaseutils-2.4.14 → pybaseutils-2.4.16}/pybaseutils/base/__init__.py +0 -0
- {pybaseutils-2.4.14 → pybaseutils-2.4.16}/pybaseutils/base/dict_queue.py +0 -0
- {pybaseutils-2.4.14 → pybaseutils-2.4.16}/pybaseutils/base/list_queue.py +0 -0
- {pybaseutils-2.4.14 → pybaseutils-2.4.16}/pybaseutils/base/producer_consumer.py +0 -0
- {pybaseutils-2.4.14 → pybaseutils-2.4.16}/pybaseutils/base64_utils.py +0 -0
- {pybaseutils-2.4.14 → pybaseutils-2.4.16}/pybaseutils/batch_utils.py +0 -0
- {pybaseutils-2.4.14 → pybaseutils-2.4.16}/pybaseutils/build_utils/__init__.py +0 -0
- {pybaseutils-2.4.14 → pybaseutils-2.4.16}/pybaseutils/build_utils/cython_utils.py +0 -0
- {pybaseutils-2.4.14 → pybaseutils-2.4.16}/pybaseutils/build_utils/pyarmor_utils.py +0 -0
- {pybaseutils-2.4.14 → pybaseutils-2.4.16}/pybaseutils/cluster/__init__.py +0 -0
- {pybaseutils-2.4.14 → pybaseutils-2.4.16}/pybaseutils/cluster/kmean.py +0 -0
- {pybaseutils-2.4.14 → pybaseutils-2.4.16}/pybaseutils/cluster/maxmin_distance.py +0 -0
- {pybaseutils-2.4.14 → pybaseutils-2.4.16}/pybaseutils/cluster/similarity.py +0 -0
- {pybaseutils-2.4.14 → pybaseutils-2.4.16}/pybaseutils/color_utils.py +0 -0
- {pybaseutils-2.4.14 → pybaseutils-2.4.16}/pybaseutils/config_utils.py +0 -0
- {pybaseutils-2.4.14 → pybaseutils-2.4.16}/pybaseutils/converter/__init__.py +0 -0
- {pybaseutils-2.4.14 → pybaseutils-2.4.16}/pybaseutils/converter/build_coco.py +0 -0
- {pybaseutils-2.4.14 → pybaseutils-2.4.16}/pybaseutils/converter/build_cvat.py +0 -0
- {pybaseutils-2.4.14 → pybaseutils-2.4.16}/pybaseutils/converter/build_labelme.py +0 -0
- {pybaseutils-2.4.14 → pybaseutils-2.4.16}/pybaseutils/converter/build_voc.py +0 -0
- {pybaseutils-2.4.14 → pybaseutils-2.4.16}/pybaseutils/converter/concat_coco.py +0 -0
- {pybaseutils-2.4.14 → pybaseutils-2.4.16}/pybaseutils/converter/convert_coco2labelme.py +0 -0
- {pybaseutils-2.4.14 → pybaseutils-2.4.16}/pybaseutils/converter/convert_coco2voc.py +0 -0
- {pybaseutils-2.4.14 → pybaseutils-2.4.16}/pybaseutils/converter/convert_cvat2labelme.py +0 -0
- {pybaseutils-2.4.14 → pybaseutils-2.4.16}/pybaseutils/converter/convert_labelme2coco.py +0 -0
- {pybaseutils-2.4.14 → pybaseutils-2.4.16}/pybaseutils/converter/convert_labelme2cvat.py +0 -0
- {pybaseutils-2.4.14 → pybaseutils-2.4.16}/pybaseutils/converter/convert_labelme2labelme.py +0 -0
- {pybaseutils-2.4.14 → pybaseutils-2.4.16}/pybaseutils/converter/convert_labelme2voc.py +0 -0
- {pybaseutils-2.4.14 → pybaseutils-2.4.16}/pybaseutils/converter/convert_labelme2yolo.py +0 -0
- {pybaseutils-2.4.14 → pybaseutils-2.4.16}/pybaseutils/converter/convert_voc2coco.py +0 -0
- {pybaseutils-2.4.14 → pybaseutils-2.4.16}/pybaseutils/converter/convert_voc2labelme.py +0 -0
- {pybaseutils-2.4.14 → pybaseutils-2.4.16}/pybaseutils/converter/convert_voc2voc.py +0 -0
- {pybaseutils-2.4.14 → pybaseutils-2.4.16}/pybaseutils/converter/convert_voc2yolo.py +0 -0
- {pybaseutils-2.4.14 → pybaseutils-2.4.16}/pybaseutils/converter/convert_yolo2labelme.py +0 -0
- {pybaseutils-2.4.14 → pybaseutils-2.4.16}/pybaseutils/converter/convert_yolo2voc.py +0 -0
- {pybaseutils-2.4.14 → pybaseutils-2.4.16}/pybaseutils/converter/prelabelme.py +0 -0
- {pybaseutils-2.4.14 → pybaseutils-2.4.16}/pybaseutils/coords_utils.py +0 -0
- {pybaseutils-2.4.14 → pybaseutils-2.4.16}/pybaseutils/cvutils/__init__.py +0 -0
- {pybaseutils-2.4.14 → pybaseutils-2.4.16}/pybaseutils/cvutils/corner_utils.py +0 -0
- {pybaseutils-2.4.14 → pybaseutils-2.4.16}/pybaseutils/cvutils/monitor.py +0 -0
- {pybaseutils-2.4.14 → pybaseutils-2.4.16}/pybaseutils/cvutils/mouse_utils.py +0 -0
- {pybaseutils-2.4.14 → pybaseutils-2.4.16}/pybaseutils/cvutils/nms_utils.py +0 -0
- {pybaseutils-2.4.14 → pybaseutils-2.4.16}/pybaseutils/data_utils.py +0 -0
- {pybaseutils-2.4.14 → pybaseutils-2.4.16}/pybaseutils/dataloader/__init__.py +0 -0
- {pybaseutils-2.4.14 → pybaseutils-2.4.16}/pybaseutils/dataloader/balanced_classes.py +0 -0
- {pybaseutils-2.4.14 → pybaseutils-2.4.16}/pybaseutils/dataloader/base_coco.py +0 -0
- {pybaseutils-2.4.14 → pybaseutils-2.4.16}/pybaseutils/dataloader/base_dataset.py +0 -0
- {pybaseutils-2.4.14 → pybaseutils-2.4.16}/pybaseutils/dataloader/data_resample.py +0 -0
- {pybaseutils-2.4.14 → pybaseutils-2.4.16}/pybaseutils/dataloader/parser_coco_det.py +0 -0
- {pybaseutils-2.4.14 → pybaseutils-2.4.16}/pybaseutils/dataloader/parser_coco_ins.py +0 -0
- {pybaseutils-2.4.14 → pybaseutils-2.4.16}/pybaseutils/dataloader/parser_coco_kps.py +0 -0
- {pybaseutils-2.4.14 → pybaseutils-2.4.16}/pybaseutils/dataloader/parser_image_folder.py +0 -0
- {pybaseutils-2.4.14 → pybaseutils-2.4.16}/pybaseutils/dataloader/parser_image_text.py +0 -0
- {pybaseutils-2.4.14 → pybaseutils-2.4.16}/pybaseutils/dataloader/parser_labelme.py +0 -0
- {pybaseutils-2.4.14 → pybaseutils-2.4.16}/pybaseutils/dataloader/parser_labelme_crop.py +0 -0
- {pybaseutils-2.4.14 → pybaseutils-2.4.16}/pybaseutils/dataloader/parser_labelme_line.py +0 -0
- {pybaseutils-2.4.14 → pybaseutils-2.4.16}/pybaseutils/dataloader/parser_video_folder.py +0 -0
- {pybaseutils-2.4.14 → pybaseutils-2.4.16}/pybaseutils/dataloader/parser_video_text.py +0 -0
- {pybaseutils-2.4.14 → pybaseutils-2.4.16}/pybaseutils/dataloader/parser_voc.py +0 -0
- {pybaseutils-2.4.14 → pybaseutils-2.4.16}/pybaseutils/dataloader/parser_yolo.py +0 -0
- {pybaseutils-2.4.14 → pybaseutils-2.4.16}/pybaseutils/dataloader/voc_seg_utils.py +0 -0
- {pybaseutils-2.4.14 → pybaseutils-2.4.16}/pybaseutils/dict_uils.py +0 -0
- {pybaseutils-2.4.14 → pybaseutils-2.4.16}/pybaseutils/file_utils.py +0 -0
- {pybaseutils-2.4.14 → pybaseutils-2.4.16}/pybaseutils/filter/QueueTable.py +0 -0
- {pybaseutils-2.4.14 → pybaseutils-2.4.16}/pybaseutils/filter/__init__.py +0 -0
- {pybaseutils-2.4.14 → pybaseutils-2.4.16}/pybaseutils/filter/demo.py +0 -0
- {pybaseutils-2.4.14 → pybaseutils-2.4.16}/pybaseutils/filter/kalman_filter.py +0 -0
- {pybaseutils-2.4.14 → pybaseutils-2.4.16}/pybaseutils/filter/mean_filter.py +0 -0
- {pybaseutils-2.4.14 → pybaseutils-2.4.16}/pybaseutils/filter/motion_filter.py +0 -0
- {pybaseutils-2.4.14 → pybaseutils-2.4.16}/pybaseutils/filter/pose_filter.py +0 -0
- {pybaseutils-2.4.14 → pybaseutils-2.4.16}/pybaseutils/font_style/__init__.py +0 -0
- {pybaseutils-2.4.14 → pybaseutils-2.4.16}/pybaseutils/font_utils.py +0 -0
- {pybaseutils-2.4.14 → pybaseutils-2.4.16}/pybaseutils/geometry_tools.py +0 -0
- {pybaseutils-2.4.14 → pybaseutils-2.4.16}/pybaseutils/heatmap_utils.py +0 -0
- {pybaseutils-2.4.14 → pybaseutils-2.4.16}/pybaseutils/http_utils.py +0 -0
- {pybaseutils-2.4.14 → pybaseutils-2.4.16}/pybaseutils/image_utils.py +0 -0
- {pybaseutils-2.4.14 → pybaseutils-2.4.16}/pybaseutils/json_utils.py +0 -0
- {pybaseutils-2.4.14 → pybaseutils-2.4.16}/pybaseutils/log.py +0 -0
- {pybaseutils-2.4.14 → pybaseutils-2.4.16}/pybaseutils/log_utils.py +0 -0
- {pybaseutils-2.4.14 → pybaseutils-2.4.16}/pybaseutils/media/__init__.py +0 -0
- {pybaseutils-2.4.14 → pybaseutils-2.4.16}/pybaseutils/media/ffmpeg_utils.py +0 -0
- {pybaseutils-2.4.14 → pybaseutils-2.4.16}/pybaseutils/metrics/__init__.py +0 -0
- {pybaseutils-2.4.14 → pybaseutils-2.4.16}/pybaseutils/metrics/accuracy.py +0 -0
- {pybaseutils-2.4.14 → pybaseutils-2.4.16}/pybaseutils/metrics/average_meter.py +0 -0
- {pybaseutils-2.4.14 → pybaseutils-2.4.16}/pybaseutils/metrics/class_report.py +0 -0
- {pybaseutils-2.4.14 → pybaseutils-2.4.16}/pybaseutils/metrics/plot_pr.py +0 -0
- {pybaseutils-2.4.14 → pybaseutils-2.4.16}/pybaseutils/metrics/plot_roc.py +0 -0
- {pybaseutils-2.4.14 → pybaseutils-2.4.16}/pybaseutils/nets_utils.py +0 -0
- {pybaseutils-2.4.14 → pybaseutils-2.4.16}/pybaseutils/numpy_utils.py +0 -0
- {pybaseutils-2.4.14 → pybaseutils-2.4.16}/pybaseutils/pandas_utils.py +0 -0
- {pybaseutils-2.4.14 → pybaseutils-2.4.16}/pybaseutils/plot_utils.py +0 -0
- {pybaseutils-2.4.14 → pybaseutils-2.4.16}/pybaseutils/pose/__init__.py +0 -0
- {pybaseutils-2.4.14 → pybaseutils-2.4.16}/pybaseutils/pose/bones_utils.py +0 -0
- {pybaseutils-2.4.14 → pybaseutils-2.4.16}/pybaseutils/pose/human_pose.py +0 -0
- {pybaseutils-2.4.14 → pybaseutils-2.4.16}/pybaseutils/pose/pose_utils.py +0 -0
- {pybaseutils-2.4.14 → pybaseutils-2.4.16}/pybaseutils/pycpp/__init__.py +0 -0
- {pybaseutils-2.4.14 → pybaseutils-2.4.16}/pybaseutils/pycpp/demo.py +0 -0
- {pybaseutils-2.4.14 → pybaseutils-2.4.16}/pybaseutils/pycpp/main.py +0 -0
- {pybaseutils-2.4.14 → pybaseutils-2.4.16}/pybaseutils/server/__init__.py +0 -0
- {pybaseutils-2.4.14 → pybaseutils-2.4.16}/pybaseutils/server/apm_server.py +0 -0
- {pybaseutils-2.4.14 → pybaseutils-2.4.16}/pybaseutils/setup_config.py +0 -0
- {pybaseutils-2.4.14 → pybaseutils-2.4.16}/pybaseutils/singleton_utils.py +0 -0
- {pybaseutils-2.4.14 → pybaseutils-2.4.16}/pybaseutils/text_utils.py +0 -0
- {pybaseutils-2.4.14 → pybaseutils-2.4.16}/pybaseutils/thread_utils.py +0 -0
- {pybaseutils-2.4.14 → pybaseutils-2.4.16}/pybaseutils/time_utils.py +0 -0
- {pybaseutils-2.4.14 → pybaseutils-2.4.16}/pybaseutils/tracemalloc_utils.py +0 -0
- {pybaseutils-2.4.14 → pybaseutils-2.4.16}/pybaseutils/tracemalloc_utils2.py +0 -0
- {pybaseutils-2.4.14 → pybaseutils-2.4.16}/pybaseutils/tracking/QueueTable.py +0 -0
- {pybaseutils-2.4.14 → pybaseutils-2.4.16}/pybaseutils/tracking/__init__.py +0 -0
- {pybaseutils-2.4.14 → pybaseutils-2.4.16}/pybaseutils/tracking/demo.py +0 -0
- {pybaseutils-2.4.14 → pybaseutils-2.4.16}/pybaseutils/tracking/kalman_filter.py +0 -0
- {pybaseutils-2.4.14 → pybaseutils-2.4.16}/pybaseutils/tracking/mean_filter.py +0 -0
- {pybaseutils-2.4.14 → pybaseutils-2.4.16}/pybaseutils/tracking/motion_filter.py +0 -0
- {pybaseutils-2.4.14 → pybaseutils-2.4.16}/pybaseutils/tracking/pose_filter.py +0 -0
- {pybaseutils-2.4.14 → pybaseutils-2.4.16}/pybaseutils/transforms/__init__.py +0 -0
- {pybaseutils-2.4.14 → pybaseutils-2.4.16}/pybaseutils/transforms/affine_transform.py +0 -0
- {pybaseutils-2.4.14 → pybaseutils-2.4.16}/pybaseutils/transforms/build_transform.py +0 -0
- {pybaseutils-2.4.14 → pybaseutils-2.4.16}/pybaseutils/transforms/face_alignment.py +0 -0
- {pybaseutils-2.4.14 → pybaseutils-2.4.16}/pybaseutils/transforms/imgaug_utils.py +0 -0
- {pybaseutils-2.4.14 → pybaseutils-2.4.16}/pybaseutils/transforms/transform_utils.py +0 -0
- {pybaseutils-2.4.14 → pybaseutils-2.4.16}/pybaseutils/web/__init__.py +0 -0
- {pybaseutils-2.4.14 → pybaseutils-2.4.16}/pybaseutils/web/app_gradio_image.py +0 -0
- {pybaseutils-2.4.14 → pybaseutils-2.4.16}/pybaseutils/web/app_stweb_image.py +0 -0
- {pybaseutils-2.4.14 → pybaseutils-2.4.16}/pybaseutils/web/app_webio_image.py +0 -0
- {pybaseutils-2.4.14 → pybaseutils-2.4.16}/pybaseutils/web/demo.py +0 -0
- {pybaseutils-2.4.14 → pybaseutils-2.4.16}/pybaseutils/word_utils.py +0 -0
- {pybaseutils-2.4.14 → pybaseutils-2.4.16}/pybaseutils/worker.py +0 -0
- {pybaseutils-2.4.14 → pybaseutils-2.4.16}/pybaseutils/yaml_utils.py +0 -0
- {pybaseutils-2.4.14 → pybaseutils-2.4.16}/pybaseutils.egg-info/dependency_links.txt +0 -0
- {pybaseutils-2.4.14 → pybaseutils-2.4.16}/pybaseutils.egg-info/not-zip-safe +0 -0
- {pybaseutils-2.4.14 → pybaseutils-2.4.16}/pybaseutils.egg-info/top_level.txt +0 -0
- {pybaseutils-2.4.14 → pybaseutils-2.4.16}/setup.cfg +0 -0
- {pybaseutils-2.4.14 → pybaseutils-2.4.16}/setup.py +0 -0
- {pybaseutils-2.4.14 → pybaseutils-2.4.16}/test_py/Image_enhance/__init__.py +0 -0
- {pybaseutils-2.4.14 → pybaseutils-2.4.16}/test_py/Image_enhance/dmeo01.py +0 -0
- {pybaseutils-2.4.14 → pybaseutils-2.4.16}/test_py/WebCrawler/__init__.py +0 -0
- {pybaseutils-2.4.14 → pybaseutils-2.4.16}/test_py/WebCrawler/search_baidu.py +0 -0
- {pybaseutils-2.4.14 → pybaseutils-2.4.16}/test_py/WebCrawler/search_biying.py +0 -0
- {pybaseutils-2.4.14 → pybaseutils-2.4.16}/test_py/__init__.py +0 -0
- {pybaseutils-2.4.14 → pybaseutils-2.4.16}/test_py/aije/__init__.py +0 -0
- {pybaseutils-2.4.14 → pybaseutils-2.4.16}/test_py/aije/action_dataset.py +0 -0
- {pybaseutils-2.4.14 → pybaseutils-2.4.16}/test_py/aije/build_cython.py +0 -0
- {pybaseutils-2.4.14 → pybaseutils-2.4.16}/test_py/aije/build_pyarmor.py +0 -0
- {pybaseutils-2.4.14 → pybaseutils-2.4.16}/test_py/aije/build_service.py +0 -0
- {pybaseutils-2.4.14 → pybaseutils-2.4.16}/test_py/aije/convert_cvat2labelme.py +0 -0
- {pybaseutils-2.4.14 → pybaseutils-2.4.16}/test_py/aije/convert_labelme2coco.py +0 -0
- {pybaseutils-2.4.14 → pybaseutils-2.4.16}/test_py/aije/convert_labelme2voc.py +0 -0
- {pybaseutils-2.4.14 → pybaseutils-2.4.16}/test_py/aije/copy_move.py +0 -0
- {pybaseutils-2.4.14 → pybaseutils-2.4.16}/test_py/aije/demo_labelme_crop_aije.py +0 -0
- {pybaseutils-2.4.14 → pybaseutils-2.4.16}/test_py/aije/demo_labelme_crop_ailt.py +0 -0
- {pybaseutils-2.4.14 → pybaseutils-2.4.16}/test_py/aije/demo_labelme_shock.py +0 -0
- {pybaseutils-2.4.14 → pybaseutils-2.4.16}/test_py/aije/demo_motion_blur.py +0 -0
- {pybaseutils-2.4.14 → pybaseutils-2.4.16}/test_py/aije/demo_video_aije.py +0 -0
- {pybaseutils-2.4.14 → pybaseutils-2.4.16}/test_py/aije/demo_voc_crop.py +0 -0
- {pybaseutils-2.4.14 → pybaseutils-2.4.16}/test_py/aije/demo_voc_vis.py +0 -0
- {pybaseutils-2.4.14 → pybaseutils-2.4.16}/test_py/aije/get_pair_data.py +0 -0
- {pybaseutils-2.4.14 → pybaseutils-2.4.16}/test_py/aije/mask_image.py +0 -0
- {pybaseutils-2.4.14 → pybaseutils-2.4.16}/test_py/aije/video_convertor.py +0 -0
- {pybaseutils-2.4.14 → pybaseutils-2.4.16}/test_py/audio/__init__.py +0 -0
- {pybaseutils-2.4.14 → pybaseutils-2.4.16}/test_py/audio/demo.py +0 -0
- {pybaseutils-2.4.14 → pybaseutils-2.4.16}/test_py/audio/main.py +0 -0
- {pybaseutils-2.4.14 → pybaseutils-2.4.16}/test_py/audio/main_read.py +0 -0
- {pybaseutils-2.4.14 → pybaseutils-2.4.16}/test_py/audio/segment.py +0 -0
- {pybaseutils-2.4.14 → pybaseutils-2.4.16}/test_py/audio/speechbrain_asr_indoor_prod.py +0 -0
- {pybaseutils-2.4.14 → pybaseutils-2.4.16}/test_py/audio/speechbrain_demo.py +0 -0
- {pybaseutils-2.4.14 → pybaseutils-2.4.16}/test_py/audio_demo1.py +0 -0
- {pybaseutils-2.4.14 → pybaseutils-2.4.16}/test_py/camera/__init__.py +0 -0
- {pybaseutils-2.4.14 → pybaseutils-2.4.16}/test_py/camera/demo.py +0 -0
- {pybaseutils-2.4.14 → pybaseutils-2.4.16}/test_py/captcha/__init__.py +0 -0
- {pybaseutils-2.4.14 → pybaseutils-2.4.16}/test_py/captcha/demo.py +0 -0
- {pybaseutils-2.4.14 → pybaseutils-2.4.16}/test_py/class_attribute.py +0 -0
- {pybaseutils-2.4.14 → pybaseutils-2.4.16}/test_py/class_names.py +0 -0
- {pybaseutils-2.4.14 → pybaseutils-2.4.16}/test_py/converter/AffectNet.py +0 -0
- {pybaseutils-2.4.14 → pybaseutils-2.4.16}/test_py/converter/AsianMovie.py +0 -0
- {pybaseutils-2.4.14 → pybaseutils-2.4.16}/test_py/converter/BITVehicle2voc.py +0 -0
- {pybaseutils-2.4.14 → pybaseutils-2.4.16}/test_py/converter/BSTLD2voc.py +0 -0
- {pybaseutils-2.4.14 → pybaseutils-2.4.16}/test_py/converter/CCPD.py +0 -0
- {pybaseutils-2.4.14 → pybaseutils-2.4.16}/test_py/converter/CCPD2voc.py +0 -0
- {pybaseutils-2.4.14 → pybaseutils-2.4.16}/test_py/converter/FL3D_dataset.py +0 -0
- {pybaseutils-2.4.14 → pybaseutils-2.4.16}/test_py/converter/FreiHAND2coco.py +0 -0
- {pybaseutils-2.4.14 → pybaseutils-2.4.16}/test_py/converter/MTFL2voc.py +0 -0
- {pybaseutils-2.4.14 → pybaseutils-2.4.16}/test_py/converter/TT100K.py +0 -0
- {pybaseutils-2.4.14 → pybaseutils-2.4.16}/test_py/converter/WaterMeters1.py +0 -0
- {pybaseutils-2.4.14 → pybaseutils-2.4.16}/test_py/converter/WaterMeters2.py +0 -0
- {pybaseutils-2.4.14 → pybaseutils-2.4.16}/test_py/converter/__init__.py +0 -0
- {pybaseutils-2.4.14 → pybaseutils-2.4.16}/test_py/converter/concat_coco.py +0 -0
- {pybaseutils-2.4.14 → pybaseutils-2.4.16}/test_py/converter/convert_coco2voc.py +0 -0
- {pybaseutils-2.4.14 → pybaseutils-2.4.16}/test_py/converter/convert_cvat2labelme.py +0 -0
- {pybaseutils-2.4.14 → pybaseutils-2.4.16}/test_py/converter/convert_gesture2hand.py +0 -0
- {pybaseutils-2.4.14 → pybaseutils-2.4.16}/test_py/converter/convert_labelme2coco.py +0 -0
- {pybaseutils-2.4.14 → pybaseutils-2.4.16}/test_py/converter/convert_labelme2cvat.py +0 -0
- {pybaseutils-2.4.14 → pybaseutils-2.4.16}/test_py/converter/convert_labelme2labelme.py +0 -0
- {pybaseutils-2.4.14 → pybaseutils-2.4.16}/test_py/converter/convert_labelme2voc.py +0 -0
- {pybaseutils-2.4.14 → pybaseutils-2.4.16}/test_py/converter/convert_voc2labelme.py +0 -0
- {pybaseutils-2.4.14 → pybaseutils-2.4.16}/test_py/converter/convert_yolo2labelme.py +0 -0
- {pybaseutils-2.4.14 → pybaseutils-2.4.16}/test_py/converter/fall_dataset.py +0 -0
- {pybaseutils-2.4.14 → pybaseutils-2.4.16}/test_py/converter/fatigue_driving.py +0 -0
- {pybaseutils-2.4.14 → pybaseutils-2.4.16}/test_py/converter/fdd_dataset.py +0 -0
- {pybaseutils-2.4.14 → pybaseutils-2.4.16}/test_py/converter/get_pair_data.py +0 -0
- {pybaseutils-2.4.14 → pybaseutils-2.4.16}/test_py/converter/handpose2coco.py +0 -0
- {pybaseutils-2.4.14 → pybaseutils-2.4.16}/test_py/converter/insects_for_aichallenger.py +0 -0
- {pybaseutils-2.4.14 → pybaseutils-2.4.16}/test_py/converter/parking_rois_gopro.py +0 -0
- {pybaseutils-2.4.14 → pybaseutils-2.4.16}/test_py/converter/tt100k_utils.py +0 -0
- {pybaseutils-2.4.14 → pybaseutils-2.4.16}/test_py/converter/ua_detrac2voc.py +0 -0
- {pybaseutils-2.4.14 → pybaseutils-2.4.16}/test_py/converter/ucf101_dataset.py +0 -0
- {pybaseutils-2.4.14 → pybaseutils-2.4.16}/test_py/converter/voc_sbd2labelme.py +0 -0
- {pybaseutils-2.4.14 → pybaseutils-2.4.16}/test_py/cython_build/__init__.py +0 -0
- {pybaseutils-2.4.14 → pybaseutils-2.4.16}/test_py/cython_build/build_cython.py +0 -0
- {pybaseutils-2.4.14 → pybaseutils-2.4.16}/test_py/cython_build/build_pyarmor.py +0 -0
- {pybaseutils-2.4.14 → pybaseutils-2.4.16}/test_py/cython_build/cryptography_demo.py +0 -0
- {pybaseutils-2.4.14 → pybaseutils-2.4.16}/test_py/cython_build/fun_sum.py +0 -0
- {pybaseutils-2.4.14 → pybaseutils-2.4.16}/test_py/cython_build/main.py +0 -0
- {pybaseutils-2.4.14 → pybaseutils-2.4.16}/test_py/cython_build/model_des_enctypt.py +0 -0
- {pybaseutils-2.4.14 → pybaseutils-2.4.16}/test_py/cython_build/model_enctypt.py +0 -0
- {pybaseutils-2.4.14 → pybaseutils-2.4.16}/test_py/date_dataset.py +0 -0
- {pybaseutils-2.4.14 → pybaseutils-2.4.16}/test_py/date_demo.py +0 -0
- {pybaseutils-2.4.14 → pybaseutils-2.4.16}/test_py/datedataset_bk.py +0 -0
- {pybaseutils-2.4.14 → pybaseutils-2.4.16}/test_py/demo1.py +0 -0
- {pybaseutils-2.4.14 → pybaseutils-2.4.16}/test_py/demo2.py +0 -0
- {pybaseutils-2.4.14 → pybaseutils-2.4.16}/test_py/demo3.py +0 -0
- {pybaseutils-2.4.14 → pybaseutils-2.4.16}/test_py/demo4.py +0 -0
- {pybaseutils-2.4.14 → pybaseutils-2.4.16}/test_py/demo_async_await1.py +0 -0
- {pybaseutils-2.4.14 → pybaseutils-2.4.16}/test_py/demo_async_await2.py +0 -0
- {pybaseutils-2.4.14 → pybaseutils-2.4.16}/test_py/demo_coco_vis.py +0 -0
- {pybaseutils-2.4.14 → pybaseutils-2.4.16}/test_py/demo_copy_files.py +0 -0
- {pybaseutils-2.4.14 → pybaseutils-2.4.16}/test_py/demo_copy_files_for_voc.py +0 -0
- {pybaseutils-2.4.14 → pybaseutils-2.4.16}/test_py/demo_ffmpy.py +0 -0
- {pybaseutils-2.4.14 → pybaseutils-2.4.16}/test_py/demo_for_annular_to_rect.py +0 -0
- {pybaseutils-2.4.14 → pybaseutils-2.4.16}/test_py/demo_for_pair_file.py +0 -0
- {pybaseutils-2.4.14 → pybaseutils-2.4.16}/test_py/demo_for_polygon.py +0 -0
- {pybaseutils-2.4.14 → pybaseutils-2.4.16}/test_py/demo_for_trt.py +0 -0
- {pybaseutils-2.4.14 → pybaseutils-2.4.16}/test_py/demo_get_file_label.py +0 -0
- {pybaseutils-2.4.14 → pybaseutils-2.4.16}/test_py/demo_get_file_list.py +0 -0
- {pybaseutils-2.4.14 → pybaseutils-2.4.16}/test_py/demo_gif.py +0 -0
- {pybaseutils-2.4.14 → pybaseutils-2.4.16}/test_py/demo_gif_video.py +0 -0
- {pybaseutils-2.4.14 → pybaseutils-2.4.16}/test_py/demo_image_crop.py +0 -0
- {pybaseutils-2.4.14 → pybaseutils-2.4.16}/test_py/demo_kpts.py +0 -0
- {pybaseutils-2.4.14 → pybaseutils-2.4.16}/test_py/demo_labelme.py +0 -0
- {pybaseutils-2.4.14 → pybaseutils-2.4.16}/test_py/demo_labelme_crop.py +0 -0
- {pybaseutils-2.4.14 → pybaseutils-2.4.16}/test_py/demo_lableme_vis.py +0 -0
- {pybaseutils-2.4.14 → pybaseutils-2.4.16}/test_py/demo_letterbox.py +0 -0
- {pybaseutils-2.4.14 → pybaseutils-2.4.16}/test_py/demo_metrics.py +0 -0
- {pybaseutils-2.4.14 → pybaseutils-2.4.16}/test_py/demo_mosaic.py +0 -0
- {pybaseutils-2.4.14 → pybaseutils-2.4.16}/test_py/demo_mouse.py +0 -0
- {pybaseutils-2.4.14 → pybaseutils-2.4.16}/test_py/demo_nii.py +0 -0
- {pybaseutils-2.4.14 → pybaseutils-2.4.16}/test_py/demo_pandas.py +0 -0
- {pybaseutils-2.4.14 → pybaseutils-2.4.16}/test_py/demo_plot.py +0 -0
- {pybaseutils-2.4.14 → pybaseutils-2.4.16}/test_py/demo_prelabelme.py +0 -0
- {pybaseutils-2.4.14 → pybaseutils-2.4.16}/test_py/demo_rename.py +0 -0
- {pybaseutils-2.4.14 → pybaseutils-2.4.16}/test_py/demo_standard_image .py +0 -0
- {pybaseutils-2.4.14 → pybaseutils-2.4.16}/test_py/demo_standard_video .py +0 -0
- {pybaseutils-2.4.14 → pybaseutils-2.4.16}/test_py/demo_taichi.py +0 -0
- {pybaseutils-2.4.14 → pybaseutils-2.4.16}/test_py/demo_video2frame.py +0 -0
- {pybaseutils-2.4.14 → pybaseutils-2.4.16}/test_py/demo_video_crop.py +0 -0
- {pybaseutils-2.4.14 → pybaseutils-2.4.16}/test_py/demo_voc_crop.py +0 -0
- {pybaseutils-2.4.14 → pybaseutils-2.4.16}/test_py/demo_voc_vis.py +0 -0
- {pybaseutils-2.4.14 → pybaseutils-2.4.16}/test_py/demo_word_similar.py +0 -0
- {pybaseutils-2.4.14 → pybaseutils-2.4.16}/test_py/demo_worker1.py +0 -0
- {pybaseutils-2.4.14 → pybaseutils-2.4.16}/test_py/demo_worker2.py +0 -0
- {pybaseutils-2.4.14 → pybaseutils-2.4.16}/test_py/detector/__init__.py +0 -0
- {pybaseutils-2.4.14 → pybaseutils-2.4.16}/test_py/detector/demo.py +0 -0
- {pybaseutils-2.4.14 → pybaseutils-2.4.16}/test_py/detector/detect_face_person.py +0 -0
- {pybaseutils-2.4.14 → pybaseutils-2.4.16}/test_py/detector/predet_labelme.py +0 -0
- {pybaseutils-2.4.14 → pybaseutils-2.4.16}/test_py/edit_distance/__init__.py +0 -0
- {pybaseutils-2.4.14 → pybaseutils-2.4.16}/test_py/edit_distance/demo.py +0 -0
- {pybaseutils-2.4.14 → pybaseutils-2.4.16}/test_py/edit_distance/text_matching.py +0 -0
- {pybaseutils-2.4.14 → pybaseutils-2.4.16}/test_py/fast_api/__init__.py +0 -0
- {pybaseutils-2.4.14 → pybaseutils-2.4.16}/test_py/fast_api/create_image_url.py +0 -0
- {pybaseutils-2.4.14 → pybaseutils-2.4.16}/test_py/fast_api/get_image_url.py +0 -0
- {pybaseutils-2.4.14 → pybaseutils-2.4.16}/test_py/flask_demo/__init__.py +0 -0
- {pybaseutils-2.4.14 → pybaseutils-2.4.16}/test_py/flask_demo/app.py +0 -0
- {pybaseutils-2.4.14 → pybaseutils-2.4.16}/test_py/flask_demo/utils/__init__.py +0 -0
- {pybaseutils-2.4.14 → pybaseutils-2.4.16}/test_py/flask_demo/utils/utils.py +0 -0
- {pybaseutils-2.4.14 → pybaseutils-2.4.16}/test_py/get_file_list.py +0 -0
- {pybaseutils-2.4.14 → pybaseutils-2.4.16}/test_py/gradio_app.py +0 -0
- {pybaseutils-2.4.14 → pybaseutils-2.4.16}/test_py/gradio_app_v2.py +0 -0
- {pybaseutils-2.4.14 → pybaseutils-2.4.16}/test_py/image_correction/__init__.py +0 -0
- {pybaseutils-2.4.14 → pybaseutils-2.4.16}/test_py/image_correction/demo_correction_v1.py +0 -0
- {pybaseutils-2.4.14 → pybaseutils-2.4.16}/test_py/image_correction/demo_correction_v2.py +0 -0
- {pybaseutils-2.4.14 → pybaseutils-2.4.16}/test_py/image_correction/demo_correction_v3.py +0 -0
- {pybaseutils-2.4.14 → pybaseutils-2.4.16}/test_py/kafka_worker.py +0 -0
- {pybaseutils-2.4.14 → pybaseutils-2.4.16}/test_py/men_tracemalloc.py +0 -0
- {pybaseutils-2.4.14 → pybaseutils-2.4.16}/test_py/milvus_demo/__init__.py +0 -0
- {pybaseutils-2.4.14 → pybaseutils-2.4.16}/test_py/milvus_demo/demo01.py +0 -0
- {pybaseutils-2.4.14 → pybaseutils-2.4.16}/test_py/milvus_demo/demo02.py +0 -0
- {pybaseutils-2.4.14 → pybaseutils-2.4.16}/test_py/milvus_demo/hello_milvus.py +0 -0
- {pybaseutils-2.4.14 → pybaseutils-2.4.16}/test_py/milvus_demo/milvus_client.py +0 -0
- {pybaseutils-2.4.14 → pybaseutils-2.4.16}/test_py/model_process.py +0 -0
- {pybaseutils-2.4.14 → pybaseutils-2.4.16}/test_py/performance.py +0 -0
- {pybaseutils-2.4.14 → pybaseutils-2.4.16}/test_py/pose/__init__.py +0 -0
- {pybaseutils-2.4.14 → pybaseutils-2.4.16}/test_py/pose/human_pose.py +0 -0
- {pybaseutils-2.4.14 → pybaseutils-2.4.16}/test_py/qrcode/__init__.py +0 -0
- {pybaseutils-2.4.14 → pybaseutils-2.4.16}/test_py/qrcode/demo.py +0 -0
- {pybaseutils-2.4.14 → pybaseutils-2.4.16}/test_py/redis_py/__init__.py +0 -0
- {pybaseutils-2.4.14 → pybaseutils-2.4.16}/test_py/redis_py/knn_search.py +0 -0
- {pybaseutils-2.4.14 → pybaseutils-2.4.16}/test_py/redis_py/redis_client.py +0 -0
- {pybaseutils-2.4.14 → pybaseutils-2.4.16}/test_py/registry/__init__.py +0 -0
- {pybaseutils-2.4.14 → pybaseutils-2.4.16}/test_py/registry/base.py +0 -0
- {pybaseutils-2.4.14 → pybaseutils-2.4.16}/test_py/registry/component.py +0 -0
- {pybaseutils-2.4.14 → pybaseutils-2.4.16}/test_py/registry/main.py +0 -0
- {pybaseutils-2.4.14 → pybaseutils-2.4.16}/test_py/registry/register.py +0 -0
- {pybaseutils-2.4.14 → pybaseutils-2.4.16}/test_py/single_class/GRU.py +0 -0
- {pybaseutils-2.4.14 → pybaseutils-2.4.16}/test_py/single_class/TCN.py +0 -0
- {pybaseutils-2.4.14 → pybaseutils-2.4.16}/test_py/single_class/__init__.py +0 -0
- {pybaseutils-2.4.14 → pybaseutils-2.4.16}/test_py/single_class/demo.py +0 -0
- {pybaseutils-2.4.14 → pybaseutils-2.4.16}/test_py/slowfastnet.py +0 -0
- {pybaseutils-2.4.14 → pybaseutils-2.4.16}/test_py/test_camera.py +0 -0
- {pybaseutils-2.4.14 → pybaseutils-2.4.16}/test_py/test_fr/__init__.py +0 -0
- {pybaseutils-2.4.14 → pybaseutils-2.4.16}/test_py/test_fr/demo11.py +0 -0
- {pybaseutils-2.4.14 → pybaseutils-2.4.16}/test_py/test_fr/idcardocr.py +0 -0
- {pybaseutils-2.4.14 → pybaseutils-2.4.16}/test_py/web_socket/__init__.py +0 -0
- {pybaseutils-2.4.14 → pybaseutils-2.4.16}/test_py/web_socket/asr_clients.py +0 -0
- {pybaseutils-2.4.14 → pybaseutils-2.4.16}/test_py/web_socket/asr_service.py +0 -0
- {pybaseutils-2.4.14 → pybaseutils-2.4.16}/test_py/web_socket/chat_service.py +0 -0
|
@@ -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
|
-
|
|
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
|
|
|
@@ -0,0 +1,194 @@
|
|
|
1
|
+
import cv2
|
|
2
|
+
import time
|
|
3
|
+
import numpy as np
|
|
4
|
+
import subprocess
|
|
5
|
+
import json
|
|
6
|
+
import numbers
|
|
7
|
+
|
|
8
|
+
import cv2
|
|
9
|
+
import subprocess
|
|
10
|
+
import json
|
|
11
|
+
|
|
12
|
+
import cv2
|
|
13
|
+
import subprocess
|
|
14
|
+
import json
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
def get_video_size(video, size=()):
|
|
18
|
+
"""
|
|
19
|
+
获取视频设备或文件的分辨率
|
|
20
|
+
Args:
|
|
21
|
+
video: 视频设备路径/索引 或 视频文件路径
|
|
22
|
+
size: 要设置的摄像头分辨率 (宽, 高),仅对摄像头设备有效
|
|
23
|
+
|
|
24
|
+
Returns:
|
|
25
|
+
tuple: (width, height) 或 (None, None)
|
|
26
|
+
"""
|
|
27
|
+
if isinstance(video, int):
|
|
28
|
+
video = f"/dev/video{video}"
|
|
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
|
|
77
|
+
|
|
78
|
+
|
|
79
|
+
class CameraCapture(object):
|
|
80
|
+
def __init__(self, video: str or int = 0, fps=30, size=(1920, 1080), scale=1.0):
|
|
81
|
+
"""
|
|
82
|
+
查询视频设备分辨率: ffmpeg -f v4l2 -list_formats all -i /dev/video0
|
|
83
|
+
常见的视频分辨率 : 1920x1080 1280x720 640x480 352x288 320x240 176x144 160x120
|
|
84
|
+
:param video: 视频设备路径或索引(如 0 或 "/dev/video0")
|
|
85
|
+
:param fps: 视频帧率
|
|
86
|
+
:param size: 视频分辨率 (宽, 高),(1280,720),(1920,1080)
|
|
87
|
+
:param scale: 视频缩放比例
|
|
88
|
+
"""
|
|
89
|
+
self.fps = fps
|
|
90
|
+
self.stopped = False
|
|
91
|
+
self.ssize = get_video_size(video, size=size)
|
|
92
|
+
self.dsize = self.ssize
|
|
93
|
+
if isinstance(video, int): # TODO 摄像头
|
|
94
|
+
video = f"/dev/video{video}"
|
|
95
|
+
self.video_size = f"{self.ssize[0]}x{self.ssize[1]}" # 视频文件没有这个参数
|
|
96
|
+
else: # TODO 视频文件
|
|
97
|
+
self.video_size = None
|
|
98
|
+
if size:
|
|
99
|
+
self.dsize = (int(size[0] * scale), int(size[1] * scale))
|
|
100
|
+
else:
|
|
101
|
+
self.dsize = (int(self.dsize[0] * scale), int(self.dsize[1] * scale))
|
|
102
|
+
vf = f'scale={self.dsize[0]}:{self.dsize[1]}'
|
|
103
|
+
# TODO FFmpeg 命令
|
|
104
|
+
# -re: 以原生帧率读取(模拟直播流)
|
|
105
|
+
# -fflags nobuffer: 关键!禁用缓冲区
|
|
106
|
+
# -flags low_delay: 关键!低延迟模式
|
|
107
|
+
# -probesize 32: 减小探测包大小,加快启动
|
|
108
|
+
# -pix_fmt bgr24: 直接输出 BGR 格式,方便 OpenCV/Numpy 使用,避免后续转换
|
|
109
|
+
if self.video_size: # TODO 如果是摄像头
|
|
110
|
+
command = [
|
|
111
|
+
'ffmpeg',
|
|
112
|
+
'-re', # 按帧率读取
|
|
113
|
+
'-fflags', 'nobuffer', # 无缓冲
|
|
114
|
+
'-flags', 'low_delay', # 低延迟
|
|
115
|
+
'-probesize', '32', # 快速探测
|
|
116
|
+
'-video_size', f"{self.ssize[0]}x{self.ssize[1]}", # 视频分辨率
|
|
117
|
+
'-i', video, # 输入设备
|
|
118
|
+
'-f', 'rawvideo', # 输出原始视频流
|
|
119
|
+
'-pix_fmt', 'bgr24', # 像素格式 BGR
|
|
120
|
+
'-vf', vf, # 分辨率
|
|
121
|
+
'-r', str(fps), # 帧率
|
|
122
|
+
'-' # 输出到 stdout
|
|
123
|
+
]
|
|
124
|
+
else:
|
|
125
|
+
command = [
|
|
126
|
+
'ffmpeg',
|
|
127
|
+
'-re', # 按帧率读取
|
|
128
|
+
'-fflags', 'nobuffer', # 无缓冲
|
|
129
|
+
'-flags', 'low_delay', # 低延迟
|
|
130
|
+
'-probesize', '32', # 快速探测
|
|
131
|
+
'-i', video, # 输入设备
|
|
132
|
+
'-f', 'rawvideo', # 输出原始视频流
|
|
133
|
+
'-pix_fmt', 'bgr24', # 像素格式 BGR
|
|
134
|
+
'-vf', vf, # 分辨率
|
|
135
|
+
'-r', str(fps), # 帧率
|
|
136
|
+
'-' # 输出到 stdout
|
|
137
|
+
]
|
|
138
|
+
# 启动进程
|
|
139
|
+
print(f"command: {' '.join(command)}")
|
|
140
|
+
self.pipe = subprocess.Popen(command, stdout=subprocess.PIPE, bufsize=10 ** 8)
|
|
141
|
+
|
|
142
|
+
def read(self):
|
|
143
|
+
if self.stopped:
|
|
144
|
+
self.stop()
|
|
145
|
+
return False, None
|
|
146
|
+
# 读取一帧的数据量 (宽 * 高 * 3通道)
|
|
147
|
+
buf = self.pipe.stdout.read(self.dsize[0] * self.dsize[1] * 3)
|
|
148
|
+
if len(buf) != self.dsize[0] * self.dsize[1] * 3:
|
|
149
|
+
self.stop()
|
|
150
|
+
return False, None # 读取失败或结束
|
|
151
|
+
# TODO 将字节流转换为numpy数组图像(bgr)
|
|
152
|
+
bgr = np.frombuffer(buf, dtype=np.uint8).reshape((self.dsize[1], self.dsize[0], 3))
|
|
153
|
+
return True, bgr
|
|
154
|
+
|
|
155
|
+
def release(self):
|
|
156
|
+
self.stop()
|
|
157
|
+
|
|
158
|
+
def stop(self):
|
|
159
|
+
self.stopped = True
|
|
160
|
+
time.sleep(0.1)
|
|
161
|
+
self.pipe.terminate() # 终止进程
|
|
162
|
+
try:
|
|
163
|
+
outs, errs = self.pipe.communicate(timeout=2)
|
|
164
|
+
except subprocess.TimeoutExpired as err:
|
|
165
|
+
# 如果 communicate 也超时(极少见),强制杀死
|
|
166
|
+
self.pipe.kill()
|
|
167
|
+
self.pipe.communicate() # 再次尝试清理
|
|
168
|
+
print(err)
|
|
169
|
+
|
|
170
|
+
def display(self, title="camera", delay=30):
|
|
171
|
+
while True:
|
|
172
|
+
t1 = time.time()
|
|
173
|
+
ret, frame = self.read()
|
|
174
|
+
t2 = time.time()
|
|
175
|
+
if not ret:
|
|
176
|
+
break
|
|
177
|
+
t21 = (t2 - t1) * 1000
|
|
178
|
+
print(f"image shape: {frame.shape},耗时: {t21:.3f}ms")
|
|
179
|
+
cv2.namedWindow(title, flags=cv2.WINDOW_NORMAL)
|
|
180
|
+
cv2.imshow(title, frame)
|
|
181
|
+
cv2.waitKey(delay)
|
|
182
|
+
|
|
183
|
+
|
|
184
|
+
if __name__ == '__main__':
|
|
185
|
+
from pybaseutils.cvutils import video_utils
|
|
186
|
+
|
|
187
|
+
fps = 10
|
|
188
|
+
video = video_utils.get_usb_camera()
|
|
189
|
+
# video = "/home/PKing/Videos/video1.mp4" # Windows 下可能是 0 或 "video=Integrated Webcam"
|
|
190
|
+
# video = "../../data/video/kunkun_cut.mp4" # Windows 下可能是 0 或 "video=Integrated Webcam"
|
|
191
|
+
# cap = CameraCapture(video=video, size=(), scale=1.0, fps=fps)
|
|
192
|
+
cap = CameraCapture(video=video, size=(1920, 1080), scale=1.0, fps=fps)
|
|
193
|
+
# cap = CameraCapture(video=video, size=(), scale=2,fps=fps)
|
|
194
|
+
cap.display()
|
|
@@ -1,112 +0,0 @@
|
|
|
1
|
-
import cv2
|
|
2
|
-
import time
|
|
3
|
-
import numpy as np
|
|
4
|
-
import subprocess
|
|
5
|
-
import json
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
def get_video_size(video):
|
|
9
|
-
"""获取视频原始分辨率"""
|
|
10
|
-
cmd = ['ffprobe', '-v', 'quiet', '-print_format', 'json', '-show_streams', video]
|
|
11
|
-
result = subprocess.check_output(cmd).decode()
|
|
12
|
-
info = json.loads(result)
|
|
13
|
-
for stream in info['streams']:
|
|
14
|
-
if stream['codec_type'] == 'video':
|
|
15
|
-
return stream['width'], stream['height']
|
|
16
|
-
return None, None
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
class CameraCapture(object):
|
|
20
|
-
def __init__(self, video: str or int = 0, fps=30, size=(1920, 1080), scale=1.0, pad=False):
|
|
21
|
-
"""
|
|
22
|
-
:param video: 视频设备路径或索引(如 0 或 "/dev/video0")
|
|
23
|
-
:param fps: 视频帧率
|
|
24
|
-
:param size: 视频分辨率 (宽, 高),(1280,720),(1920,1080)
|
|
25
|
-
:param scale: 视频缩放比例
|
|
26
|
-
:param pad: 是否保持原始视频比例并填充到指定分辨率
|
|
27
|
-
"""
|
|
28
|
-
self.fps = fps
|
|
29
|
-
self.stopped = False
|
|
30
|
-
if isinstance(video, int): video = f"/dev/video{video}"
|
|
31
|
-
self.dsize = size
|
|
32
|
-
self.ssize = get_video_size(video)
|
|
33
|
-
if size and pad:
|
|
34
|
-
vf = f'scale={self.dsize[0]}:{self.dsize[1]}:force_original_aspect_ratio=decrease,pad={self.dsize[0]}:{self.dsize[1]}:(ow-iw)/2:(oh-ih)/2'
|
|
35
|
-
elif size:
|
|
36
|
-
vf = f'scale={self.dsize[0]}:{self.dsize[1]}'
|
|
37
|
-
else:
|
|
38
|
-
vf = f'scale=trunc(iw*{scale}):trunc(ih*{scale})'
|
|
39
|
-
self.dsize = (int(self.ssize[0] * scale), int(self.ssize[1] * scale))
|
|
40
|
-
# TODO FFmpeg 命令
|
|
41
|
-
# -re: 以原生帧率读取(模拟直播流)
|
|
42
|
-
# -fflags nobuffer: 关键!禁用缓冲区
|
|
43
|
-
# -flags low_delay: 关键!低延迟模式
|
|
44
|
-
# -probesize 32: 减小探测包大小,加快启动
|
|
45
|
-
# -pix_fmt bgr24: 直接输出 BGR 格式,方便 OpenCV/Numpy 使用,避免后续转换
|
|
46
|
-
command = [
|
|
47
|
-
'ffmpeg',
|
|
48
|
-
'-re', # 按帧率读取
|
|
49
|
-
'-fflags', 'nobuffer', # 无缓冲
|
|
50
|
-
'-flags', 'low_delay', # 低延迟
|
|
51
|
-
'-probesize', '32', # 快速探测
|
|
52
|
-
'-i', video, # 输入设备
|
|
53
|
-
'-f', 'rawvideo', # 输出原始视频流
|
|
54
|
-
'-pix_fmt', 'bgr24', # 像素格式 BGR (OpenCV 格式)
|
|
55
|
-
'-vf', vf, # 分辨率
|
|
56
|
-
'-r', str(fps), # 帧率
|
|
57
|
-
'-' # 输出到 stdout
|
|
58
|
-
]
|
|
59
|
-
# 启动进程
|
|
60
|
-
print(f"command: {' '.join(command)}")
|
|
61
|
-
self.pipe = subprocess.Popen(command, stdout=subprocess.PIPE, bufsize=10 ** 8)
|
|
62
|
-
|
|
63
|
-
def read(self):
|
|
64
|
-
if self.stopped:
|
|
65
|
-
self.stop()
|
|
66
|
-
return False, None
|
|
67
|
-
# 读取一帧的数据量 (宽 * 高 * 3通道)
|
|
68
|
-
buf = self.pipe.stdout.read(self.dsize[0] * self.dsize[1] * 3)
|
|
69
|
-
if len(buf) != self.dsize[0] * self.dsize[1] * 3:
|
|
70
|
-
self.stop()
|
|
71
|
-
return False, None # 读取失败或结束
|
|
72
|
-
# TODO 将字节流转换为numpy数组图像(bgr)
|
|
73
|
-
bgr = np.frombuffer(buf, dtype=np.uint8).reshape((self.dsize[1], self.dsize[0], 3))
|
|
74
|
-
return True, bgr
|
|
75
|
-
|
|
76
|
-
def release(self):
|
|
77
|
-
self.stop()
|
|
78
|
-
|
|
79
|
-
def stop(self):
|
|
80
|
-
self.stopped = True
|
|
81
|
-
time.sleep(0.1)
|
|
82
|
-
self.pipe.terminate() # 终止进程
|
|
83
|
-
try:
|
|
84
|
-
outs, errs = self.pipe.communicate(timeout=2)
|
|
85
|
-
except subprocess.TimeoutExpired as err:
|
|
86
|
-
# 如果 communicate 也超时(极少见),强制杀死
|
|
87
|
-
self.pipe.kill()
|
|
88
|
-
self.pipe.communicate() # 再次尝试清理
|
|
89
|
-
print(err)
|
|
90
|
-
|
|
91
|
-
def display(self, title="camera", delay=30):
|
|
92
|
-
while True:
|
|
93
|
-
t1 = time.time()
|
|
94
|
-
ret, frame = self.read()
|
|
95
|
-
t2 = time.time()
|
|
96
|
-
if not ret:
|
|
97
|
-
break
|
|
98
|
-
t21 = (t2 - t1) * 1000
|
|
99
|
-
print(f"image shape: {frame.shape},耗时: {t21:.3f}ms")
|
|
100
|
-
cv2.namedWindow(title, flags=cv2.WINDOW_NORMAL)
|
|
101
|
-
cv2.imshow(title, frame)
|
|
102
|
-
cv2.waitKey(delay)
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
if __name__ == '__main__':
|
|
106
|
-
fps = 10
|
|
107
|
-
# video = 0 # Windows 下可能是 0 或 "video=Integrated Webcam"
|
|
108
|
-
video = "/home/PKing/Videos/video1.mp4" # Windows 下可能是 0 或 "video=Integrated Webcam"
|
|
109
|
-
video = "/home/PKing/Videos/demo-src.mp4" # Windows 下可能是 0 或 "video=Integrated Webcam"
|
|
110
|
-
cap = CameraCapture(video=video, size=(640, 640), scale=0.5, pad=True, fps=fps)
|
|
111
|
-
# cap = CameraCapture(video=video, size=(), scale=0.5, fps=fps)
|
|
112
|
-
cap.display()
|
|
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
|