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

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

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

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

Python

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

Q&A

解決済

1回答

1678閲覧

遊泳中のメダカの2値化映像がきれいに映らない

sincere

総合スコア3

OpenCV

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

Python

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

0グッド

0クリップ

投稿2021/12/27 07:59

前提・実現したいこと

以前同プログラムで質問したものです。(遊泳中のメダカの重心を撮る)
現ソースコードでやってると2値化後の映像がなぜか点滅気味でメダカの体も輪郭だけでキレイに映らないです。
撮影条件としては水槽の下から暗室で撮影しており,水槽の上からモニターで照らしている状態です。
前回のように横から照らした状態だと大丈夫なのですが下からの撮影だと画像の状態になってしまいます。
これをまず点滅しない状態+メダカの体がきれいに反映される状態にしたいです。
撮影条件の違いも検討していますがプログラム内でどこがわるいのか教えてくださると幸いです。
イメージ説明

該当のソースコード

import cv2 import time import numpy as np movie = cv2.VideoCapture('upvideo.mp4') before = None /前回の画像を保存する変数 fps = int(movie.get(cv2.CAP_PROP_FPS)) /動画のFPSを取得 kernel = np.ones((3,3),np.uint8) kerne2 = np.ones((11,11),np.uint8) while True: /画像を取得 ret, frame = movie.read() /再生が終了したらループを抜ける if ret == False: break gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) if before is None: before = gray.astype("float") continue /現在のフレームと移動平均との差を計算 cv2.accumulateWeighted(gray, before, 0.6)# frameDelta = cv2.absdiff(gray, cv2.convertScaleAbs(before)) /frameDeltaの画像を2値化 thresh = cv2.threshold(frameDelta, 1, 255, cv2.THRESH_BINARY)[1] opening1 = cv2.morphologyEx(thresh, cv2.MORPH_OPEN, kernel) closing = cv2.morphologyEx(opening1, cv2.MORPH_CLOSE, kerne2) label = cv2.connectedComponentsWithStats(closing) /オブジェクト情報を項目別に抽出 n = label[0] - 1 data = np.delete(label[2], 0, 0) center = np.delete(label[3], 0, 0) /ラベリング結果書き出し用に二値画像をカラー変換 color_src = cv2.cvtColor(gray, cv2.COLOR_GRAY2BGR) /オブジェクト情報を利用してラベリング結果を表示 for i in range(n): x1 = data[i][0] + data[i][2] y1 = data[i][1] + data[i][3] /各オブジェクトの重心座標をに黄文字で表示 cv2.putText(color_src, "X: " + str(int(center[i][0])), (x1-10 , y1+15 ), cv2.FONT_HERSHEY_PLAIN, 1, (0, 255, 255)) cv2.putText(color_src, "Y: " + str(int(center[i][1])), (x1-10 , y1+30 ), cv2.FONT_HERSHEY_PLAIN, 1, (0, 0, 255)) time.sleep(0.05/fps) cv2.imshow('movie2',thresh) cv2.imshow('movie',color_src) cv2.imshow('target_bh', closing) /Enterキーが押されたらループを抜ける if cv2.waitKey(1) == 13: break cv2.destroyAllWindows() /ウィンドウを破棄

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

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

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

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

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

1T2R3M4

2021/12/27 08:07

>プログラム内でどこがわるいのか コードを書いたご自身が一番詳しいのでは。
fana

2021/12/27 08:40

各フレームにおける処理状態 :例えば,移動平均(before)や,差分の2値化(thresh)等 を可視化するなりして,何が起きているかを把握すべきと思います.
munimunimuni

2021/12/27 16:06

素朴な疑問ですが、「水槽の上からモニターで照らす」というのは、いわゆる液晶モニターとかの事でしょうか?もしそうだとすると、その光は連続的でなく、例えば60Hzとかのリフレッシュレートで点滅しているものと思われます。一方で、カメラも一定周期で画像を取り込んでいるので、これらの周波数の組合せによっては、(動画として目で見る分には気づきにくいのですが)ある時間の画像をチェックすると、魚影が画面平面上で連続していない可能性があります。一度、静止画で確認されてはいかがでしょうか。
munimunimuni

2021/12/27 16:12

要は、光源について、白熱球の様に、ちらつきの無い連続的な光を使用しては?という提案です。
fana

2021/12/28 01:02

「点滅」というのが具体的にどういう話なのかわかりませんが, 輪郭しか出ないというのは,単に,内側部分が「メダカ - メダカ = 0」みたいなことになっているだけだったりはしないのでしょうか? (複数フレームにわたってメダカな箇所がある場合,移動平均画像のその部分がメダカ色になってしまっているのでは? という話)
guest

回答1

0

ベストアンサー

「現在のフレームと移動平均との差を計算」というところがありますが、ここを「メダカがいない時の画像との差を計算」にしたら、解決しませんかね?

投稿2021/12/27 16:25

munimunimuni

総合スコア31

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

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

fana

2021/12/28 00:56

> メダカがいない時の画像 というのは,どこからどうやって出てくる想定の話なのか? そこが重要(省略すべきではない)箇所かと. 移動平均を用いているのは(実際上の必要性や影響具合等々は我々には不明ですが)背景を一定とは仮定できないという前提があってのこと(時間方向の急峻ではない変化に対抗しようという話)でしょうから.
munimunimuni

2021/12/28 11:17

「移動平均を用いる事」を必然としているかどうかは、第三者には分からないことでは?もし、どうしてもfanaさんの言う通り「背景を一定とはできない」なら、過去に遡って、より長い時間の移動平均との差を取れば良い話かもしれませんね。
fana

2021/12/31 04:03

回答内容は【質問者が今使っている「背景」を「別のもの」に変えたらどうか?】という話と見えるので,「別のもの」の具体的な取得手段に関する想定などが示された方が有益な内容になるのではないでしょうか? という話です. (メダカを水槽に入れない状態での撮影作業を実施する想定なのか,メダカが水槽内にいる状態で「撮影画像中のメダカがいない(と推定された)部分」を積極的に利用していくような話なのか,その他なのか)
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問