2010-10-20 29 views
8

Tôi đang tìm một số gợi ý về cách tiếp cận vấn đề về thị lực máy tính sau đây. Dưới đây là 4 mẫu dữ liệu theo dõi mắt mà tôi đang làm việc. Tôi muốn viết mã có một hình ảnh như vậy và tính toán (x, y) vị trí của trung tâm của học sinh. Tôi hiện đang sử dụng MATLAB, nhưng tôi cũng mở để sử dụng phần mềm khác.Theo dõi mắt: tìm học sinh (x, y)

Ai đó có thể đề xuất phương pháp tôi có thể sử dụng cho tác vụ này không? Dưới đây là một số điều tôi đã thử nhưng không hoạt động tốt.

  • Tôi đã cố gắng sử dụng chuyển đổi háng vòng tròn, nhưng điều đó đòi hỏi tôi phải đoán bán kính của học sinh, điều này có vấn đề một chút. Ngoài ra, do sự biến dạng, học sinh không phải lúc nào cũng chính xác là một vòng tròn, mà có thể làm cho phương pháp tiếp cận này khó hơn.
  • Tôi đã cố gắng làm nổi bật hình ảnh dựa trên độ sáng pixel và sử dụng chức năng MATLAB regionprops để tìm vùng có diện tích khoảng 200 pixel với độ lệch tâm rất thấp (ví dụ như hình tròn nhất có thể). Tuy nhiên, điều này rất nhạy cảm với giá trị ngưỡng, và một số hình ảnh của mắt sáng hơn những hình ảnh khác dựa trên điều kiện ánh sáng. (Lưu ý 4 mẫu dưới đây có nghĩa là đã chuẩn hóa bình thường và vẫn là một trong những hình ảnh sáng hơn so với những hình ảnh khác có thể do một số pixel ngẫu nhiên rất tối ở đâu đó)

Mọi bình luận/đề xuất sẽ được đánh giá cao!

EDIT: cảm ơn cho bình luận Stargazer. Thuật toán lý tưởng nên có thể xác định rằng học sinh không có trong hình ảnh, như trường hợp của mẫu cuối cùng. Nó không phải là một vấn đề lớn nếu tôi mất dấu vết của nó trong một thời gian. Nó tệ hơn nhiều nếu nó cho tôi câu trả lời sai.

alt text

+2

Vâng, ít nhất, đừng thất vọng nếu bạn tìm thấy thuật toán chỉ hoạt động trong ba bước đầu tiên. Ngay cả tôi cũng không thể tìm thấy học sinh ở lớp 4. – riwalk

+1

Tôi hiểu rằng, tất nhiên. Thuật toán nên trong trường hợp đó xác định rằng, lý tưởng. – karpathy

+0

Điều này sẽ làm các trick cho bạn! http://stackoverflow.com/a/11316882/1458387 – Anirudh

Trả lời

4

Tôi không chắc chắn nếu điều này có thể giúp bạn, bởi vì bạn đang sử dụng một tập dữ liệu và tôi không biết sự linh hoạt của bạn/cần phải thay đổi các thiết bị chụp. Chỉ trong trường hợp, chúng ta hãy đi.

Morimoto et al. sử dụng mẹo chụp ảnh đẹp. Họ đã tạo một máy ảnh với hai bộ đèn LED hồng ngoại. Bộ đầu tiên được đặt gần ống kính camera. Cái thứ hai được đặt xa ống kính. Sử dụng các tần số khác nhau, hai bộ đèn led được bật trong những khoảnh khắc khác nhau.

Retina sẽ phản chiếu ánh sáng từ bộ gần ống kính máy ảnh (điều tương tự về vấn đề mắt đỏ trong nhiếp ảnh), tạo ra học sinh sáng. Tập hợp các led khác sẽ tạo ra một học sinh tối tối. Compare the results. Vì vậy, sự khác biệt đơn giản giữa hai hình ảnh cung cấp cho bạn một học sinh gần hoàn hảo. Hãy xem xét cách Morimoto et al. khám phá glint (tốt để tiếp cận hướng nhìn).

+0

