質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.31%
Jupyter

Jupyter (旧IPython notebook)は、Notebook形式でドキュメント作成し、プログラムの記述・実行、その実行結果を記録するツールです。メモの作成や保存、共有、確認などもブラウザ上で行うことができます。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

1回答

1023閲覧

差分画像の出力方法について

ogs

総合スコア12

Jupyter

Jupyter (旧IPython notebook)は、Notebook形式でドキュメント作成し、プログラムの記述・実行、その実行結果を記録するツールです。メモの作成や保存、共有、確認などもブラウザ上で行うことができます。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2022/07/09 01:22

編集2022/07/09 01:47

ある一枚の背景画像と、七百枚ほどの画像とで差分とるということを繰り返し行い、背景差分画像を出力したいのですがエラーが出てしまいます。現在のコードは下記のような感じです。python初心者なのですがどなたかご教授いただければ幸いです。なお、このコードは動画をフレーム分割してできた画像をグレースケールに変換して出力するという作業を行っているのですが、そこは問題なくできたので省略しています。

コード

import numpy as np import matplotlib.pyplot as plt import pandas as pd import cv2 i = 0 count = 0 cpf = 1 #動画の読み込み video_path = "Zbc=1100mm_Trim.avi" cap = cv2.VideoCapture(video_path) #フレームレート(fps)の取得 frame_rate = cap.get(cv2.CAP_PROP_FPS) num = 0 while cap.isOpened(): ret, frame = cap.read() if ret == False: print('FINISHED') break if count%cpf == 0: #dt = 0.025[sec] #フレーム画像の保存 cv2.imshow('Video', frame) img = cv2.imwrite("original_" + str(num) + '.png', frame) print(str(num)+'.png') num += 1 i += 1 count = count + 1 cap.release() k = 0 while k < num: #グレースケールによる入力画像の読み込み gray = cv2.imread("original_" + str(k)+'.png', 0) #出力画像の保存 cv2.imshow('Video', gray) gray = cv2.imwrite("gray_"+str(k)+'.png', gray) print('gray_'+str(k)+'.png') k += 1 k = 0 while k < num: #入力画像の読み込み img_src = cv2.imread('gray_'+str(k)+'.png', 0) #背景画像の読み込み img_bkg = cv2.imread('gray_600 - reference.png') #差分画像の取得 img_df = cv2.absdiff(img_src, img_bkg) #出力画像の保存 cv2.imwrite('diff_'+str(k)+'.png', img_df) print('diff_'+str(k)+'.png') k += 1 --------------------------------------------------------------------------- error Traceback (most recent call last) Input In [2], in <cell line: 54>() 60 img_bkg = cv2.imread('gray_600 - reference.png') 62 #差分画像の取得 ---> 63 img_df = cv2.absdiff(img_src, img_bkg) 65 #出力画像の保存 66 cv2.imwrite('diff_'+str(k)+'.png', img_df) error: OpenCV(4.6.0) D:\a\opencv-python\opencv-python\opencv\modules\core\src\arithm.cpp:650: 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'

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

usekay

2022/07/09 01:30

コード上に何度かでてくる『\\\\\\』は何を意図していますか。 『\』のエスケープなら『\\』となるべきで 『'C:\\Users\\gray_600 - reference.png'』などとすべきかと思いますが。
meg_

2022/07/09 01:30

質問のコードは「NameError: name 'num' is not defined」が発生します。回答者が再現できるコードをお願いします。
ogs

2022/07/09 01:37

ファイルパスが入っていました。名前が個人的なものだったので隠しているだけです。
melian

2022/07/09 01:44

エラーメッセージに "Sizes of input arguments do not match" とあるので、入力画像と背景画像のサイズ(width, height, channel数)が異なっているか、もしくは画像ファイルの読み込みに失敗しているのではないでしょうか。
ogs

2022/07/09 01:57

画像サイズは全く一緒だったので、ファイルの読み込みなのでしょうか、、、 こんなコードにしてみればみたいなのがあったら教えていただきたいです。
melian

2022/07/09 02:02

#背景画像の読み込み img_bkg = cv2.imread('gray_600 - reference.png') の直後に、 print(img_src.shape) print(img_bkg.shape) を追加して、それぞれの shape を確認してみて下さい。
usekay

2022/07/09 02:10

画像の要素数を確認してみるとかどうでしょう。 OpenCVは画像を配列として扱うので一次元が2要素、二次元目が画像の縦横の要素数になり比較元と比較先で一致するはずです。
ogs

2022/07/09 02:31

shape関数を使ってみたら (1080, 1920) (1080, 1920, 3) と出ました。これってimg_bkgのほうがグレースケールになってないってことですよね。ただ画像見る感じしっかりグレースケールになっているんです。なぜなんでしょうか、、
melian

2022/07/09 02:38

デフォルトの RGB モードで読み込んでいるのではないでしょうか。img_src と同様に、モード 0 (IMREAD_GRAYSCALE)を指定すると良いかもしれません。 img_bkg = cv2.imread('gray_600 - reference.png', 0)
usekay

2022/07/09 02:44

プログラム状は上で上がっているように読み込みモードの問題かと思います。 また『ただ画像見る感じしっかりグレースケールになっているんです』とありますがこちらはどのように確認しましたか。画像ビューアでみて確認だとRGBでグレースケールっぽくなっている場合もあるかと思いますが。
ogs

2022/07/09 02:47

モード0の指定し忘れが原因だったみたいです。皆さんありがとうございました!
jbpb0

2022/07/09 04:37

> (1080, 1920, 3) > 画像見る感じしっかりグレースケールになっている 3チャンネルのカラー画像でRGBに同じ値が入ってると、色は見えずグレーに見えます
guest

回答1

0

エラーメッセージに書かれている通り、たとえばグレースケールとカラー画像のようにサイズやチャンネル数が異なると提示エラーが発生します。

投稿2022/07/09 01:46

can110

総合スコア38352

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.31%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問