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

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

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

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

Python

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

Q&A

解決済

2回答

3693閲覧

opencv python 画像処理

退会済みユーザー

退会済みユーザー

総合スコア0

OpenCV

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

Python

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

0グッド

0クリップ

投稿2017/09/26 12:16

編集2017/09/26 14:27

python

1# -*- coding: utf-8 -*- 2import cv2 3import numpy as np 4 5# フレーム差分の計算 6def frame_sub(src1, src2, src3, th): 7 # フレームの絶対差分 8 d1 = cv2.absdiff(src1, src2) 9 d2 = cv2.absdiff(src2, src3) 10 11 12 diff = cv2.bitwise_and(d1, d2) 13 14 # 二値化処理 15 diff[diff < th] = 0 16 diff[diff >= th] = 255 17 18 # メディアンフィルタ処理(ゴマ塩ノイズ除去) 19 mask = cv2.medianBlur(diff, 3) 20 21 return mask 22 23def main(): 24 # カメラのキャプチャ 25 cap = cv2.VideoCapture(0) 26 27 # フレームを3枚取得してグレースケール変換 28 frame1 = cv2.cvtColor(cap.read()[1], cv2.COLOR_RGB2GRAY) 29 frame2 = cv2.cvtColor(cap.read()[1], cv2.COLOR_RGB2GRAY) 30 frame3 = cv2.cvtColor(cap.read()[1], cv2.COLOR_RGB2GRAY) 31 32 while(cap.isOpened()): 33 # フレーム間差分を計算 34 mask = frame_sub(frame1, frame2, frame3, th=30) 35 36 # 結果を表示 37 38 cv2.imshow("Mask", mask) 39 40 # 3枚のフレームを更新 41 frame1 = frame2 42 frame2 = frame3 43 frame3 = cv2.cvtColor(cap.read()[1], cv2.COLOR_RGB2GRAY) 44 45 # qキーが押されたら途中終了 46 if cv2.waitKey(1) & 0xFF == ord('q'): 47 break 48 49 cap.release() 50 cv2.destroyAllWindows() 51 52if __name__ == '__main__': 53 main() 54

このコードでフレームの差分が出せて動いたものが白く映ります。
これを利用して『白く写った時に一秒間隔でカラーの写真を撮り保存、白く映らない時は写真を撮らない』というようなプログラムを作りたいです。

python

1import cv2 2import numpy as np 3import time 4 5cap = cv2.VideoCapture(0) 6size = (640, 480) 7ret, frame1 = cap.read() 8#frame1 = cv2.resize(frame1, size) 9ret, frame2 = cap.read() 10#frame2 = cv2.resize(frame2, size) 11ret, frame3 = cap.read() 12 13def sub(a, b, c): 14 c = a - b 15 if c > 0: 16 return c 17 if c < 0: 18 return -1 * c 19 20#ave1 = frame1.mean(0).mean(0).mean(0) 21#ave2 = frame2.mean(0).mean(0).mean(0) 22 23while(True): 24 frame1 = frame2 25 #frame2 = frame3 26 frame2 = cap.read() 27 #frame3 = cap.read() 28 29 #ave1 = ave2 30 ave2 = frame2.mean(0).mean(0).mean(0) 31 print ave2 32 33 34 #subave = sub(ave1, ave2, 0) 35 #print subave 36 37 time.sleep(0.7) 38 if cv2.waitKey(1) & 0xFF == ord('q'): 39 break 40 41cap.release() 42cv2.destroyAllWindows() 43

平均値を出すところまで行きましたがwhileの外にave1,ave2をかくと、もちろん値が更新されないので内側にかかなければならいと思いますが、
ave2 = frame2.mean(0).mean(0).mean(0)
AttributeError: 'tuple' object has no attribute 'mean'
というエラーが出てしまいます。これを解決するにはどうしたら良いでしょうか?

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

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

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

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

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

guest

回答2

0

Example 3.16. タプルはメソッドを~のくだりをご覧ください。listの計算はnumpyでいけますね。

投稿2017/09/26 16:16

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

退会済みユーザー

退会済みユーザー

2017/09/27 02:51

タプルは不変なものだとわかりました。numpyの計算というのは具体的にはave2 = frame2.mean(0).mean(0).mean(0)はダメでnp.mean(frame2)かnp.average(frame2)を繰り返したほうがいいということでしょうか?
退会済みユーザー

退会済みユーザー

2017/09/27 10:25

そうだと思います。 (もしかしたら繰り返し並べる処理もあるのかもしれませんが) .mean(0)と一回するだけで値は取れそうですね。もし、この式の言わんとするところが明るさを判定したい、というところにあるのであれば、 1. BGRをgrayscaleに(BGRを1chに統合)してしまって、それを平均or中央値処理 2. BGRをBとGとRに分割してそれぞれを平均or中央値処理 でよいと思います。
guest

0

ベストアンサー

python

1# -*- coding: utf-8 -*- 2import cv2 3import numpy as np 4import time 5import sys 6 7def frame_sub(src1, src2, src3, th): 8 d1 = cv2.absdiff(src1, src2) 9 d2 = cv2.absdiff(src2, src3) 10 diff = cv2.bitwise_and(d1, d2) 11 diff[diff < th] = 0 12 diff[diff >= th] = 255 13 mask = cv2.medianBlur(diff, 3) 14 mas = np.mean(mask) 15 #print mas 16 return mas 17 18cap = cv2.VideoCapture(0) 19 20frame1 = cv2.cvtColor(cap.read()[1], cv2.COLOR_RGB2GRAY) 21frame2 = cv2.cvtColor(cap.read()[1], cv2.COLOR_RGB2GRAY) 22frame3 = cv2.cvtColor(cap.read()[1], cv2.COLOR_RGB2GRAY) 23 24count = 0 25while(True): 26 mask = frame_sub(frame1, frame2, frame3, th=30) 27 frame1 = frame2 28 frame2 = frame3 29 frame3 = cv2.cvtColor(cap.read()[1], cv2.COLOR_RGB2GRAY) 30 31 if mask > 0.001: 32 while(True): 33 mask = frame_sub(frame1, frame2, frame3, th=30) 34 frame1 = frame2 35 frame2 = frame3 36 frame3 = cv2.cvtColor(cap.read()[1], cv2.COLOR_RGB2GRAY) 37 38 cap = cv2.VideoCapture(0) 39 ret, frame = cap.read() 40 41 count += 1 42 count_padded = '%05d' % count 43 write_file_name = count_padded + ".jpg" 44 cv2.imwrite(write_file_name, frame) 45 #time.sleep(0.05) 46 if mask < 0.001: 47 break 48

投稿2017/09/28 13:27

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問