13

私は目の瞳孔を追跡することを目的としたプロジェクトに取り組んでいます。このために、目の画像をキャプチャするヘッドマウント システムを作成しました。ハードウェア部分は完成しているのですが、ソフトウェア部分に打ち込んでいますopencvを使用しています。生徒を追跡する最も効率的な方法を教えてください。ハフサークルの業績は芳しくありませんでした。

その後、HSVフィルターも試しました。コードと、生画像と処理済み画像のスクリーンショットへのリンクがあります。この問題を解決するのを手伝ってください。リンクには、このコードで使用している瞳孔のビデオも含まれています。

https://picasaweb.google.com/118169326982637604860/16November2011?authuser=0&authkey=Gv1sRgCPKwwrGTyvX1Aw&feat=directlink

コード:

include "cv.h"

include"highgui.h"

IplImage* GetThresholdedImage(IplImage* img)
{

    IplImage *imgHSV=cvCreateImage(cvGetSize(img),8,3);
    cvCvtColor(img,imgHSV,CV_BGR2HSV);
    IplImage *imgThresh=cvCreateImage(cvGetSize(img),8,1);
    cvInRangeS(imgHSV,cvScalar(0, 84, 0, 0),cvScalar(179, 256, 11, 0),imgThresh);
    cvReleaseImage(&imgHSV);
    return imgThresh;
}

void main(int *argv,char **argc)
{

    IplImage *imgScribble= NULL;
    char c=0;
    CvCapture *capture;
    capture=cvCreateFileCapture("main.avi");

    if(!capture)
    {
        printf("Camera could not be initialized");
        exit(0);
    }
    cvNamedWindow("Simple");
    cvNamedWindow("Thresholded");

    while(c!=32)
    {
        IplImage *img=0;
        img=cvQueryFrame(capture);
        if(!img)
            break;
        if(imgScribble==NULL)
            imgScribble=cvCreateImage(cvGetSize(img),8,3);

        IplImage *timg=GetThresholdedImage(img);
        CvMoments *moments=(CvMoments*)malloc(sizeof(CvMoments));
        cvMoments(timg,moments,1);

        double moment10 = cvGetSpatialMoment(moments, 1, 0);
        double moment01 = cvGetSpatialMoment(moments, 0, 1);
        double area = cvGetCentralMoment(moments, 0, 0);

        static int posX = 0;
        static int posY = 0;

        int lastX = posX;
        int lastY = posY;

        posX = moment10/area;
        posY = moment01/area;
         // Print it out for debugging purposes
        printf("position (%d,%d)\n", posX, posY);
        // We want to draw a line only if its a valid position
        if(lastX>0 && lastY>0 && posX>0 && posY>0)
        {
            // Draw a yellow line from the previous point to the current point
            cvLine(imgScribble, cvPoint(posX, posY), cvPoint(lastX, lastY), cvScalar(0,255,255), 5);
        }
        // Add the scribbling image and the frame...

        cvAdd(img, imgScribble, img);

        cvShowImage("Simple",img);
        cvShowImage("Thresholded",timg);
        c=cvWaitKey(3);
        cvReleaseImage(&timg);
        delete moments;

    }
    //cvReleaseImage(&img);
    cvDestroyWindow("Simple");
    cvDestroyWindow("Thresholded");

}

目を追跡して、瞳孔の中心座標を正確に見つけることができました。

最初に、ヘッド マウント カメラで撮影した画像をしきい値処理しました。その後、輪郭検索アルゴリズムを使用して、すべての輪郭の重心を見つけました。これにより、目の瞳孔の中心座標が得られます。この方法はリアルタイムで正常に機能し、まばたきを非常に正確に検出します。

今、私の目標は、この機能をゲーム (レーシング ゲーム) に組み込むことです。左/右を見ると車は左/右に動き、まばたきすると車は減速します。どうすれば今進むことができますか??? それを行うにはゲームエンジンが必要ですか?

Visual Studio 2010 (unity など) と互換性のあるオープン ソースのゲーム エンジンがいくつかあると聞きました。実現可能ですか???はいの場合、どのように進めればよいですか?

4

3 に答える 3

10

私は SimpleCV の開発者の 1 人です。私たちは、コンピュータ ビジョン用のオープンソースの Python ライブラリを維持しています。SimpleCV.orgからダウンロードできます。SimpleCV は、コマンド ラインをハッキングすることで、この種の問題を解決するのに最適です。ほんの数行のコードで瞳孔を抽出することができました。どうぞ:

img = Image("eye4.jpg") # load the image
bm = BlobMaker() # create the blob extractor
# invert the image so the pupil is white, threshold the image, and invert again
# and then extract the information from the image
blobs = bm.extractFromBinary(img.invert().binarize(thresh=240).invert(),img)

if(len(blobs)>0): # if we got a blob
    blobs[0].draw() # the zeroth blob is the largest blob - draw it
    locationStr = "("+str(blobs[0].x)+","+str(blobs[0].y)+")"
    # write the blob's centroid to the image
    img.dl().text(locationStr,(0,0),color=Color.RED)
    # save the image
    img.save("eye4pupil.png")
    # and show us the result.
    img.show()

これが結果です。

したがって、次のステップは、カルマン フィルターなどの何らかのトラッカーを使用して、瞳孔を確実に追跡することです。目を球としてモデル化し、瞳孔の重心を球座標 (シータとファイ) で追跡することができます。また、ユーザーがまばたきをしたときにシステムが不安定にならないように、まばたきイベントを検出するためのコードを少し書きたいと思うでしょう。キャニー エッジ検出器を使用して画像内の最大の水平線を見つけ、それらがまぶたであると仮定することをお勧めします。これがお役に立てば幸いです。作業の進捗状況をお知らせください。

于 2011-11-16T03:36:40.660 に答える
2

それはすべて、システムがどれだけ優れている必要があるかにかかっています。大学の 2 か月間のプロジェクトの場合は、Kscottz 氏が推奨するように、いくつかのブロブを見つけて追跡するか、既製のソリューションを使用しても問題ありません。

しかし、より本格的なシステムを目指すのであれば、より深く行かなければなりません。

私がお勧めするアプローチは、顔の関心点を検出することです。良い例は、顔の追跡に最も適していると思われる Active Appearance Models です。

http://www2.imm.dtu.dk/~aam/

http://www.youtube.com/watch?v=M1iu__viJN8

コンピューター ビジョン アルゴリズムの十分な理解、優れたプログラミング スキル、および多少の作業が必要です。しかし、結果は努力する価値があります。

また、デモが顔全体の追跡を示しているという事実に惑わされないでください。手、目、花、葉など、あらゆるものを追跡するようにトレーニングできます。

(AAM を始める前に、他の顔追跡アルゴリズムについてもっと読みたいと思うかもしれません。それらはあなたにとってより良いかもしれません)

于 2011-11-16T06:52:03.157 に答える
1

これが私の解決策です。目を追跡して、瞳孔の中心座標を正確に見つけることができます。

最初に、ヘッド マウント カメラで撮影した画像をしきい値処理しました。その後、輪郭検索アルゴリズムを使用して、すべての輪郭の重心を見つけました。これにより、目の瞳孔の中心座標が得られます。この方法はリアルタイムで正常に機能し、まばたきを非常に正確に検出します。

于 2011-11-20T04:04:53.107 に答える