opencv-pythonからWebカメラのズームができないので切り取り、拡大で対応しました

はじめに

調べた限りではタイトルにある通りopencv-pythonからWebカメラをズームさせることはできないようです。

もし方法があればコメントで教えてくれたらうれしいです。

代わりの方法として画像の中心を切り取ってもとのサイズまで拡大することでなんちゃってズームを導入しました。

Pythonスクリプト

import cv2

cropscale = 0

w=1280
h=720
cap = cv2.VideoCapture(0)
cap.set(cv2.CAP_PROP_FOURCC, cv2.VideoWriter_fourcc('M', 'J', 'P', 'G'))
cap.set(cv2.CAP_PROP_FRAME_WIDTH, w)
cap.set(cv2.CAP_PROP_FRAME_HEIGHT, h)

while True:
    ret, frame = cap.read()
    
    if cropscale != 0:
        crop_h = 45 * cropscale
        crop_w = 80 * cropscale
        frame = cv2.resize(frame[crop_h:-crop_h, crop_w:-crop_w, :], dsize = (w, h))

    cv2.imshow('zoom_test', frame)   

    k = cv2.waitKey(1) & 0xFF
    if k == 27:
        break
    elif k == ord('w'):
        if cropscale < 4:
            cropscale += 1
    elif k == ord('s'):
        if cropscale > 0:
            cropscale -= 1

cap.release()
cv2.destroyAllWindows()

スクリプトの解説

Webカメラから解像度を指定して動画をキャプチャする

w=1280
h=720
cap = cv2.VideoCapture(0)
cap.set(cv2.CAP_PROP_FOURCC, cv2.VideoWriter_fourcc('M', 'J', 'P', 'G'))
cap.set(cv2.CAP_PROP_FRAME_WIDTH, w)
cap.set(cv2.CAP_PROP_FRAME_HEIGHT, h)

詳細はこちらを参照して下さい。

切り取って拡大する

if cropscale != 0:
    crop_h = 45 * cropscale
    crop_w = 80 * cropscale
    frame = cv2.resize(frame[crop_h:-crop_h, crop_w:-crop_w, :], dsize = (w, h))

キーボード入力でズームの程度を変更する

「w」でズームイン
「s」でズームアウト
「Esc」で終了

k = cv2.waitKey(1) & 0xFF
if k == 27:
    break
elif k == ord('w'):
    if cropscale < 4:
        cropscale += 1
elif k == ord('s'):
    if cropscale > 0:
        cropscale -= 1