いつもお世話になっています。
前提・実現したいこと
PCにつないだカメラの映像からリアルタイムで手振れを除去しようとしています。
Qiitaの記事に私の望むもののベースとなるものがありました。
以下のソースコードもこちらから参考にしたものを使っています。
そのまま実行してみると、引数の数が足りてないと警告を出したので、
こちらから関数(cv2.findTransformECC)の確認を行い、都度修正を行いました。
しかし、inputMaskの意味が理解できず、躓いてしまいました。
こちらのページに書いてある通り、inputMaskを設定して引数に入れたのですが、以下のエラーメッセージが表示されてしまいました。
発生している問題・エラーメッセージ
サイズがあっていないとのことなのですが、
inputMask = np.ones(frame.shape,np.uint8)
で画像の値を取っている以上、なぜこのようなエラーになったのかがわかっていません。
OpenCV(4.1.0) C:\projects\opencv-python\opencv\modules\core\src\arithm.cpp:663: error: (-209:Sizes of input arguments do not match) The operation is neither 'array op array' (where arrays have the same size and the same number of channels), nor 'array op scalar', nor 'scalar op array' in function 'cv::arithm_op'
該当のソースコード
Python3
1#!/usr/bin/env python 2# -*- coding: utf-8 -*- 3 4import cv2 5import numpy as np 6 7# FourCC指定 8#fourcc = "DIB " 9fourcc = "XVID" 10 11# 変換メソッド指定(?) 12#warp_type = cv2.MOTION_AFFINE 13#warp_type = cv2.MOTION_EUCLIDEAN 14#warp_type = cv2.MOTION_TRANSLATION 15warp_type = cv2.MOTION_HOMOGRAPHY 16 17# 出力画像を縦横1/2サイズ(面積1/4)に設定 18scale = 2 19 20# WarpMatrixと変換関数を設定 21if warp_type == cv2.MOTION_HOMOGRAPHY: 22 warp = np.eye(3,3,dtype=np.float32) 23 warpTransform = cv2.warpPerspective 24else: 25 warp = np.eye(2,3,dtype=np.float32) 26 warpTransform = cv2.warpAffine 27 28##カメラの画像取り込みオブジェクトインスタンスの生成 29capture = cv2.VideoCapture(0) 30 31# キャプチャの情報取得し出力情報を作成 32fps = capture.get(cv2.CAP_PROP_FPS) 33size = capture.get(cv2.CAP_PROP_FRAME_WIDTH), capture.get(cv2.CAP_PROP_FRAME_HEIGHT) 34size = tuple(map(lambda x: int(x / scale), size)) 35 36# 基準となる画像を取得 37ret, base = capture.read() 38base = cv2.resize(base, size) 39base = cv2.cvtColor(base, cv2.COLOR_BGR2GRAY) 40 41criteria = (cv2.TERM_CRITERIA_EPS | cv2.TERM_CRITERIA_COUNT, 5000, 1e-8) 42 43while True: 44 45 # フレーム取得 46 ret, frame = capture.read() 47 if not ret: 48 break 49 50 #mask is set to the full image 51 inputMask = np.ones(frame.shape,np.uint8) 52 53 frame = cv2.resize(frame, size) 54 tmp = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) 55 cv2.findTransformECC(tmp, base, warp, warp_type, criteria, inputMask, 5) 56 57 # 出力は元画像(カラー画像) 58 out = warpTransform(frame, warp, size) 59 60 # 表示かつAVIに出力 61 cv2.imshow("", out) 62 63 k = cv2.waitKey(1) 64 if k in [27, ord('q')]: 65 # ESCかQキー押下で終了 66 break 67 68# 解放 69capture.release() 70cv2.destroyAllWindows()
補足情報(FW/ツールのバージョンなど)
MS Visual Studio Enterprise 2019
Python 3.6
OpenCV 4.1.0.25
あなたの回答
tips
プレビュー