% The legacy drop extraction does not work with these smaller drops (the
% ones that fit on the 36 AWG fibers). They are too faint, so I am
% extracting the information differently.

% Jessica L. Wilson
% June 2021

close all; clear all; clc;
boxWidth = 65;
sensitivity = 0.95;


%% Open each frame, one at a time, extract the circle, return the data on centroids.


shuttleVideo = VideoReader('DSC_1190_Trimmed.mov');  % Change the one below too! 
frames = round(shuttleVideo.FrameRate * shuttleVideo.Duration);
movie_frame_index = 0;
centroids = zeros(frames, 2, 2);

sensitivity = 0.95; % Set it to an initial value once. Hopefully neighboring images will be similar!
sensitivity_minus1 = 0.3; % BS Values
sensitivity_minus2 = 0.4;

while hasFrame(shuttleVideo)
    
    movie_frame_index = movie_frame_index+1;
    disp('Frame: ');
    disp(movie_frame_index);
    Current_Image = readFrame(shuttleVideo);
    Current_Image = rgb2gray(Current_Image);
    Current_Image = imbinarize(Current_Image, ...
        'adaptive', 'ForegroundPolarity','dark','Sensitivity', 0.4);
    
    if movie_frame_index == 1
        % Identify where the fibers are, on the right and on the left.
        RightEdge = Current_Image(:, end);
        LeftEdge = Current_Image(:, 1);
        
        [~,RightLocations] = findpeaks(ones(length(RightEdge), 1) - RightEdge, 'MinPeakProminence', 1, 'MinPeakDistance', 100);
        [~,LeftLocations] = findpeaks(ones(length(LeftEdge), 1) - LeftEdge, 'MinPeakProminence', 1, 'MinPeakDistance', 100);
        
        Fiber1 = floor((LeftLocations(1) + RightLocations(1))/2);
        Fiber2 = floor((LeftLocations(2) + RightLocations(2))/2);
        
    end
    % The box around Fiber1:
    ValidFiber1 = (Fiber1 - boxWidth):(Fiber1 + boxWidth);
    binaryFiber1 = Current_Image(ValidFiber1, :);
    
    % The box around Fiber2:
    ValidFiber2 = (Fiber2 - boxWidth):(Fiber2 + boxWidth);
    binaryFiber2 = Current_Image(ValidFiber2, :);
    
    [centroids(movie_frame_index, 1,:), ~, sensitivity] = searchFiber(binaryFiber1, sensitivity, Fiber1, boxWidth, sensitivity_minus2);
    [centroids(movie_frame_index, 2,:), ~, sensitivity] = searchFiber(binaryFiber2, sensitivity, Fiber2, boxWidth, sensitivity_minus2);
    
%     disp(sensitivity);
    % Why doesn't this update occur? It seems I do not understand the
    % function "searchFiber" well. :(  RESUME HERE tomorrow. OOOO
    sensitivity_minus2 = sensitivity_minus1;
    sensitivity_minus1 = sensitivity;
end

save('DSC_1190_Trimmed', 'centroids');

load chirp.mat;
sound(y);


% framesP1 = frames + 1;
% all_xy_values = reshape(centroids, framesP1*2, 2);
% [idx, FinalClusterLocations] = kmeans(all_xy_values(:, 2), 2);
% t = 1:framesP1;
% figure(10)
% plot(t, centroids(:, 2, 1), '*')
% hold on;
% plot(t, centroids(:, 2, 2), '*')

function [center, radius, sensitivity] = searchFiber(fiberImage, sensitivity, fiberHeight, boxWidth, sensitivity_minus2)

WrongNumDrops = true;
while WrongNumDrops
    
    [center, radius] = imfindcircles(fiberImage,[55 75], 'Sensitivity', sensitivity);
    
    
    
%     if sensitivity == sensitivity_minus2
%         disp('Infinite loops! Increase your resolution!');
%         return;
%     end
    
    if size(center, 1) > 1
        sensitivity = sensitivity - 0.0001;
    elseif size(center, 1) < 1
        sensitivity = sensitivity + 0.0001;
    else
        WrongNumDrops = false;
        %         figure(1);
        %         imshow(fiberImage, 'InitialMagnification', 'fit')
        %         h = viscircles(center, radius);
        %         pause(1);
        center(2) = center(2) + fiberHeight - boxWidth;
    end
    disp(sensitivity);
end

end






