Exemple #1
0
def takePicture_opencv(personGroupId, delay, typee):
    if (ClassUtils.isWindows() or ClassUtils.isDarwin()):
        picturepath = ClassCV.show_opencv(typee, mirror=True)
        return picturepath
    else:
        print('若系統為樹莓派,則需設定 camera 為 CSIcamera 無法以 webcam 作為影像來源。')
        return None
Exemple #2
0
def show_opencv(typee, mirror=False):
    ''' 顯示主畫面 '''
    import cv2
    import numpy as np
    config = ClassUtils.loadConfig()

    cam = cv2.VideoCapture(config['videoid'])
    cam.set(3, 1280)  # 修改解析度 寬
    cam.set(4, 1280 // 16 * 9)  # 修改解析度 高
    print('WIDTH', cam.get(3), 'HEIGHT', cam.get(4))  # 顯示預設的解析度
    while True:
        ret_val, img = cam.read()

        # Add for face detection, ottowei , 2019011701
        gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
        # Load the Haar cascade file
        face_cascade = cv2.CascadeClassifier(
            'haar_cascade_files/haarcascade_frontalface_default.xml')
        # Run the face detector on the grayscale image
        face_rects = face_cascade.detectMultiScale(gray, 1.3, 5)

        # Draw a rectangle around the face
        for (x, y, w, h) in face_rects:
            cv2.rectangle(img, (x, y), (x + w, y + h), (255, 0, 0), 3)

        if mirror:
            img = cv2.flip(img, 1)

        H, W = img.shape[:2]
        #imS = cv2.resize(img, (W, H))

        cv2_im = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)  # cv2和PIL中颜色的hex码的储存顺序不同
        pil_im = Image.fromarray(cv2_im)
        draw = ImageDraw.Draw(pil_im)  # 括号中为需要打印的canvas,这里就是在图片上直接打印

        ttf = ClassUtils.getSystemFont()

        font = ImageFont.truetype(ttf, 40, encoding="utf-8")
        hintfont = ImageFont.truetype(ttf, 24, encoding="utf-8")

        title = config['title'] + ""
        w, h = draw.textsize(title, font=font)
        draw.rectangle(((W / 2 - w / 2 - 5, 0), (W / 2 + w / 2 + 5, h + 20)),
                       fill="black")
        titlelocation = (W / 2 - w / 2, 5)
        #textlocation = (0,0)
        draw.text(titlelocation, title, (0, 255, 255),
                  font=font)  # 第一个参数为打印的坐标,第二个为打印的文本,第三个为字体颜色,第四个为字体
        # FreeAPIKEY: b9160fbd882f47bd821205a4bce64354
        if config['api_key'] == 'b9160fbd882f47bd821205a4bce64354':
            warningfont = ImageFont.truetype(ttf, 24, encoding="utf-8")
            warning = "請注意,您目前是用的是共用的測試 API_KEY 請儘速自行申請一個自用的 KEY"
            w, h = draw.textsize(warning, font=warningfont)
            draw.rectangle(
                ((W / 2 - w / 2 - 5, H - h * 2), (W / 2 + w / 2 + 5, H - h)),
                fill="yellow")
            warninglocation = (W / 2 - w / 2, H - h * 2)
            draw.text(
                warninglocation, warning, (0, 0, 255),
                font=warningfont)  # 第一个参数为打印的坐标,第二个为打印的文本,第三个为字体颜色,第四个为字体

        if typee == 'Identify':
            hint = "Please Press [ENTER] to Identify"
        elif typee == 'Train':
            hint = "Please Press [ENTER] to take triple photos"
        else:
            hint = "Please Press [ENTER] to continue"
        w, h = draw.textsize(hint, font=hintfont)
        draw.rectangle(((W / 2 - w / 2 - 5, H - h), (W / 2 + w / 2 + 5, H)),
                       fill="red")
        hintlocation = (W / 2 - w / 2, H - h)
        #textlocation = (0,0)
        draw.text(hintlocation, hint, (0, 255, 255),
                  font=hintfont)  # 第一个参数为打印的坐标,第二个为打印的文本,第三个为字体颜色,第四个为字体

        cv2_text_im = cv2.cvtColor(np.array(pil_im), cv2.COLOR_RGB2BGR)

        if ClassUtils.isWindows():
            cv2.namedWindow("window", cv2.WND_PROP_FULLSCREEN)
            cv2.setWindowProperty("window", cv2.WND_PROP_FULLSCREEN,
                                  cv2.WINDOW_FULLSCREEN)

        cv2.imshow("window", cv2_text_im)
        #cv2.imshow("window", img)

        key = cv2.waitKey(1)
        if key == ord(' ') or key == 3 or key == 13:  # space or enter
            picturepath = ClassUtils.getTakePicturePath(
                config['personGroupId'])
            cv2.imwrite(picturepath, img)
            cv2.destroyAllWindows()
            cv2.VideoCapture(config['videoid']).release()
            return picturepath
        elif key == 27:  # esc to quit
            cv2.destroyAllWindows()
            cv2.VideoCapture(config['videoid']).release()
            raise MyException.esc_opencv("偵測到 esc 結束鏡頭")
        else:
            if key != -1:
                print('key=', key)