web-dev-qa-db-ja.com

Webカメラ(Kinectではない)でスケルトンジョイントを決定する

通常のウェブカメラを使用してskeleton joints(または少なくとも1つのPalmを追跡できるようにする)を決定しようとしています。私はウェブ全体を見てきましたが、そうする方法を見つけることができないようです。

私が見つけたすべての例はKinectを使用しています。 1つのWebカメラを使用したい。

ジョイントの深さを計算する必要はありません-フレーム内のX、Yの位置を認識できるようにする必要があります。 KinectではなくWebカメラを使用しているのはそのためです。

これまで私は見てきた:

  • OpenCV(その中の「スケルトン」機能は、グラフィカルモデルを単純化するプロセスですが、人体の検出やスケルトン化ではありません)。
  • OpenNI(NiTEを使用)-ジョイントを取得する唯一の方法はKinectデバイスを使用することであるため、これはWebカメラでは機能しません。

私はC/C++ライブラリを探しています(ただし、この時点では他の言語を探します)、好ましくはオープンソース(ただし、すべてのライセンスを検討します)は次のことができます:

  • 画像(Webカメラからのフレーム)が与えられ、可視ジョイントのX、Y位置を計算します
  • [オプション]ビデオキャプチャストリームで、ジョイントの位置のイベントを使用してコードにコールバックする場合
  • 非常に正確である必要はありませんが、非常に高速であることが望ましいでしょう(フレームあたり0.1秒未満の処理時間)

誰かがこれで私を助けてくれたら本当に感謝しています。私は数日前からこれにこだわっており、進むべき明確な道はありません。

[〜#〜] update [〜#〜]

2年後、解決策が見つかりました: http://dlib.net/imaging.html#shape_predictor

26
YePhIcK

ようやく解決策を見つけました。 dlibオープンソースプロジェクトには、適切にトレーニングされた後、必要なことを正確に行う「形状予測子」があります。それは(かなり満足な精度で)「ポーズ」を推測します。 「ポーズ」は、「ポーズとして認識できるようにトレーニングするものは何でも」と大まかに定義されており、画像から抽出し、形状から注釈を付けてトレーニングします。

形状予測子は ここで説明dlibのWebサイト

2
YePhIcK

深度情報なしで単一のカメラを使用して手を追跡することは、進行中の科学研究の重大な課題およびトピックです。このトピックに関する多数の興味深い論文や引用の多い論文を提供できます。

  • M. de La Gorce、D。J. Fleet、およびN. Paragios、「単眼ビデオからのモデルベースの3Dハンドポーズ推定」、パターン分析および機械知能に関するIEEEトランザクション、vol。 2011年2月33日。
  • R. WangとJ.Popović、「カラーグローブを使用したリアルタイムハンドトラッキング」、ACM Transactions on Graphics(TOG)、2009年。
  • B. Stenger、A。Thayananthan、P。H. S. Torr、およびR. Cipolla、「階層型ベイジアンフィルターを使用したモデルベースのハンドトラッキング」、パターン分析とマシンインテリジェンスに関するIEEEトランザクション、vol。 28、いいえ。 9、pp。1372–84、2006年9月。
  • J. M. RehgおよびT. Kanade、「モデルに基づいた自己閉塞関節オブジェクトの追跡」、IEEE International Conference on Computer Vision、1995、pp。612–617。

第2章のハンドトラッキング文献調査:

  • T. de Campos、「関節のある物体と手の3D視覚追跡」、2006年。

残念ながら、無料で入手できるハンドトラッキングライブラリについては知りません。

19
Palmstrom

肌のトーンを使用して手を検出する簡単な方法があります。おそらくこれが役立つかもしれません...あなたはこのyoutubeで結果を見ることができます video 。注意:背景には、木のような肌色のものを含めないでください。

コードは次のとおりです。

''' Detect human skin tone and draw a boundary around it.
Useful for gesture recognition and motion tracking.

Inspired by: http://stackoverflow.com/a/14756351/1463143

Date: 08 June 2013
'''

# Required moduls
import cv2
import numpy

# Constants for finding range of skin color in YCrCb
min_YCrCb = numpy.array([0,133,77],numpy.uint8)
max_YCrCb = numpy.array([255,173,127],numpy.uint8)

# Create a window to display the camera feed
cv2.namedWindow('Camera Output')

# Get pointer to video frames from primary device
videoFrame = cv2.VideoCapture(0)

# Process the video frames
keyPressed = -1 # -1 indicates no key pressed

while(keyPressed < 0): # any key pressed has a value >= 0

    # Grab video frame, decode it and return next video frame
    readSucsess, sourceImage = videoFrame.read()

    # Convert image to YCrCb
    imageYCrCb = cv2.cvtColor(sourceImage,cv2.COLOR_BGR2YCR_CB)

    # Find region with skin tone in YCrCb image
    skinRegion = cv2.inRange(imageYCrCb,min_YCrCb,max_YCrCb)

    # Do contour detection on skin region
    contours, hierarchy = cv2.findContours(skinRegion, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)

    # Draw the contour on the source image
    for i, c in enumerate(contours):
        area = cv2.contourArea(c)
        if area > 1000:
            cv2.drawContours(sourceImage, contours, i, (0, 255, 0), 3)

    # Display the source image
    cv2.imshow('Camera Output',sourceImage)

    # Check for user input to close program
    keyPressed = cv2.waitKey(1) # wait 1 milisecond in each iteration of while loop

# Close window and camera after exiting the while loop
cv2.destroyWindow('Camera Output')
videoFrame.release()

cv2.findContourは非常に便利です。輪郭を見つけた後、cv2.momentsを使用して「blob」の重心を見つけることができます。 形状記述子 のopencvドキュメントをご覧ください。

輪郭の真ん中にあるスケルトンの作り方をまだ理解していませんが、単一の線になるまで輪郭を「侵食」することを考えていました。画像処理では、このプロセスは「スケルトン化」または「形態スケルトン」と呼ばれます。ここにいくつかあります スケルトン化の基本情報

ここに opencvとc ++のスケルトン化 を実装するリンクがあります

ここに opencvとpythonのスケルトン化 のリンクがあります

それが役立つことを願っています:)

