簡體   English   中英

OpenCV Iris Detection C ++

[英]OpenCV Iris Detection C++

目標:我正在嘗試使用視頻作為輸入來獲取虹膜的大小(寬度/半徑)。

我已經嘗試過HoughCircles,但似乎它並不准確,因為虹膜圈似乎不那么准確。 我已經獲得的信息是眼睛瞳孔的中心點及其半徑。

灰度眼

有人建議我找到虹膜邊緣來嘗試測量從瞳孔中心向外開始的梯度大小。 然后使用直方圖使用最大漸變的累積來找到虹膜寬度。 從具體的角度出發,我不確定以哪種方式實現這一點。

我在眼睛ROI上使用了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);
}

我不確定下一步該怎么做。 任何建議或意見表示贊賞。 如果我錯過任何信息或者我對某些事情含糊不清,也請告訴我。 非常感謝提前!

編輯:我應該更好地解釋我的應用程序的上下文,所以我為此道歉。 我正在測量來自視頻輸入的幀的瞳孔擴張。 我已經知道瞳孔中心點的位置和瞳孔的半徑。 我試圖找到虹膜的大小,以便可以使用從眼睛到相機的距離的變化來補償瞳孔大小的誤解值,因為如果眼睛變得更接近相機,瞳孔當然會出現沒有擴張的更大。 我也可能嘗試其他方法來解釋這一點,例如眼角,但我認為,因為我已經有幾個瞳孔特征,我將從虹膜開始。

再次,很抱歉以前留下這個細節。 謝謝!

我認為你應該使用虹膜內部有黑圈的事實。

這是我在您的圖像上進行簡單的黑色分割后得到的結果:

分段圖像

並且看起來真正的虹膜比這個黑色圓圈大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();
    }
}

澄清您在問題中談到的建議:

“有人建議我找到虹膜邊緣來嘗試測量從瞳孔中心向外開始的漸變幅度。然后使用直方圖使用漸變最大值的累積來找到虹膜寬度。我不完全確定以何種方式實現這一點,從特定的角度出發。“

你可以具體做的是從你的瞳孔中心開始,並執行一個區域增長算法,你的停止條件,而不是,例如,一個太不相同的灰度值,是你的漸變幅度的閾值。 一些偽代碼:

initalize list of points with center of your pupil
initialize a mask image to zero
while list of point is not empty
   point pt = pop()
   set maskImage at pt to 255
   for  pt2 in pt neighbourhood
       if (gradientMagnitude at pt2 < THRESHOLD and maskImage at pt2 == 0)
          list of points.add (pt2)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM