4

目標:ビデオを入力として使用して、虹彩のサイズ(幅/半径)を取得しようとしています。

HoughCirclesを試しましたが、虹彩の円があまり正確ではないようで、正確ではないようです。私がすでに持っている情報は、目の瞳孔の中心点とその半径です。

グレースケールアイ

瞳孔の中心から外側に向かって勾配の大きさを測定するために、虹彩のエッジを見つけることが私に提案されました。次に、最大勾配の累積を使用してヒストグラムを使用して、虹彩の幅を見つけます。特定のポイントから始めて、これをどのように実装するかは正確にはわかりません。

目のROIでSobel演算子を使用して、以下に示す出力で勾配を取得しようとしました。

ソベルアイ

Sobel画像コード:

void irisFind(Mat gradMat, Point2i pupCenter, int pupRad){

imshow("original", gradMat);


Mat gradX;
Mat gradY;
Mat absGradX;
Mat absGradY;

GaussianBlur(gradMat, gradMat, Size(3, 3), 0, 0, BORDER_DEFAULT);
equalizeHist(gradMat, gradMat);

//Generate Gradient along x
Sobel(gradMat, gradX, CV_16S, 1, 0, 3, 1, 0, BORDER_DEFAULT);
convertScaleAbs(gradX, absGradX);

//Generate Gradient along y
Sobel(gradMat, gradY, CV_16S, 0, 1, 3, 1, 0, BORDER_DEFAULT);
convertScaleAbs(gradY, absGradY);

addWeighted(absGradX, .5, absGradY, .5, 0, gradMat);

imshow("Sobel", gradMat);
}

次の進め方がよくわかりません。任意の提案やコメントをいただければ幸いです。また、情報を見逃したり、漠然としたことをしたりした場合はお知らせください。よろしくお願いします!

編集:私は私のアプリケーションのコンテキストをよりよく説明する必要があったので、それをお詫びします。私はビデオ入力からのフレーム上の目の瞳孔散瞳を測定しています。瞳孔の中心点の位置と瞳孔の半径はすでにわかっています。私は虹彩のサイズを見つけようとしています。これは、目からカメラまでの距離の変化を使用して、瞳孔のサイズの誤った解釈値を補正できるようにするためです。目がカメラに近づくと、もちろん瞳孔が現れるからです。膨張せずに大きくなります。目の角など、これを説明する他の方法も試すかもしれませんが、私はすでにいくつかの瞳孔の特徴を持っているので、虹彩から始めると思いました。

繰り返しになりますが、前にこの詳細を省略して申し訳ありません。ありがとう!

4

2 に答える 2

2

虹彩の中に黒い丸があることを利用するといいと思います。

画像の単純な黒色セグメンテーションの後に得たものは次のとおりです。

分割画像

そして、本物の虹彩はこの黒い円の3倍から4倍の大きさのようです。だから、ここに結果があります:

結果イメージ

ソースコードをお探しですか? これです:

int main()
{
    Mat src = imread("input.jpg", CV_LOAD_IMAGE_GRAYSCALE), tmp;

    imshow("Source", src);

    double minVal = 0;
    minMaxLoc(src, &minVal, NULL, NULL, NULL);

    threshold(src, tmp, minVal + 10, 255, THRESH_BINARY_INV);

    //(Optional) remove noise (small areas of white pixels)
/*
    Mat element = getStructuringElement(MORPH_ELLIPSE, Size(3, 3), Point(1, 1));
    erode(tmp, tmp, element);
    dilate(tmp, tmp, element);
*/
    vector<Vec4i> hierarchy;
    vector<vector<Point2i> > contours;
    findContours(tmp, contours, hierarchy, CV_RETR_LIST, CV_CHAIN_APPROX_SIMPLE);

    //find contour with max area
    int maxArea = 0;
    Rect maxContourRect;
    for (int i=0; i<contours.size(); i++)
    {
        int area = contourArea(contours[i]);
        Rect rect = boundingRect(contours[i]);
        double squareKoef = ((double) rect.width)/rect.height;

        //check if contour is like square (shape)
#define SQUARE_KOEF 1.5
        if (area>maxArea && squareKoef < SQUARE_KOEF && squareKoef > 1.0/SQUARE_KOEF)
        {
            maxArea = area;
            maxContourRect = rect;
        }
    }

    if (maxArea == 0)
    {
        std::cout << "Iris not found!" << std::endl;
    }
    else
    {
        Rect drawRect = Rect(maxContourRect.x-maxContourRect.width, maxContourRect.y-maxContourRect.height, maxContourRect.width*3, maxContourRect.height*3);

        rectangle(src, drawRect, Scalar(0), 1);

        imshow("Dest", src);
        waitKey();
    }
}
于 2012-10-11T17:28:08.070 に答える