1

私は手のジェスチャー認識を含むプロジェクトに取り組んでいます.私は手のジェスチャーを認識し、それが表すアルファベットの文字を特定する必要があります.私はHSV色空間を使用して皮膚を検出することができます.私はすべての文字の手のジェスチャーのビデオを持っています.すべての文字の手のジェスチャーの画像。次に、どのジェスチャーがどのアルファベットの文字を表しているかを見つける必要があります。ビデオの各フレームのジェスチャーを画像ジェスチャーと比較する方法を知る必要があります。私はopencvが初めてです。誰か助けてください.これは私のコードです

#include <opencv2\opencv.hpp>

using namespace cv;
using std::cout;

/*--------------- SKIN SEGMENTATION ---------------*/
   int main() {

  VideoCapture cap("E:\\videotest.mp4");

if (!cap.isOpened())
{// check if we succeeded
    printf("coundnotoepn");
    return -1;
}
Mat3b frame;
while (cap.read(frame)){

    /* THRESHOLD ON HSV*/
    cvtColor(frame, frame, CV_BGR2HSV);
    GaussianBlur(frame, frame, Size(7, 7), 1, 1);
    medianBlur(frame, frame, 15);
    for (int r = 0; r<frame.rows; ++r){
        for (int c = 0; c<frame.cols; ++c)
            // 0<H<0.25  -   0.15<S<0.9    -    0.2<V<0.95   
            if ((frame(r, c)[0]>5) && (frame(r, c)[0] < 17) && (frame(r, c)[1]>38) && (frame(r, c)[1]<250) && (frame(r, c)[2]>51) && (frame(r, c)[2]<242)); // do nothing
            else for (int i = 0; i<3; ++i)  frame(r, c)[i] = 0;
    }

    /* BGR CONVERSION AND THRESHOLD */
    Mat1b frame_gray;
    cvtColor(frame, frame, CV_HSV2BGR);
    cvtColor(frame, frame_gray, CV_BGR2GRAY);
    threshold(frame_gray, frame_gray, 60, 255, CV_THRESH_BINARY);
    morphologyEx(frame_gray, frame_gray, CV_MOP_ERODE, Mat1b(3, 3, 1), Point(-1, -1), 3);
    morphologyEx(frame_gray, frame_gray, CV_MOP_OPEN, Mat1b(7, 7, 1), Point(-1, -1), 1);
    morphologyEx(frame_gray, frame_gray, CV_MOP_CLOSE, Mat1b(9, 9, 1), Point(-1, -1), 1);

    medianBlur(frame_gray, frame_gray, 15);
//  imshow("Threshold", frame_gray);

    cvtColor(frame, frame, CV_BGR2HSV);
    resize(frame, frame, Size(), 0.5, 0.5);
    imshow("Video", frame);



    Mat3b image;
    image = imread("E:/hand.jpg", CV_LOAD_IMAGE_COLOR);   // Read the file

    if (!image.data)                              // Check for invalid input
    {
        cout << "Could not open or find the image" << std::endl;
        return -1;
    }
    cvtColor(image, image, CV_BGR2HSV);
    //printf("%d", image(2, 3)[5]);
    //resize(image,image, Size(), 0.5, 0.5);
    namedWindow("Display window", WINDOW_AUTOSIZE);// Create a window for display.
    imshow("Display window", image);                   // Show our image ins
    waitkey(1);
}
4

2 に答える 2

0

この問題に取り組むにはいくつかの方法がありますが、最も広く使用されている明白な方法は、個々の指 (または手の外側を指している部分) を追跡し、特定のルールを記述して各ジェスチャを分類することです (つまり、2 本の指が上から外側を指している)。手は「平和」のシンボルか何かかもしれません)

これを行うには、凸包の欠陥を追跡します。これは、このプロセスを説明するチュートリアルへのリンクです。Python で書かれていますが、ロジックを理解したら C++ に移植できると確信しています。

ただし、各ジェスチャの画像が既にある場合は、分類にニューラル ネットワークを使用することをお勧めします。分類しようとしている画像に似るように、既存の画像を操作してみてください (つまり、肌の検出を行い、画像を 2 値化します)。

これは、ニューラルネットワークとは何か、それらがどのように機能するか、および C++ で画像認識ネットワークを実装する方法を説明するチュートリアルへの別のリンクです。

各ピクセルがネットワークへの入力として使用される可能性が高いため、負荷を軽減する (そしてトレーニングを高速化する) ために、画像のサイズを変更してできるだけ小さくすることをお勧めします (ただし、それでもジェスチャーを理解する)

この情報が少しでもお役に立てば幸いです。頑張ってください!

于 2015-03-10T11:26:47.100 に答える
0

「ビデオの各フレームのジェスチャをイメージ ジェスチャと比較する方法を知る必要があります。」- 重要なのは、どのような類似度がアプリケーションに有効かを判断することです。

画像を比較する万能な方法はなく、ビデオ シーケンスも絶対にありません (画像よりもはるかに難しい問題です)。画像を比較する一般的な方法は、カラー ヒストグラムの「Earth Mover's Distance」です。しかし、これはおそらくあなたの場合にはうまくいきません。さまざまなジェスチャに合わせて訓練された HoG 認識機能を試すことができます。または(たとえば)32x32のような非常に小さなサイズに縮小された画像間のDCT係数の違い。テンプレート マッチング (OpenCV matchTemplate) は、画像をカテゴリ (同じ種類の可能なすべての画像) と比較したいのに、テンプレートがそれを行わないため、ここでは機能しない可能性があります。k 最近傍分類と大規模なサンプル ライブラリ (カテゴリごとに数千)を使用したテンプレート マッチングが機能する可能性があります。

手の形(動かない) ではなく手のジェスチャー(動きのある)を認識するには、文献を読み、公開されているアルゴリズムを実装するのが最善の策です。Google Scholar で「ハンド ジェスチャ認識ビデオ」を検索してみてください。例えば:

最後に、これはかなり難しいでしょう。OpenCV で単純な方法で仕事をすることを期待しないでください。OpenCV には HoG がありますが、これをトレーニングして広範囲に微調整する必要があります。他の公開されたアルゴリズム (3D ウェーブレットなど) は、ゼロから構築するか、別のライブラリを OpenCV に追加する必要があります。幸運を :)

于 2015-03-10T12:38:39.253 に答える