---編集----

deva Ramananによるこれらの論文を読むことを強くお勧めします(リンクされたページにアクセスした後、下にスクロールします)。 http://www.ics.uci.edu/~dramanan/

  1. C.デサイ、D。ラマンナン。 「リレーショナルフレーズを使用したアクション、ポーズ、およびオブジェクトの検出」ヨーロッパコンピュータビジョン会議(ECCV)、イタリア、フィレンツェ、2012年10月。
  2. D.パーク、D。ラマンナン。 「N-Best Maximal Decoders for Part Models」International Conference on Computer Vision(ICCV)International Barcelona、Spain、November 2011。
  3. D.ラマンナン。 「関節オブジェクトの画像を解析する学習」ニューラル情報。手続きSystems(NIPS)、カナダ、バンクーバー、2006年12月。
7
samkhan13

あなたの制約を考えると、私の提案は次のようなものを使用することです: http://docs.opencv.org/doc/tutorials/objdetect/cascade_classifier/cascade_classifier.html

以下は、顔検出に使用するためのチュートリアルです。 http://opencv.willowgarage.com/wiki/FaceDetection?highlight=%28facial%29|%28recognition%29

あなたが説明した問題は非常に難しく、ウェブカメラだけを使用してそれをやろうとするのが合理的な計画であるかどうかはわかりませんが、おそらくこれが最善の策です。ここで説明されているように( http://docs.opencv.org/modules/objdetect/doc/cascade_classification.html?highlight=load#cascadeclassifier-load )、次のような分類器をトレーニングする必要があります。この:

http://docs.opencv.org/doc/user_guide/ug_traincascade.html

覚えておいてください:あなたが使用するために深さ情報を必要としないにもかかわらず、この情報を持っていることはライブラリが手を識別することをより簡単にします。

2
Andrew W

最も一般的なアプローチは、次のyoutubeビデオで見ることができます。 http://www.youtube.com/watch?v=xML2S6bvMwI

この方法は、非常に堅牢ではありません。手が大きく回転すると失敗する傾向があるためです(たとえば、カメラが手の側面や部分的に曲がった手を見ている場合)。

2台のカメラを使用してもかまわない場合は、Robert Wangの作品を見ることができます。彼の現在の会社( GearSystems )は、kinectで拡張されたこのテクノロジーを使用して追跡を提供しています。彼の元の論文は2つのウェブカメラを使用していますが、追跡がはるかに悪いです。

王、ロバート、シルヴァンパリ、ヨヴァンポポビッチ。 「6D手:コンピューター支援設計のためのマーカーレスハンドトラッキング」ユーザーインターフェースソフトウェアおよびテクノロジーに関する第24回ACMシンポジウムの議事録。 ACM、2011年。

別のオプション(ここでも、単一のWebカメラよりも多くを使用できる場合)は、IRエミッターを使用することです。手はIR光を非常によく反射しますが、背景はそうではありません。通常の光をフィルタリングするWebカメラにフィルターを追加することで(および反対のことを行う標準フィルターを削除することで)、非常に効果的なハンドトラッキングを作成できます。この方法の利点は、背景から手のセグメント化がはるかに簡単になることです。カメラの距離と品質によっては、十分な光を反射してWebカメラに戻すために、より多くのIRリードが必要になります。リープモーションでは、このテクノロジーを使用して指と手のひらを追跡します(深度情報を取得するために、2台のIRカメラと3台のIR LEDを使用します)。

言われているすべて; Kinectはこれに最適な選択肢だと思います。はい、深度は必要ありませんが、深度情報を使用すると、(セグメンテーションに深度情報を使用して)手をより簡単に検出できます。

2
Nallath

モーショントラッキング機能 オープンソースの Blenderプロジェクト を使用すると、2D映像に基づいて3Dモデルを作成できます。 Kinectは必要ありません。 Blenderはオープンソースであるため、独自の目的のためにBlenderフレームワークの外部でpytonスクリプトを使用できる場合があります。

0
Ruut

Eyesweb について聞いたことはありますか

私は自分のプロジェクトの1つでそれを使用していましたが、あなたが達成したいものに役立つかもしれませんが。ここにいくつかの興味深い出版物があります LNAI 3881-EyesWebを使用した指追跡方法 および ジェスチャーを使用したPowerpointing-HCI

基本的にワークフローは次のとおりです。

  1. EyesWebでパッチを作成します
  2. ネットワーククライアントで送信するデータを準備する
  3. これらの処理済みデータを独自のサーバー(アプリ)で使用します

ただし、Eyes Webのリアルタイム画像処理部分をライブラリとしてソフトに埋め込む方法があるかどうかはわかりません。

0
Gomino

既存の可能なソリューションについては知りません。教師あり(または半教師あり)学習がオプションである場合、決定木またはニューラルネットワークのトレーニングは既に十分である可能性があります(kinectは聞いたものからランダムフォレストを使用します)。そのような道を進む前に、既存のソリューションを見つけるためにできる限りのことをしてください。機械学習を正しく行うには、多くの時間と実験が必要です。

OpenCVには機械学習コンポーネントがあり、必要なのはトレーニングデータです。

0
kutschkem