2016-04-14 12 views
1

ライトピンクの色を検出するコードを書いています。今度は、ライトピンクの色を検出した後、ウェブカメラを自動的に閉じるコードを追加したいと思います。これで私を助けてくれますか?それは意味的に何のループではありませんので、特定の色を検出したらウェブカメラを停止する

import cv2 
import numpy as np 

cap = cv2.VideoCapture(0) 

while(1): 
    _, frame = cap.read() 

    hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV) 

    lower_pink = np.array([160,50,50]) 
    upper_pink = np.array([180,255,255]) 

    mask = cv2.inRange(hsv, lower_pink, upper_pink) 

    # Bitwise-AND mask and original image 
    res = cv2.bitwise_and(frame,frame, mask= mask) 
    cv2.imshow('frame',frame) 
    cv2.imshow('mask',mask) 
    cv2.imshow('res',res) 
    break 

if(cv2.countNonZero(mask) > 0): 
    print("FOUND") 
    raise SystemExit 

cv2.destroyAllWindows() 
+0

マスクでピンクの色が見つかったと表示された場合(つまり、マスクのピクセル数が少なくともゼロ以外の場合)、終了することができます。何かのようなもの; 'if(cv2.countNonZero(mask)> threshold):break' – Miki

+0

私は画像処理に新しいものがあります。だから私は書くべきであるしきい値を追加してください? 私はそれをゼロにしてコードを実行するので。ウィンドウ(hsv、mask、res)はミリ秒単位で終了します。 – Maxi

+0

あなたのピンクのブロブの最小サイズは?騒々しいピンクのポイントのために閉じないようにする必要があります。あなたは10,20,50,100に設定し、最高のものが何かを見ることができます。より良いアプローチは、マスク内の最大のブロブの寸法を取得し、それを十分に大きくすることです。これは、ノイズの多い点に対してより堅牢になります。 – Miki

答えて

0

無条件break(ノー可能continue)とのループは意味がありません: はここEDITEDコードです。

テストがループ内にある必要があります。最初に十分なピンクが付いた状態になるまで、キャプチャした各イメージに適用したいからです。そして、breakループ。ループの後のクリーンアップコードはもう実行されないので、ここでプログラムを終了しないでください。とにかくSystemExitを呼び出すことによって終了することは、ちょっと変わっています。それはsys.exit()の機能です。

import cv2 
import numpy as np 

def main(): 
    lower_pink = np.array([160, 50, 50]) 
    upper_pink = np.array([180, 255, 255]) 
    threshold = 100 # TODO Adapt to your needs. 
    cap = cv2.VideoCapture(0) 

    while True: 
     _, frame = cap.read() 
     hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV) 
     mask = cv2.inRange(hsv, lower_pink, upper_pink) 
     masked = cv2.bitwise_and(frame, frame, mask=mask) 
     cv2.imshow('frame', frame) 
     cv2.imshow('mask', mask) 
     cv2.imshow('masked', masked) 
     # if cv2.countNonZero(mask) > threshold: 
     #  print('FOUND') 
     #  break 
     print(cv2.countNonZero(mask)) 
     # 
     # Wait for escape key. 
     # 
     if cv2.waitKey(500) == 27: 
      break 

    cv2.destroyAllWindows() 


if __name__ == '__main__': 
    main() 

実際の閾値テストは、あなたのニーズに合うと思われる値を決定できるように、マスクの画素数を印刷してコメントアウトして交換されます。

+0

こんにちは、私を訂正してくれてありがとう。私は初心者です。 コードは正常に機能しましたが、問題はマスクと結果ウィンドウを表示していないため、ミリ秒単位でメッセージが表示されています。私はさらに閾値を変えようとしましたが、同じ結果でした。コードが正常に動作しているか、問題がありますか? – Maxi

+0

さまざまな状況(オブジェクト、照明など)でマスクのピクセル数をテストできるように、コードを変更しました。 – BlackJack

関連する問題