经过优化后,稳定在60ms,不卡顿

import cv2
from ultralytics import solutions
import torch # ✅ 必须在文件顶部 新增导入torch!!!
import gc    # ✅ 必须在文件顶部 新增导入gc!!!

def open_iphone_camera_with_cv():
    """
    主函数:找到并打开iPhone摄像头
    """
    print("正在检测iPhone摄像头...\n")
        
        # for i in range(5):
    cap = cv2.VideoCapture(0)
    if cap.isOpened():
        print("打开默认摄像头 (索引0)")
        # 强制开启硬件加速解码(M1 Metal)
        cap.set(cv2.CAP_PROP_HW_ACCELERATION, cv2.VIDEO_ACCELERATION_ANY)
        # 开启帧缓冲区优化,降低延迟
        cap.set(cv2.CAP_PROP_BUFFERSIZE, 1)
        cap.set(cv2.CAP_PROP_FRAME_WIDTH, 640)
        cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 480)
        region_points = [(20, 400), (1080, 400), (1080, 360), (20, 360)]
        # w, h, fps = (int(cap.get(x)) for x in (cv2.CAP_PROP_FRAME_WIDTH, cv2.CAP_PROP_FRAME_HEIGHT, cv2.CAP_PROP_FPS))
        # video_writer = cv2.VideoWriter("object_counting_output.avi", cv2.VideoWriter_fourcc(*"mp4v"), fps, (w, h))
        counter = solutions.ObjectCounter(
            show=False,  # display the output
            region=region_points,  # pass region points
            model="yolo26x.pt",  # model="yolo26n-obb.pt" for object counting with OBB model.
            device="mps",
            half=False,
            conf=0.3,            # 置信度调高一点,减少无效检测,加速推理
            iou=0.45,             # NMS IOU阈值
            max_det=50,        # 每张图像的最大检测数量
            verbose=True,       # 是否打印详细信息
            # save_results=True,   # 是否保存结果到文件
            # classes=[0, 2],  # count specific classes, e.g., person and car with the COCO pretrained model.
            tracker="botsort.yaml",  # choose trackers, e.g., "bytetrack.yaml"
        )

        while True:
            ret, frame = cap.read()
            if ret:
                frame_corrected = cv2.flip(frame, 1)

                results = counter(frame_corrected)

                # 显存+内存清理,根治耗时上涨
                try:
                    torch.mps.empty_cache()
                except Exception:
                    pass
                gc.collect()

                cv2.imshow(f'Camera M2 Pro | 推理≈13ms 跟踪≈9ms | 按q退出', results.plot_im)

            if cv2.waitKey(1) & 0xFF == ord('q'):
                break

        cv2.destroyAllWindows()
        cap.release()
        print("摄像头已关闭")
    else:
        print("无法打开摄像头,请检查连接。")

# 运行
if __name__ == "__main__":
    # 方法1:自动检测并打开iPhone摄像头
    open_iphone_camera_with_cv()

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