%% Pořízení snímků ke kalibraci kamer a prostorové rekonstrukci
% Následující skript slouží k pořízení snímků ke kalibraci dvojice webkamer
% a jejich následné kalibrace, nebo k pořízení snímků k rekonstrukci
% otáčejícího se objektu. V úvodní části uživatel zvolí režim programu. 
%
% Požadované skripty:
%    1. žádné
%
% Požadované toolboxy:
%    1. Computer Vision Toolbox
%
% Vytvořeno v rámci bakalářské práce na téma Vytvoření 3D modelu za pomoci 
% laserového vzoru.
% Martin Krátký
% Vysoké učení technické v Brně
% Květen 2019
% Práce je dostupná na webové adrese:
% https://www.vutbr.cz/studenti/zav-prace/detail/119313 
%

clear variables
close all

%% Definice kamer
camList = webcamlist;
if(size(camList,1) > 1)
    camRight = webcam(1);
    camLeft = webcam(2);
else
    cam = webcam(1);
end

calibOn = 1;    % Režim kalibrace
                % 1 - Ano
                % 0 - Ne
                
recOn = 0;      % Režim rekonstrukce
                % 1 - Ano
                % 0 - Ne

landscape = 0;  % Pozice kamer na šířku
                % 1 - Ano
                % 0 - Ne

color = 0;      % Pořizování snímků zaznamenávajících texturu (pouze v 
                % režimu rekonstrukce
                % 1 - Ano
                % 0 - Ne

%% Kalibrace kamer
if calibOn
%Pořízení snímků
fprintf('Kalibrace kamer.\nPřiprav kamery a kalibrační mřížku.\n');

preview(camRight)
preview(camLeft)

numOfImagesCalib = str2num(input('Zadej počet snímků ke kalibraci: ', 's'));
imgRCalib = {0};
imgLCalib = {0};

mkdir camRightCalib
mkdir camLeftCalib

for i = 1:numOfImagesCalib
    s = ' ';
    fprintf('Po stisku libovolne klávesy se pořídí snímky č. %d\n', i);
    while strcmp(s,' ')
      s = input(' ','s'); 
    end 
    imgRCalib{i} = snapshot(camRight);
    imgLCalib{i} = snapshot(camLeft);
    
    if ~landscape
        imgRCalib{i}=rot90(imgRCalib{i});
        imgLCalib{i}=rot90(imgLCalib{i});
    end

    fprintf('Snímky č. %d pořízeny\n', i);

    fileNameR = sprintf('calibrationR%d.jpg',i);
    imwrite(imgRCalib{i},fileNameR)
    movefile(fileNameR,'camRightCalib')
    fileNameL = sprintf('calibrationL%d.jpg',i);
    imwrite(imgLCalib{i},fileNameL)
    movefile(fileNameL,'camLeftCalib')
end
closepreview
squareSize = str2double(input('Zadej délku čtverce kalibrační mřížky v milimetrech: ', 's'));
stereoCameraCalibrator('camRightCalib','camLeftCalib', squareSize);

end
%% Pořízení snímků k rekonstrukci - 2 kamery
if recOn

mkdir camRight
mkdir camLeft

imgR = {0};
imgL = {0};

preview(camRight)
preview(camLeft)

n = str2num(input('Zadej počet snímků k rekonstrukci: ', 's'));

fprintf('Po stisku libovolné klávesy začne automatické pořizování snímků s laserovým vzorem.\n');
pause
for i = 2:n+1
    imgR{i} = snapshot(camRight);
    imgL{i} = snapshot(camLeft);
    if ~landscape
        imgR{i}=rot90(imgR{i});
        imgL{i}=rot90(imgL{i});
    end
    fprintf('Snímky č. %d pořízeny\n', i);
    fileNameR = sprintf('snapR%d.jpg',i);
    imwrite(imgR{i},fileNameR)
    movefile(fileNameR,'camRight')
    fileNameL = sprintf('snapL%d.jpg',i);
    imwrite(imgL{i},fileNameL)
    movefile(fileNameL,'camLeft')
    pause(3.04)
end
if color
    fprintf('Po stisku libovolné klávesy začne automatické pořizování snímků zachycujících texturu.\n');
    pause
    for i = 1:n
        imgRcolor{i} = snapshot(camRight);
        imgLcolor{i} = snapshot(camLeft);
        if ~landscape
            imgRcolor{i}=rot90(imgRcolor{i});
            imgLcolor{i}=rot90(imgLcolor{i});
        end
        fileNameR = sprintf('snapR%d.jpg',i);
        imwrite(imgRcolor{i},fileNameR)
        movefile(fileNameR,'camRight')
        fileNameL = sprintf('snapL%d.jpg',i);
        imwrite(imgLcolor{i},fileNameL)
        movefile(fileNameL,'camLeft')
        pause(3.04)
    end
end

fprintf('Po stisku libovolné klávesy se pořídí snímek zachycující osu rotace.\n'); 
pause
    imgR{1} = snapshot(camRight);
    imgL{1} = snapshot(camLeft);
    if ~landscape
        imgR{1}=rot90(imgR{1});
        imgL{1}=rot90(imgL{1});
    end
    fprintf('Snímky č. %d pořízeny\n', 1);
    fileNameR = sprintf('snapR%d.jpg',1);
    imwrite(imgR{1},fileNameR)
    movefile(fileNameR,'camRight')
    fileNameL = sprintf('snapL%d.jpg',1);
    imwrite(imgL{1},fileNameL)
    movefile(fileNameL,'camLeft')
    pause(3.04)
end
%% Pořízení snímků k rekonstrukci - 1 kamera
if recOn

mkdir cam
img = {0};
preview(cam)

n = str2num(input('Zadej počet snímků k rekonstrukci: ', 's'));

fprintf('Po stisku libovolné klávesy začne automatické pořizování snímků s laserovým vzorem.\n');
pause
for i = 2:n+1

    img{i} = snapshot(cam);
    if ~landscape
        img{i}=rot90(img{i});
    end
    fprintf('Snímky č. %d pořízeny\n', i);
    fileName = sprintf('snap%d.jpg',i);
    imwrite(img{i},fileName)
    movefile(fileName,'cam')
    pause(3.04)
end
if color
    fprintf('Po stisku libovolné klávesy začne automatické pořizování snímků zachycujících texturu.\n');
    pause
    for i = 1:n
        imgColor{i} = snapshot(cam);
        if ~landscape
            imgColor{i}=rot90(imgColor{i});
        end
        fprintf('Snímky č. %d pořízeny\n', i);
        fileName = sprintf('snap%d.jpg',i);
        imwrite(imgColor{i},fileName)
        movefile(fileName,'cam')
        pause(3.04)
    end
end
fprintf('Po stisku libovolné klávesy se pořídí snímek zachycující osu rotace.\n'); 
pause
    img{1} = snapshot(cam);
    if ~landscape
        img{1}=rot90(img{1});
    end
    fprintf('Snímky č. %d pořízeny\n', 1);
    fileName = sprintf('snap%d.jpg',1);
    imwrite(img{1},fileName)
    movefile(fileName,'cam')
end
%% Destrukce
if(size(camList,1) > 2)
    clear camRight
    clear camLeft
else
    clear cam
end
