OpenCV+Python 3.5簡易ジェスチャー認識の実現


じゃんけんの3つのジェスチャーを測定して、カメラで入力します。方法は以下の通りです。
  • 適切な色空間と閾値を選択して肌部分を抽出する
  • フィルタリングによる腐食膨張などの方法でノイズ除去を行う。
  • エッジ検出
  • 適当な方法で分類します。
    OpenCVはカメラでビデオをキャプチャします。
    採用方法:OpenCVを呼び出す――cv 2.VideoCapture()
    
    def video_capture():
     cap = cv2.VideoCapture(0)
     while True:
     # capture frame-by-frame
     ret, frame = cap.read()
    
     # our operation on the frame come here
     # gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)       
    
     # display the resulting frame
     cv2.imshow('frame', frame)
     if cv2.waitKey(1) & 0xFF == ord('q'): #  q   
     break
     # when everything done , release the capture
     cap.release()
     cv2.destroyAllWindows()
    効果は以下の通りです
    在这里插入图片描述
    肌の色の識別――楕円肌の色の検査モデル
    下記のブログを参照してください
    https://www.jb51.net/article/202594.htm
    コードは以下の通りです
    
    def ellipse_detect(img):
     #         
     skinCrCbHist = np.zeros((256, 256), dtype=np.uint8)
     cv2.ellipse(skinCrCbHist, (113, 155), (23, 15), 43, 0, 360, (255, 255, 255), -1)
    
     YCRCB = cv2.cvtColor(img, cv2.COLOR_BGR2YCR_CB)
     (y, cr, cb) = cv2.split(YCRCB)
     skin = np.zeros(cr.shape, dtype=np.uint8)
     (x, y) = cr.shape
     for i in range(0, x):
     for j in range(0, y):
     CR = YCRCB[i, j, 1]
     CB = YCRCB[i, j, 2]
     if skinCrCbHist[CR, CB] > 0:
     skin[i, j] = 255
     dst = cv2.bitwise_and(img, img, mask=skin)
     return dst
    効果は次のように見えます。肌の色に近いものは全部取り出しられます。テーブルも含まれています。
    認識する時は干渉のない環境を探す必要があります。
    在这里插入图片描述
    ノイズ除去――フィルタリング、腐食、膨張
    下記のブログを参照してください
    https://www.jb51.net/article/202599.htm
    採用方法:ガウスフィルタリングcv 2.GaussianBlur()+膨張cv 2.dilate()のコードは以下の通りです。
    
    #   
    def dilate_demo(image):
     #    
     gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
     #    
     ret, binary = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY | cv2.THRESH_OTSU)
     #             
     kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (5, 5))
     #     
     dst = cv2.dilate(binary, kernel)
     return dst
    
    
    #   
    def erode_demo(image):
     #    
     gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
     #    
     ret, binary = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY | cv2.THRESH_OTSU)
     #             
     kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (15, 15))
     #     
     dst = cv2.erode(binary, kernel)
     return dst
    
    
    #   
    def img_blur(image):
     #     
     # img_erode = erode_demo(image)
     #     
     img_dilate = dilate_demo(image)
    
     #     
     # blur = cv2.blur(image, (5, 5))
     #     
     blur = cv2.GaussianBlur(img_dilate, (3, 3), 0)
     return blur
    Canyエッジ検出
    OpenCV中国語教程を参照してください。
    https://www.kancloud.cn/aollo/aolloopencv/271603
    コードは以下の通りです
    
    # Canny    v
    def canny_detect(image):
     edges = cv2.Canny(image, 50, 200)
     return edges
    識別――輪郭マッチング
    Tensorflowのフレームは難しすぎて、長い間かけても組み立てられませんでした。まだ間違いがいっぱいあります。。したがって、輪郭マッチングcv 2.match Shappes()を採用し、方案は以下の通りである。
  • は、ジェスチャー識別領域を分割し、周囲環境の干渉を回避することができ、画像処理プロセス
  • を簡略化することもできる。
  • 輪郭を探す時、矩形フレームcv 2.boundingRect()を探す方法を採用して、最大輪郭、すなわちジェスチャーの輪郭
  • を見つける。
  • は、発見された輪郭を直接標準ピクチャと一致させ、識別プロセスを簡略化する

  • 「はさみ」のジェスチャーはよく「石」や「布」のジェスチャーとマッチします。だから、別の道を作って、マッチングする時に長方形の枠の面積の判断を加えて、普通は次のような規則があります。
    
     #     
     value = [0, 0, 0]
     value[0] = cv2.matchShapes(img_contour, img1, 1, 0.0)
     value[1] = cv2.matchShapes(img_contour, img2, 1, 0.0)
     value[2] = cv2.matchShapes(img_contour, img3, 1, 0.0)
     min_index = np.argmin(value)
     if min_index == 0: #   
      print(text[int(min_index)], value)
     elif min_index == 1 and w*h < 25000: #   
      print(text[int(min_index)], value)
     elif min_index == 1 and w*h >= 25000: #   
      print(text[0], value)
     elif min_index == 2 and w * h > 30000: #  
      print(text[int(min_index)], value)
     elif min_index == 2 and w * h <= 30000: #   
      print(text[0], value)
    プログラムはマッチング値と面積の大きさによって識別結果を決定します。例えば、下記の結果、1.1795158609219、0.960464371490955、0.98963537200925はハサミ、石、布のマッチング値にそれぞれ対応します。最終識別状況を結び付けて見ると、三つのジェスチャーの中で石の識別成功率は最高で、約98%である。布の次に、約88%です。はさみは最低で、80%ぐらいです。しかも、環境の明るさに影響されやすいです。環境が暗すぎたり、明るすぎたりして、手振りの輪郭が出られないことがあります。まだ改善が必要なようです。やはり機械で勉強する方法です。
    石[1.1795158609219、0.960464371490955、0.9896353720020925]
    プログラムの効果は次の通りです。黄色の長方形枠は識別領域で、gestureウィンドウは輪郭マッチングのためのジェスチャー図です。
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    ここで、OpenCV+Python 3.5の簡単なジェスチャー認識の実現に関する記事を紹介します。OpenCVのジェスチャー識別の内容については、以前の文章を検索したり、下記の関連記事を見たりしてください。これからもよろしくお願いします。