import os

# 设置NCNN的环境变量
os.environ["NCNN_HOME"] = os.getcwd()

import sys
import cv2
import time
import numpy as np
import ncnn
# 导入ncnn的模型库
from ncnn.model_zoo import get_model
# 导入工具函数
from utils import print_topk

# 打开默认的摄像头设备
cap = cv2.VideoCapture(0)
# 设置摄像头的分辨率为320x240
cap.set(cv2.CAP_PROP_FRAME_WIDTH, 320)
cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 240)
# 设置摄像头的缓冲区大小为1，这样可以减少延迟
cap.set(cv2.CAP_PROP_BUFFERSIZE, 1)

# 创建一个名为'image'的全屏窗口
cv2.namedWindow('image',cv2.WND_PROP_FULLSCREEN)    #Set the windows to be full screen.
cv2.setWindowProperty('image', cv2.WND_PROP_FULLSCREEN, cv2.WINDOW_FULLSCREEN)    #Set the windows to be full screen.

# 从模型库中获取ShuffleNetV2模型，使用4个线程进行推理
net = get_model("shufflenetv2", num_threads=4, use_gpu=False)

# 主循环
while cap.isOpened():
    # 从摄像头中读取一帧
    success, image = cap.read()
    # 如果读取失败，则忽略这一帧
    if not success:
        print("Ignoring empty camera frame.")
        # If loading a video, use 'break' instead of 'continue'.
        continue

    # 使用ShuffleNetV2模型对图像进行分类，得到每个类别的分数
    cls_scores = net(image)

    # 在图像上打印出前三个最可能的类别
    image = print_topk(cls_scores, 3, image)

    # 将图像逆时针旋转90度
    image = cv2.rotate(image, cv2.ROTATE_90_COUNTERCLOCKWISE)
    # 显示图像
    cv2.imshow('image', image)
    # 如果按下了'ESC'键，则退出循环
    if cv2.waitKey(5) & 0xFF == 27:
        break
# 释放摄像头设备
cap.release()
