2016-03-15 4 views
2

Я пытаюсь обнаружить ирисы глаз, но HoughCircles возвращает 0 кругов.Почему HoughCircles возвращает 0 кругов, пытаясь определить ирисы?

Исходное изображение (глаза) является:

Input image

Тогда я сделал следующие вещи с этим изображением:

cvtColor(eyes, gray, CV_BGR2GRAY); 
morphologyEx(gray, gray, 4,cv::getStructuringElement(cv::MORPH_RECT,cv::Size(3,3))); 
threshold(gray, gray, 0, 255, THRESH_OTSU); 
vector<Vec3f> circles; 
HoughCircles(gray, circles, CV_HOUGH_GRADIENT, 2, gray.rows/4); 
if (circles.size()) 
     cout << "found" << endl; 

Таким образом, окончательный серое изображение выглядит следующим образом:

Output image

I Я нашел этот вопрос Using HoughCircles to detect and measure pupil and iris, но это не помогло мне, несмотря на сходство с моей проблемой.

Почему HoughCircles возвращает 0 кругов, пытаясь определить ирисы? Если кто-то знает лучший способ найти ирисы, пожалуйста.

ответ

3

Я столкнулся с одной и той же проблемой по той же самой проблеме. Оказывается, houghcircles не очень хороший метод для обнаружения не очень хорошо сформированных кругов.

Методы обнаружения элементов, такие как MSER, работают лучше в этих случаях.

import cv2 
import math 
import numpy as np 
import sys 

def non_maximal_supression(x): 
    for f in features: 
     distx = f.pt[0] - x.pt[0] 
     disty = f.pt[1] - x.pt[1] 
     dist = math.sqrt(distx*distx + disty*disty) 
     if (f.size > x.size) and (dist<f.size/2): 
      return True 

thresh = 70 
img = cv2.imread(sys.argv[1]) 
bw = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) 

detector = cv2.FeatureDetector_create('MSER') 
features = detector.detect(bw) 
features.sort(key = lambda x: -x.size) 

features = [ x for x in features if x.size > 70] 
reduced_features = [x for x in features if not non_maximal_supression(x)] 

for rf in reduced_features: 
    cv2.circle(img, (int(rf.pt[0]), int(rf.pt[1])), int(rf.size/2), (0,0,255), 3) 

cv2.imshow("iris detection", img) 
cv2.waitKey() 

detected iris regions

В качестве альтернативы вы можете попробовать сверточных фильтров.

EDIT: Для тех, кто имеют проблемы с C++ MSER, here является основной сутью.

+0

Можете ли вы дать мне подсказку, как реализовать MSER в C++? Для меня это не тривиально из-за плохой документации opencv. – albertpod

+0

[Здесь] (https://gist.github.com/VasanthKumarB/588944f47e6a1664b43e) является примером. Я оставлю часть не максимального максимального подавления для вас. – Vasanth

+0

Можете ли вы преобразовать этот код в Java? – mumu

Смежные вопросы