2017-02-21 30 views
1

Я использую малину pi3, и я написал код распознавания рук с помощью OpenCV с помощью python. Но теперь я хочу напечатать текст, похожий на «слева направо», на экране живого видеопотока, когда рука движется слева направо и печатает текст как «справа налево», когда рука движется справа налево.Как отобразить текст в режиме реального видеопотока распознавания жестов руки с помощью opencv + python

Теперь, когда мой вопрос: cv2.putText(), мы можем отобразить текст, но как найти направление, в котором рука перемещается слева направо или наоборот?

У кого-нибудь есть идея, как отобразить этот текст? Ответьте, пожалуйста. Заранее спасибо.

+0

Для отображения текста просто используйте 'putText'. Но реальный вопрос здесь - «Как распознать движение рук», который слишком широк. – Miki

+0

Спасибо @Miki ... Я знаю, что использование текстового текста может отображать текст ... но я хочу отображать, когда рука движется слева направо, а затем показывает слева направо и когда рука перемещается справа на в левом направлении отображается справа налево текст на экране ... так что может быть какой-то код нужно сделать это ... то есть я спрашиваю –

+0

, то вы должны упомянуть об этом раньше ** ЧИСТЫЙ ** –

ответ

4

Если я правильно понимаю, вы уже признаете руку (область интересов aka ROI) и просто задаетесь вопросом, как узнать, движется ли она влево или вправо. Чтобы распознать это, вы должны сохранить историю своего местоположения. Просто запомните несколько кадров, где была рука.

import numpy as np 
from collections import deque 

cx_hist = deque(maxlen=10) # how many frames history 
while True: 
    ... 
    M = cv2.moments(contour) # the moment of one contour 
    cx = int(M['m10']/M['m00']) # the x coordinate of the centroid 

    cx_hist.append(cx) 
    diff = [cx_hist[i+1]-cx_hist[i] for i in range(len(cx_hist)-1)] 

    treshold = 2 # some treshold of significant (pixel) movement 
    if np.mean(diff) > treshold: 
     print('positive means movement to the right') 
    elif np.mean(diff) < treshold*-1: 
     print('negative means movement to the left') 
    else: 
     print('below the tresholds there is little movement') 

Вы должны преобразовать его в puttext самостоятельно. Я использовал координаты центра, но вы могли бы выбрать что-то еще. См. http://docs.opencv.org/3.1.0/dd/d49/tutorial_py_contour_features.html

+1

Это отличный подход! –

+0

Спасибо, что за то, что вы дали ответ @Roelant ... Как я предложил изменить код. Вы можете проверить его в моем обновленном вопросе. Но во время работы он показывает ошибку, например: cx = int (M ['m10']/M ['m00']) ZeroDivisionError: float деление на ноль. Пожалуйста, проверьте вопрос и предложите мне, как это решить? Я сделал какую-либо ошибку при изменении кода? Я поставлю cv2.puttext() после устранения этой ошибки. –

+1

Можете ли вы показать содержание M? По-видимому, M ['m00'] равно 0. – Roelant