OpenCVをインポートするpythonコードを使用してWebカメラから画像を取得しようとしています。コードは次のとおりです。
import sys
sys.path.append("C:\\opencv\\build\\python\\2.7")
import cv2
import cv2.cv as cv
import time
# Set resolution
cap = cv2.VideoCapture(0)
print "Frame default resolution: (" + str(cap.get(cv.CV_CAP_PROP_FRAME_WIDTH)) + "; " + str(cap.get(cv.CV_CAP_PROP_FRAME_HEIGHT)) + ")"
cap.set(cv.CV_CAP_PROP_FRAME_WIDTH, 800)
cap.set(cv.CV_CAP_PROP_FRAME_HEIGHT, 600)
print "Frame resolution set to: (" + str(cap.get(cv.CV_CAP_PROP_FRAME_WIDTH)) + "; " + str(cap.get(cv.CV_CAP_PROP_FRAME_HEIGHT)) + ")"
# Acquire frame
capture = cv.CreateCameraCapture(0)
img = cv.QueryFrame(capture)
カメラのデフォルト解像度が640x480であることを除いて、コードは正常に機能し、私のコードはそれより低い解像度値のみを設定できるようです。たとえば、画像サイズを320x240に設定できますが、800x600に変更できません。エラーは表示されません。解像度をデフォルト値(640x480)に設定します。これを高い値に設定しようとしています。
私が使用しているカメラ(他のWebカメラはコンピューターに接続されていません)はQuickCam V-UBK45です。Logitechが提供するソフトウェアを使用すると、フル解像度(1280x960)とすべての中間解像度(例:800x600)で写真を撮ることができます。
したがって、これらのフレームサイズはハードウェアでサポートされていますが、私のコードはそれらにアクセスできません。
誰か私にできることを知っていますか?
さまざまな解像度を使用して、画像の解像度を 一般的な解像度のリスト からループして設定しました
def set_res(cap, x,y):
cap.set(cv.CV_CAP_PROP_FRAME_WIDTH, int(x))
cap.set(cv.CV_CAP_PROP_FRAME_HEIGHT, int(y))
return str(cap.get(cv.CV_CAP_PROP_FRAME_WIDTH)),str(cap.get(cv.CV_CAP_PROP_FRAME_HEIGHT))
そして this は私が得たものです。
Cvまたは私のカメラでは特定の解像度しか使用できないようです。
160.0 x 120.0
176.0 x 144.0
320.0 x 240.0
352.0 x 288.0
640.0 x 480.0
1024.0 x 768.0
1280.0 x 1024.0
私はそれを動作させたので、この投稿は同じ問題を経験している他の人向けです:
Logicool C270でも実行しています。何らかの理由で、ウェブカメラが1280x720をサポートしていても、640x480しか表示されません。同じ問題が私のラップトップの内蔵Webカメラでも持続します。
コードで800x600に設定すると、640x480と表示されます。ただし、1024x768に設定すると800x600になります。そして、2000x2000のようなばかげた値に設定すると、1280x720になります。
これはOpenCV 3.0のC++にありますが、おそらくPythonにも適用されます。
上記の問題は、カメラのドライバーが原因です。 Direct Showをバックエンドとして使用して修正できました。私は(申し訳ありませんが、どこにいるかは覚えていません)、ほとんどすべてのカメラがDirectShowからの使用を可能にするドライバーを提供していることを読みました。そのため、WindowsでDirectShowを使用してカメラとやり取りし、希望どおりに解像度を構成して、カメラのネイティブアスペクト比(16:9)を取得することもできました。このコードを試して、これが機能するかどうかを確認できます。
import cv2
cam = cv2.VideoCapture(0,cv2.CAP_DSHOW)
cap.set(cv2.CAP_PROP_FRAME_WIDTH, 1280)
cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 720)
r, frame = cam.read()
...
print('Resolution: ' + str(frame.shape[0]) + ' x ' + str(frame.shape[1]))
OpenCVのドキュメントで、OpenCVバックエンドの詳細を知りたい人のために次の情報を見つけました( OpenCV docs )
これがお役に立てば幸いです。
Cv2の場合は、これに変更してください。
cap.set(cv2.CAP_PROP_FRAME_WIDTH, 800)
cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 600)
私はあなたと同じ問題を抱えていますが、opencv
異なる「アプリケーション」でより高い解像度を取得できません。しかし、Logicoolソフトウェアを使用すると、720p(カメラC270)でビデオを録画できます。数日間の調査の後、私は@breakと同じ説明に行き、ドライバーの解像度を制限しました。私はそれをあきらめ、Logitech以外の別の1つを購入します...