2013-07-26 25 views
5

Tôi đang cố gắng sử dụng OpenCV, cụ thể hơn là HoughCircles để phát hiện và đo lường học sinh và mống mắt, hiện tại tôi đang chơi với một số biến trong hàm, vì nó hoặc trả về 0 vòng kết nối hoặc một số tiền quá mức. Dưới đây là mã và hình ảnh thử nghiệm tôi đang sử dụng.Sử dụng HoughCircles để phát hiện và đo lường học sinh và mống mắt

Mã cho iris đo:

eye1 = [self increaseIn:eye1 Contrast:2 andBrightness:0]; 

cv::cvtColor(eye1, eye1, CV_RGBA2RGB); 
cv::bilateralFilter(eye1, eye2, 75, 100, 100); 

cv::vector<cv::Vec3f> circles; 

cv::cvtColor(eye2, eye1, CV_RGBA2GRAY); 

cv::morphologyEx(eye1, eye1, 4, cv::getStructuringElement(cv::MORPH_RECT,cv::Size(3, 3))); 
cv::threshold(eye1, eye1, 0, 255, cv::THRESH_OTSU); 

eye1 = [self circleCutOut:eye1 Size:50]; 

cv::GaussianBlur(eye1, eye1, cv::Size(7, 7), 0); 

cv::HoughCircles(eye1, circles, CV_HOUGH_GRADIENT, 2, eye1.rows/4); 

Mã để đo học sinh:

eye1 = [self increaseBlackPupil:eye1]; 
    cv::Mat eye2 = cv::Mat::zeros(eye1.rows, eye1.cols, CV_8UC3); 

    eye1 = [self increaseIn:eye1 Contrast:2 andBrightness:0]; 

    cv::cvtColor(eye1, eye1, CV_RGBA2RGB); 
    cv::bilateralFilter(eye1, eye2, 75, 100, 100); 

    cv::threshold(eye2, eye1, 25, 255, CV_THRESH_BINARY); 

    cv::SimpleBlobDetector::Params params; 
    params.minDistBetweenBlobs = 75.0f; 
    params.filterByInertia = false; 
    params.filterByConvexity = false; 
    params.filterByCircularity = false; 
    params.filterByArea = true; 
    params.minArea = 50; 
    params.maxArea = 500; 

    cv::Ptr<cv::FeatureDetector> blob_detector = new cv::SimpleBlobDetector(params); 
    blob_detector->create("SimpleBlob"); 
    cv::vector<cv::KeyPoint> keypoints; 
    blob_detector->detect(eye1, keypoints); 

enter image description here

Tôi biết hình ảnh là thô, Tôi cũng đã cố gắng để tìm cách dọn sạch và làm cho các cạnh rõ ràng hơn.

Vì vậy, câu hỏi của tôi để đặt nó rõ ràng: Tôi có thể làm gì để điều chỉnh các tham số trong hàm HoughCircles hoặc thay đổi hình ảnh để làm cho mống mắt và học sinh được phát hiện?

Cảm ơn

Trả lời

2

Ok, mà không cần thử nghiệm quá nhiều, những gì tôi hiểu là bạn đã chỉ áp dụng một bộ lọc song phương với những hình ảnh trước khi sử dụng các máy dò vòng tròn Hough.

Theo ý kiến ​​của tôi, bạn cần phải bao gồm một bước đẩy mạnh vào quy trình.

tôi lấy hình ảnh mẫu mà bạn cung cấp trong bài và làm cho nó trải qua các bước sau:

  1. chuyển đổi sang thang màu xám

  2. hình thái độ dốc

  3. ngưỡng

  4. phát hiện vòng tròn hough.

sau khi bước ngưỡng, tôi có hình ảnh sau đây để chỉ mắt trái:

thresholded image

đây là các mã:

greyscale:

cvCvtColor(im_rgb,im_rgb,CV_RGB2GRAY); 

hình thái :

 cv::morphologyEx(im_rgb,im_rgb,4,cv::getStructuringElement(cv::MORPH_RECT,cv::Size(size,size))); 

ngưỡng:

cv::threshold(im_rgb, im_rgb, low, high, cv::THRESH_OTSU); 

hough vòng tròn phát hiện:

cv::vector<cv::Vec3f> circles; 
    cv::HoughCircles(im_rgb, circles, CV_HOUGH_GRADIENT, 2, im_rgb.rows/4); 

Bây giờ khi tôi in:

NSLog(@"Found %ld cirlces", circles.size()); 

tôi nhận được:

 "Found 1 cirlces" 

Hy vọng điều này sẽ hữu ích.

+0

'im_rgb' là 'eye1' trong trường hợp của bạn. – metsburg

+1

cho 'kích thước' của phần tử cấu trúc trong phần hình thái học, tôi đã sử dụng giá trị tĩnh là 5 cho tham số kích thước. – metsburg

+0

đã làm việc này hay không, eh? – metsburg

Các vấn đề liên quan