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

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

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

OpenCV(オープンソースコンピュータービジョン)は、1999年にインテルが開発・公開したオープンソースのコンピュータビジョン向けのクロスプラットフォームライブラリです。

Python

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

Q&A

解決済

1回答

1215閲覧

動画中の物体が映ったフレームはどこか調べる

shktech

総合スコア2

OpenCV

OpenCV(オープンソースコンピュータービジョン)は、1999年にインテルが開発・公開したオープンソースのコンピュータビジョン向けのクロスプラットフォームライブラリです。

Python

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

0グッド

0クリップ

投稿2021/11/23 08:55

編集2021/11/24 04:38

前提・実現したいこと

動画からフレーム画像を取得し、最初のフレームを背景画像としてそれ以降の画像を背景差分し取得します。
動画開始から30フレーム程度は背景画像と全く同じ画像となってしまう(複数動画の処理、背景画像と全く同じ画像となるフレームが一定ではない)ため、その後の処理(重心検出)が通りません。
背景差分後の画像に物体が映ったときのフレーム以降でその後の処理を行わせる、何フレーム目から物体が映っているのかを調べるためには、どのような方法があるのかご教示いただきたく存じます。

###追記
該当ソースコードの修正、画像、エラーコードを追加しました。
画像は
一枚目 背景画像とする画像
二枚目 物体の映った画像(26フレーム目)
三枚目 物体が映っていないときの背景差分後の画像
四枚目 物体が映ったときの背景差分後の画像(26フレーム目)
となっています。

改めて、解決したい課題は
物体が映ったフレーム以降から重心検出の処理を行わせたい
というものです。

私の解釈では、三枚目の画像のようなときは重心検出ができなくてエラーになっているので(そもそもここが間違っていますか?)、物体の映った四枚目のような画像から重心検出を行うことができれば問題なく実行できると考えています。
物体の映った画像以降から処理を行うためにはどのような手段があるのかを探しています。
ちなみに重心検出を行う理由は物体の座標を取得するためです。

該当のソースコード

import cv2 import sys import numpy as np import glob import os video_path='C2278.mp4' #動画ファイル読込 cap=cv2.VideoCapture(video_path) if not cap.isOpened(): #正常に読み込めたのかチェック print('失敗') sys.exit() digit = len(str(int(cap.get(cv2.CAP_PROP_FRAME_COUNT)))) n= 0 while True: #read()でフレーム画像が読み込めたかを示すbool、フレーム画像の配列ndarrayのタプル is_image,frame_img=cap.read() if is_image: #画像を保存 cv2.imwrite("img"+str(n).zfill(digit)+".png",frame_img) #グレースケール画僧の読み込み im1=cv2.imread('img000.png',0) im2= cv2.cvtColor(frame_img, cv2.COLOR_BGR2GRAY) #背景差分 fgbg=cv2.bgsegm.createBackgroundSubtractorMOG() fgmask=fgbg.apply(im1) fgmask=fgbg.apply(im2) #メディアンフィルター th=cv2.medianBlur(fgmask,15) # 画像を保存 cv2.imwrite('threshold'+str(n).zfill(digit)+'.png',th) #モーメント関数で3次までのモーメントを取得 mu=cv2.moments(th) #図心を出す。 x,y= int(mu["m10"]/mu["m00"]) , int(mu["m01"]/mu["m00"]) print([x,y]) else: # フレーム画像が読込なかったら終了 break n += 1 cap.release()

###エラーコード

--------------------------------------------------------------------------- ZeroDivisionError Traceback (most recent call last) <ipython-input-4-a8ed6c71b0f4> in <module> 44 45 #図心を出す。 ---> 46 x,y= int(mu["m10"]/mu["m00"]) , int(mu["m01"]/mu["m00"]) 47 print([x,y]) 48 else: ZeroDivisionError: float division by zero

###画像
イメージ説明
イメージ説明
イメージ説明
イメージ説明

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

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

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

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

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

fana

2021/11/23 09:27 編集

全体的に意味がわかりません. > その後の処理(重心検出)が通りません とか言われても,それは「その後の処理」の実装に関する問題ではないでしょうか. その問題がある処理とは直接的に関係ないであろうコードを示している理由は何なのでしょうか? 「その後の処理」云々以前に,まず提示コードの結果に問題があるという話なのですか? そもそも「物体が映っているか否か」という判定を行うための手段として背景差分処理を実施しているのでしょうから, 背景差分処理の結果を用いて予定通りの判定を行えばよいだけではないでしょうか. (「背景差分をやってみた.結果の用途は全く不明だが(笑)」とかいう謎めいた状況ではないハズですよね) 何が本件における 問題/解決すべき課題 なのですか?
退会済みユーザー

退会済みユーザー

2021/11/23 09:41

可能であれば実際の写真も掲載ください。背景と差分を取る方法がいいのか、形状や色がシンプルであればもっと別の方法も検討できます。"今どきのPC"であれば深層学習もそれなりに敷居の低い話になり、(データさえあればよほど変な条件でなければ)十分導入できます。
shktech

2021/11/24 02:34

ご回答ありがとうございます。 提示コードは間違っていたので修正いたします。 その際のエラーコードも追加しています。 また、画像も追加いたしました。
shktech

2021/11/24 02:37

ちょっと変更に失敗したようなのでもう一度やり直します。 申し訳ございません。
guest

回答1

0

ベストアンサー

要は,「物体」が映ってない場合には,

  1. th は真っ黒になる.
  2. よって,mu=cv2.moments(th) で計算したモーメント特徴の値がことごとく(? 少なくともM00は)0になる.
  3. なので,x,y= int(mu["m10"]/mu["m00"]) , int(mu["m01"]/mu["m00"]) とかして,M00で割ろうという処理は零除算になるので,そこでエラーになる

っていうだけの話ですよね.
上記の流れを把握していますか?

話が分かれば,最も単純な対応方法というのはとりあえず自明でしょう.
例えば,上記3.の直前でまずはM00の値をチェックし,「物体が映っている」と判断するのに相応しくないようならば,以降の「物体が映っている場合にやるべき処理」を行わなければよいだけでしょう.

投稿2021/11/24 05:28

fana

総合スコア11996

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

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

shktech

2021/11/25 02:04

ご回答ありがとうございました。 確かにm00の値で条件分岐することでプログラムを実行することができました。 こういう方法がまだまだすっと出てこないので日々勉強です。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問