%% Detekcja twarzy z użyciem kamery – z wyłączaniem okna przy naciśnięciu 'q' % Wymagania: % - MATLAB (wersja co najmniej R2014b) % - Computer Vision Toolbox %% 1. Inicjalizacja detektora i kamery faceDetector = vision.CascadeObjectDetector('FrontalFaceCART'); cams = webcamlist; if isempty(cams) error('Nie wykryto żadnej kamery. Sprawdź połączenie i sterowniki.'); end cam = webcam(1); % (opcjonalnie) ustaw rozdzielczość: % cam.Resolution = '640x480'; %% 2. Utworzenie okna figure do wyświetlania strumienia hFig = figure('Name', 'Detekcja twarzy - naciśnij ''q'', aby wyłączyć', ... 'NumberTitle', 'off', ... 'KeyPressFcn', @(src, ev) assignin('base', 'keyPressed', ev.Key)); % Inicjalizujemy zmienną w bazie workspace, żebyśmy mogli odczytywać, czy % wciśnięto 'q'. (Można też skorzystać z get(hFig,'CurrentCharacter'), ale % w tej wersji użyjemy prostego KeyPressFcn przypisującego do base.) % Pobieramy jedną pustą klatkę, żeby utworzyć obiekt obrazu w osi frame0 = snapshot(cam); hAx = axes('Parent', hFig); hImage = imshow(frame0, 'Parent', hAx); title(hAx, 'Trwa detekcja...'); % Zainicjalizujemy w workspace zmienną keyPressed na pusty znak assignin('base', 'keyPressed', ''); %% 3. Główna pętla detekcji disp('Rozpoczynam detekcję. Naciśnij ''q'', aby zakończyć.'); while ishandle(hFig) % Pobranie i przetworzenie klatki rgbFrame = snapshot(cam); grayFrame = rgb2gray(rgbFrame); bboxes = faceDetector.step(grayFrame); % Dodanie adnotacji, jeśli wykryto twarze if ~isempty(bboxes) labels = repmat("Twarz", size(bboxes,1), 1); rgbFrame = insertObjectAnnotation(rgbFrame, ... 'rectangle', ... bboxes, ... labels, ... 'Color', 'green', ... 'FontSize', 12, ... 'LineWidth', 2); end % Wyświetlenie zmodyfikowanej klatki w oknie figure set(hImage, 'CData', rgbFrame); drawnow; % wymuszenie odświeżenia okna % Sprawdzenie, czy naciśnięto 'q' key = evalin('base', 'keyPressed'); if strcmpi(key, 'q') break; end % Możemy „wyczyścić” zmienną, żeby ponownie wykryć późniejsze naciśnięcia assignin('base', 'keyPressed', ''); end %% 4. Zwolnienie zasobów if ishandle(hFig) close(hFig); end clear cam; disp('Zakończono detekcję twarzy.');