通常のウェブカメラを使用してskeleton joints(または少なくとも1つのPalmを追跡できるようにする)を決定しようとしています。私はウェブ全体を見てきましたが、そうする方法を見つけることができないようです。
私が見つけたすべての例はKinectを使用しています。 1つのWebカメラを使用したい。
ジョイントの深さを計算する必要はありません-フレーム内のX、Yの位置を認識できるようにする必要があります。 KinectではなくWebカメラを使用しているのはそのためです。
これまで私は見てきた:
私はC/C++ライブラリを探しています(ただし、この時点では他の言語を探します)、好ましくはオープンソース(ただし、すべてのライセンスを検討します)は次のことができます:
誰かがこれで私を助けてくれたら本当に感謝しています。私は数日前からこれにこだわっており、進むべき明確な道はありません。
[〜#〜] update [〜#〜]
2年後、解決策が見つかりました: http://dlib.net/imaging.html#shape_predictor
ようやく解決策を見つけました。 dlib
オープンソースプロジェクトには、適切にトレーニングされた後、必要なことを正確に行う「形状予測子」があります。それは(かなり満足な精度で)「ポーズ」を推測します。 「ポーズ」は、「ポーズとして認識できるようにトレーニングするものは何でも」と大まかに定義されており、画像から抽出し、形状から注釈を付けてトレーニングします。
形状予測子は ここで説明dlibのWebサイト
深度情報なしで単一のカメラを使用して手を追跡することは、進行中の科学研究の重大な課題およびトピックです。このトピックに関する多数の興味深い論文や引用の多い論文を提供できます。
第2章のハンドトラッキング文献調査:
残念ながら、無料で入手できるハンドトラッキングライブラリについては知りません。
肌のトーンを使用して手を検出する簡単な方法があります。おそらくこれが役立つかもしれません...あなたはこの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/
あなたの制約を考えると、私の提案は次のようなものを使用することです: 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
覚えておいてください:あなたが使用するために深さ情報を必要としないにもかかわらず、この情報を持っていることはライブラリが手を識別することをより簡単にします。
最も一般的なアプローチは、次の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はこれに最適な選択肢だと思います。はい、深度は必要ありませんが、深度情報を使用すると、(セグメンテーションに深度情報を使用して)手をより簡単に検出できます。
モーショントラッキング機能 オープンソースの Blenderプロジェクト を使用すると、2D映像に基づいて3Dモデルを作成できます。 Kinectは必要ありません。 Blenderはオープンソースであるため、独自の目的のためにBlenderフレームワークの外部でpytonスクリプトを使用できる場合があります。
Eyesweb について聞いたことはありますか
私は自分のプロジェクトの1つでそれを使用していましたが、あなたが達成したいものに役立つかもしれませんが。ここにいくつかの興味深い出版物があります LNAI 3881-EyesWebを使用した指追跡方法 および ジェスチャーを使用したPowerpointing-HCI
基本的にワークフローは次のとおりです。
ただし、Eyes Webのリアルタイム画像処理部分をライブラリとしてソフトに埋め込む方法があるかどうかはわかりません。
既存の可能なソリューションについては知りません。教師あり(または半教師あり)学習がオプションである場合、決定木またはニューラルネットワークのトレーニングは既に十分である可能性があります(kinectは聞いたものからランダムフォレストを使用します)。そのような道を進む前に、既存のソリューションを見つけるためにできる限りのことをしてください。機械学習を正しく行うには、多くの時間と実験が必要です。
OpenCVには機械学習コンポーネントがあり、必要なのはトレーニングデータです。