oppuna
@oppuna

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

OpenCVを使ってUSBカメラで撮っている画像に四角を書いた画像と書く前の画像両方を保存したい

解決したいこと

USBカメラで表示している画像(OpenCVで四角を上書きしたもの)について
四角を上書きする前と上書きしたあとの画像の両方を保存したいですが同一の四角が上書きされた画像が保存されており、うまくできません
無限ループなので思ったタイミングで動いてないのでしょうか。。。。

  • OpenCVでUSBカメラの画像を表示させたい → できた
  • 表示している画像に四角を描画して表示する → できた
  • キーボードを押した時に画面に表示させている画像を保存する → できた
  • 四角を上書きする前と上書きしたあとの画像の両方を保存 → できてない

環境

Windows 10
python 3.8.9
opencv-python 4.5.1.48

USBカメラ

Anker PowerConf C302

発生している問題・エラー

四角が上書きされた同一の画像2枚が保存されてしまう

該当するソースコード

import cv2
from datetime import datetime

cap = cv2.VideoCapture(1,cv2.CAP_DSHOW)

if cap.isOpened() == True:
    cap.set(cv2.CAP_PROP_FRAME_WIDTH, 2560/2)#1280
    cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 1440/2)#720
    cap.set(cv2.CAP_PROP_SETTINGS, 1)
    # 領域
    w = (430, 240)
    h = (850, 480)
    while True:
        # VideoCaptureから1フレーム読み込む、表示(をひたすらループ)
        ret, frame = cap.read()
        # 保存用の生画像
        image = frame # ここで元の画像を残したつもり
        # 四角を描画
        frame = cv2.rectangle(frame, w, h, (0, 255, 0), thickness=2)
        # 画面表示
        cv2.imshow('Raw Frame', frame)
        key = cv2.waitKey(1)
        # keyが(Space)だったらキャプチャする
        if key == 32:
            # ここのファイル保存1と2が同じ画像になっているのをなんとかしたい
            date = datetime.now().strftime("%Y%m%d_%H%M%S")
            path = "./" + date + "cap1.jpg"
            cv2.imwrite(path, image) # ファイル保存1
            path = "./" + date + "cap2.jpg"
            cv2.imwrite(path, frame) # ファイル保存2
        # key が27(ESC)だったらBreakする
        if key == 27:
            break
    # キャプチャをリリースして、ウィンドウをすべて閉じる
    cap.release()
    cv2.destroyAllWindows()
else:
    print("no camera")
    cap.release()
0

2Answer

以下部分が参照渡しになっているのが原因と考えられます。

# 保存用の生画像
image = frame # ここで元の画像を残したつもり

次のように書き換えることで生画像には四角が描画されなくなります。

# 保存用の生画像
image = frame.copy()
0Like

Comments

  1. @oppuna

    Questioner

    ご回答ありがとうございます

    参照渡しというのがあるのですね勉強になりました
    また、.copy()とすることで解決しました

Your answer might help someone💌