web-dev-qa-db-ja.com

python cv2ビデオ解像度

私はこの方法でビデオの解像度を(mp4で)(800x600に)変更しようとします。

import cv2
cap = cv2.VideoCapture('file')
while(cap.isOpened()):
    cv2.waitKey(10)

    ret, frame = cap.read()
    cap.set(3, 800)
    cap.set(4, 600)

    gray = cv2.cvtColor(frame, cv2.COLOR_BGR2BGRA) 
    print cap.get(3) # return default 1280       

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

cap.release()
cv2.destroyAllWindows()

私は何を間違っていますか?

私は試した -

cv2.resizeWindow("ssss", 300, 300), 

そして

cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 600)
cap.set(cv2.CAP_PROP_FRAME_WIDTH, 800)

無効 !

6
TheRutubeify
import cv2
cap = cv2.VideoCapture(0)
while(cap.isOpened()):
    cv2.waitKey(10)

    ret, frame = cap.read()
    cap.set(3, 800)
    cap.set(4, 600)

    gray = cv2.cvtColor(frame, cv2.COLOR_BGR2BGRA) 
    print cap.get(3) # return default 1280       

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

cap.release()
cv2.destroyAllWindows()

これはあなたのコードがファイルではなくウェブカメラで動作します

ビデオファイルの場合、ウィンドウのサイズを変更できます

cv2.resizeWindow(winname, width, height) 

そのため、最初にウィンドウを名前で定義し、サイズを変更します

  cv2.namedWindow("frame", 0);
  cv2.resizeWindow("frame", 800,600);

詳細サイズ変更ウィンドウの場合

6
Kallz

あなたのコードには注意が必要なことがいくつかあると思います。

  1. OpenCVドキュメント for VideoCaptureで説明されているように、デフォルトのWebCamにアクセスする場合は、次のようにクラスを初期化する必要があります。

    cap = cv2.VideoCapture('file')
    

    次にカメラの解像度を変更しようとしている場合は、2つのset行をcapの初期化のすぐ下に移動し、一度だけ実行することをお勧めします-読むたびに枠の中。定数を使用して適切な属性にアクセスすることもできます。

    cap = cv2.VideoCapture('file')
    cap.set(cv2.CAP_PROP_FRAME_WIDTH, width)
    cap.set(cv2.CAP_PROP_FRAME_HEIGHT, height)
    
    # Your while loop and the rest of the code...
    
  2. ファイルからフレームを読み取ろうとしていて、その解像度を変更したい場合は、おそらくresizeメソッドを使用することをお勧めします here 。これは、フレームを読み取った直後に、ループ内で行う必要があります。それは次のようなものかもしれません:

    resize(ret, ret, Size(800, 600), 0, 0, INTER_CUBIC); 
    

これがお役に立てば幸いです。

2
m_____z

cap.set()は、_640,480_の解像度未満では効果がありません(少なくとも私のMacbook Proの場合)。解像度を上げることはできますが、たとえば_300,300_に設定しても効果はありません。私の経験として、あなたはresize()の後にフレームでread()を呼び出す必要がありました。

1
gustavz