Cảm ơn, nhưng tiếc là tôi không có quyền truy cập vào thiết lập vật lý , Tôi chỉ có dữ liệu và cần chạy một số phân tích. Dữ liệu đi kèm với kết quả theo dõi, nhưng tôi nghĩ tôi có thể nghĩ ra điều gì đó tốt hơn/mượt mà hơn. Hóa ra vấn đề là khó khăn hơn tôi đã dự đoán ban đầu :) – karpathy

3

Sử dụng Python tích hợp OpenCV. . . Nó sẽ rất dễ dàng cho người mới bắt đầu làm việc trên OpenCV.

Thủ tục:
* Nếu bạn đang sử dụng webcam bình thường
1. quá trình đầu tiên khung với chức năng VideoCapture
2. Convert nó sang Gray Scale Image.
3. Tìm Canny Edges sử dụng hàm cv2.Canny()
4. Áp dụng hàm HoughCircles. Nó sẽ tìm thấy các vòng tròn trong hình ảnh cũng như trung tâm của hình ảnh.
5. Sử dụng các tham số kết quả của HoughCirlces để vẽ vòng tròn xung quanh học sinh. Đó là nó.

+0

Tôi đã áp dụng Canny vào phần mềm của tôi và nó tạo ra kết quả rất tốt! Cảm ơn. – Arsen

+0

@Arsen Cảm ơn ... Tôi sẽ kiểm tra xem ... –

0

OpenCV với Python, C, C++, Java và các công cụ khác sẽ là một công cụ tốt để thực hiện điều đó. Có một hướng dẫn cho Python ở đây: http://docs.opencv.org/trunk/doc/py_tutorials/py_objdetect/py_face_detection/py_face_detection.html, nhưng chắc chắn có các hướng dẫn khác ngoài đó cho các ngôn ngữ được hỗ trợ khác. OpenCv có một số Haar Cascades ngay ra khỏi hộp, một cho mắt phát hiện bao gồm. Nếu bạn thực sự muốn triển khai một giải pháp sử dụng HoughCircleTransform, OpenCv cũng có chức năng thích hợp cho nó.

0
import java.awt.Robot;%Add package or class to current import listimport java.awt.event.*;robot = Robot();objvideoinput('winvideo',2);%to set the device ID and supported format set(obj, 'FramesPerTrigger', Inf);% trigger infinite set(obj, 'ReturnedColorspace', 'rgb')%video in RGB format obj.FrameGrabInterval = 5;%the object acquires every %5th frame from the video stream start(obj)% to start the vedio time=0;NumberOfFrames=while(true)data=getsnapshot(obj);image(data);filas=size(data,1);columnas=size(data,2);% Centercentro_fila=round(filas/2);centro_columna=round(columnas/2);figure(1);if size(data,3)==3data=rgb2gray(data);% Extract edges.BW = edge(data,'canny')[H,T,R] = hough(BW,'RhoResolution',0.5,'Theta',-90:0.5:89.5);endsubplot(212)piel=~im2bw(data,0.19);piel=bwmorph(piel,'close');piel=bwmorph(piel,'open');piel=bwareaopen(piel,275);piel=imfill(piel,'holes');imagesc(piel);% Tagged objects in BW imageL=bwlabel(piel);% Get areas and tracking rectangleout_a=regionprops(L);% Count the number of objectsN=size(out_a,1);if N < 1 || isempty(out_a) % Returns if no object in the imagesolo_cara=[ ];continue end % Select larger area areas=[out_a.Area];[area_max pam]=max(areas);subplot(211)imagesc(data);colormap grayhold on rectangle('Position',out_a(pam).BoundingBox,'EdgeColor',[1 0 0],...'Curvature', [1,1],'LineWidth',2)centro=round(out_a(pam).Centroid);X=centro(1);Y=centro(2);robot.mouseMove(X,Y);text(X+10,Y,['(',num2str(X),',',num2str(Y),')'],'Color',[1 1 1])if X<centro_columna && Y<centro_fila 
title('Top left')elseif X>centro_columna && Y<centro_fila 
title('Top right')elseif X<centro_columna && Y>centro_fila 
title('Bottom left')else 
title('Bottom right') 
+0

phơi bày và triển khai mã trên..in matlab –

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