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

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

ただいまの
回答率

90.61%

  • Python

    7489questions

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

  • OpenCV

    1020questions

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

opencv python 画像処理

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 640
退会済みユーザー

退会済みユーザー

# -*- coding: utf-8 -*-
import cv2
import numpy as np

# フレーム差分の計算
def frame_sub(src1, src2, src3, th):
    # フレームの絶対差分
    d1 = cv2.absdiff(src1, src2)
    d2 = cv2.absdiff(src2, src3)


    diff = cv2.bitwise_and(d1, d2)

    # 二値化処理
    diff[diff < th] = 0
    diff[diff >= th] = 255

    # メディアンフィルタ処理(ゴマ塩ノイズ除去)
    mask = cv2.medianBlur(diff, 3)

    return  mask

def main():
    # カメラのキャプチャ
    cap = cv2.VideoCapture(0)

    # フレームを3枚取得してグレースケール変換
    frame1 = cv2.cvtColor(cap.read()[1], cv2.COLOR_RGB2GRAY)
    frame2 = cv2.cvtColor(cap.read()[1], cv2.COLOR_RGB2GRAY)
    frame3 = cv2.cvtColor(cap.read()[1], cv2.COLOR_RGB2GRAY)

    while(cap.isOpened()):
        # フレーム間差分を計算
        mask = frame_sub(frame1, frame2, frame3, th=30)

        # 結果を表示

        cv2.imshow("Mask", mask)

        # 3枚のフレームを更新
        frame1 = frame2
        frame2 = frame3
        frame3 = cv2.cvtColor(cap.read()[1], cv2.COLOR_RGB2GRAY)

        # qキーが押されたら途中終了
        if cv2.waitKey(1) & 0xFF == ord('q'):
            break

    cap.release()
    cv2.destroyAllWindows()

if __name__ == '__main__':
    main()


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

import cv2
import numpy as np
import time

cap = cv2.VideoCapture(0)
size = (640, 480)
ret, frame1 = cap.read()
#frame1 = cv2.resize(frame1, size)
ret, frame2 = cap.read()
#frame2 = cv2.resize(frame2, size)
ret, frame3 = cap.read()

def sub(a, b, c):
    c = a - b
    if c > 0:
        return c
    if c < 0:
        return -1 * c

#ave1 = frame1.mean(0).mean(0).mean(0)
#ave2 = frame2.mean(0).mean(0).mean(0)

while(True):
    frame1 = frame2
    #frame2 = frame3
    frame2 = cap.read()
    #frame3 = cap.read()

    #ave1 = ave2
    ave2 = frame2.mean(0).mean(0).mean(0)
    print ave2


    #subave = sub(ave1, ave2, 0)
    #print subave

    time.sleep(0.7)
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

cap.release()
cv2.destroyAllWindows()


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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

+1

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/09/27 11:51

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

    キャンセル

  • 2017/09/27 19:25

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

    キャンセル

check解決した方法

0

# -*- coding: utf-8 -*-
import cv2
import numpy as np
import time
import sys

def frame_sub(src1, src2, src3, th):
    d1 = cv2.absdiff(src1, src2)
    d2 = cv2.absdiff(src2, src3)
    diff = cv2.bitwise_and(d1, d2)
    diff[diff < th] = 0
    diff[diff >= th] = 255
    mask = cv2.medianBlur(diff, 3)
    mas = np.mean(mask)
    #print mas
    return  mas

cap = cv2.VideoCapture(0)

frame1 = cv2.cvtColor(cap.read()[1], cv2.COLOR_RGB2GRAY)
frame2 = cv2.cvtColor(cap.read()[1], cv2.COLOR_RGB2GRAY)
frame3 = cv2.cvtColor(cap.read()[1], cv2.COLOR_RGB2GRAY)

count = 0
while(True):
    mask = frame_sub(frame1, frame2, frame3, th=30)
    frame1 = frame2
    frame2 = frame3
    frame3 = cv2.cvtColor(cap.read()[1], cv2.COLOR_RGB2GRAY)

    if mask > 0.001:
        while(True):
            mask = frame_sub(frame1, frame2, frame3, th=30)
            frame1 = frame2
            frame2 = frame3
            frame3 = cv2.cvtColor(cap.read()[1], cv2.COLOR_RGB2GRAY)

            cap = cv2.VideoCapture(0)
            ret, frame = cap.read()

            count += 1
            count_padded = '%05d' % count
            write_file_name = count_padded + ".jpg"
            cv2.imwrite(write_file_name, frame)
            #time.sleep(0.05)
            if mask < 0.001:
                break

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 90.61%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

  • 解決済

    wxPythonにおいて、USBカメラの画像表示をしたい

    前提・実現したいこと ここ一週間くらい、teratailの皆様の力を借りながら、python上で動く動画や画像を表示できるGUIを作っています。画像は何とか表示でき、画像とパネル

  • 解決済

    opencv 円検出

    前提・実現したいこと 動画を読み込みその動画から円を検出して描画するプログラムを書こうと思っています。 発生している問題・エラーメッセージ 動画は読み込んで出力することができま

  • 解決済

    Python Opencv 動画のフレームを分割して保存したい

    mp4の動画をフレーム分割するコードを知りたいです。 詳細情報 動作環境:Jupyter Notebook

  • 解決済

    動画再生後,必ずエラーが発生します

    動画を扱う  OpenCV-Pythonチュートリアル # -*- coding: utf-8 -*- import numpy as np import cv2 cap =

  • 解決済

    Opencvで画像の色を抽出してアルファチャンネル付きで保存したい

    コラージュを作るときのいわゆるBB(ブルーバック?)のような画像で、背景の単色だけを 抜いてその部分を透過させたいです。 画像はBGRです。最終的に入力に対して出力が周りが透過

  • 解決済

    opencvで直線近似

    これらを輪郭近似し取得した輪郭の頂点を元に面積が一定以上の大きさのところだけ取り出すことで日差しの部分をカットできるのではないかと思ったのですがどのように取り組んでいいか

  • 解決済

    OpenCVのリアルタイム円検出について

    python-OpenCVとWebカメラを使用し、リアルタイムで表示された映像内の円を検出することが出来るプログラムを作成しています。しかし、動かしてみるとエラーが出てしまいます。

  • 解決済

    opencvの処理をリアルタイムに

    処理が途中でとまり、 処理後フォルダにaviファイルは保存されるのですが2秒ほどの動画となってしまいます 動画を撮り続けて自分で止めたい場合どのようにすればよいでしょうか アドバイ

同じタグがついた質問を見る

  • Python

    7489questions

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

  • OpenCV

    1020questions

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