web-dev-qa-db-ja.com

Python:OpenCVを使用してクリック時にWebカメラから画像をキャプチャする方法

OpenCVを使用して、Webカメラから多数の画像をキャプチャして保存したい。これは現在私のコードです:

import cv2

camera = cv2.VideoCapture(0)
for i in range(10):
    return_value, image = camera.read()
    cv2.imwrite('opencv'+str(i)+'.png', image)
del(camera)

これに伴う問題は、画像がいつ撮影されているかわからないため、多くの画像がぼやけてしまうことです。私の質問は次のとおりです。キーボードのキーをクリックして画像を取得する方法はありますか?

また、範囲の代わりに複数の画像を撮るより良い方法はありますか?

17
user5673516

カメラフィードをcv2.namedWindowで表示し、SPACEを押すとスナップショットを撮る簡単なプログラムを次に示します。 ESCを押すと終了します。

import cv2

cam = cv2.VideoCapture(0)

cv2.namedWindow("test")

img_counter = 0

while True:
    ret, frame = cam.read()
    cv2.imshow("test", frame)
    if not ret:
        break
    k = cv2.waitKey(1)

    if k%256 == 27:
        # ESC pressed
        print("Escape hit, closing...")
        break
    Elif k%256 == 32:
        # SPACE pressed
        img_name = "opencv_frame_{}.png".format(img_counter)
        cv2.imwrite(img_name, frame)
        print("{} written!".format(img_name))
        img_counter += 1

cam.release()

cv2.destroyAllWindows()

ほとんどの場合、これで質問の答えになると思います。あなたが理解していない行がある場合はお知らせください。コメントを追加します。

SPACEキーを押すごとに複数の画像を取得する必要がある場合は、内部ループが必要になるか、特定の数の画像を取得する関数を作成するだけです。

キーイベントはcv2.namedWindowからのものであるため、フォーカスが必要であることに注意してください。

37
derricw

私はCVを開いた経験があまりありませんが、キーが押されたときにforループのコードを呼び出す場合は、whileループとraw_inputと条件を使用して、ループが永久に実行されないようにすることができます

import cv2

camera = cv2.VideoCapture(0)
i = 0
while i < 10:
    raw_input('Press Enter to capture')
    return_value, image = camera.read()
    cv2.imwrite('opencv'+str(i)+'.png', image)
    i += 1
del(camera)
2
danidee

コード例を分解する

import cv2

使用のためにopenCVをインポートします

camera = cv2.VideoCapture(0)

コンピュータに接続されているカメラのリストの最初のカメラを使用して、openCVビデオキャプチャタイプのカメラと呼ばれるオブジェクトを作成します。

for i in range(10):

次のインデントされたコードを10回ループするようプログラムに指示します

    return_value, image = camera.read()

readメソッドを使用して、カメラオブジェクトから値を読み取ります。 2つの値で共鳴し、2つのデータ値を「return_value」と「image」という2つの一時変数に保存します

    cv2.imwrite('opencv'+str(i)+'.png', image)

openCVメソッドimwrite(ディスクにイメージを書き込む)を使用し、一時データ変数のデータを使用してイメージを書き込みます

インデントが少ないということは、ループが終了したことを意味します...

del(camera)

camreaオブジェクトを削除します。もう必要ありません。

あなたは多くの方法であなたが要求することができます、1つはforループをwhileループに置き換えて(10回の代わりに永久に実行します)、そしてキープレスを待つことができます( danidee 入力中)

または、誰かがキーボードを押すたびに背景に隠れて画像をキャプチャする、はるかに邪悪なサービスを作成します。

2
Henrik

これは、ラップトップのデフォルトカメラを使用して画像をキャプチャする簡単なプログラムです。これがすべての人にとって非常に簡単な方法になることを願っています。

import cv2

# 1.creating a video object
video = cv2.VideoCapture(0) 
# 2. Variable
a = 0
# 3. While loop
while True:
    a = a + 1
    # 4.Create a frame object
    check, frame = video.read()
    # Converting to grayscale
    #gray = cv2.cvtColor(frame,cv2.COLOR_BGR2GRAY)
    # 5.show the frame!
    cv2.imshow("Capturing",frame)
    # 6.for playing 
    key = cv2.waitKey(1)
    if key == ord('q'):
        break
# 7. image saving
showPic = cv2.imwrite("filename.jpg",frame)
print(showPic)
# 8. shutdown the camera
video.release()
cv2.destroyAllWindows 

あなたは私のgithubコードを見ることができます こちら

0