close all;
clc; clear;
tic;
%% 01 参数配置
W = 1280;
H = 720;
save_folder = "data/project"; mkdir(save_folder);
save_file_csv = strcat(save_folder, "/","patterns.csv"); % 用于写入到投影仪
n = 4; % 格雷码位数
% 相移参数
N = 12; % 相移步数
A = 130;
B = 90;
TW = W / (2 ^ n);
TH = H / (2 ^ n);
%% 02 生成相移法图像
[~, patterns_phaseshift_X] = m_make_phase_shift_patterns(A, B, TW, N, W, H);
[~, temp_Y] = m_make_phase_shift_patterns(A, B, TH, N, H, W);
patterns_phaseshift_Y = zeros(N, H, W);
for i = 1: N
patterns_phaseshift_Y(i, :, :) = squeeze(temp_Y(i, :, :))';
end
%% 03 生成格雷码图像:X方向
patterns_graycode_X = m_make_gray_code_patterns(n, W, H);
temp_Y = m_make_gray_code_patterns(n, H, W);
[num, H, W] = size(patterns_graycode_X);
patterns_graycode_Y = zeros(num, H, W);
for i = 1: num
patterns_graycode_Y(i, :, :) = squeeze(temp_Y(i, :, :))';
end
%% 04 写入图像
idx = 0;
file = fopen(save_file_csv, "w+");
% 写入相移图案 X
for i = 1: N
idx = idx + 1;
% 写入图片
save_file_img = strcat(save_folder, "/", int2str(idx), ".bmp");
disp("写入文件到:" + save_file_img);
img = squeeze(patterns_phaseshift_X(i, :, :));
imwrite(img, save_file_img);
% 写入csv文件
img_row = squeeze(img(1, :)) * 255.;
for w = 1: W
fprintf(file, strcat(int2str(round(img_row(w))), ","));
end
fprintf(file, "\n");
end
% 写入格雷码程序 X
for i = 1: num
idx = idx + 1;
% 写入图像
save_file_img = strcat(save_folder, "/", int2str(idx), ".bmp");
disp("写入文件到:" + save_file_img);
img = squeeze(patterns_graycode_X(i, :, :));
imwrite(img, save_file_img);
% 写入图像
img_row = squeeze(img(1, :));
for w = 1: W
fprintf(file, strcat(int2str(round(img_row(w))), ","));
end
fprintf(file, "\n");
end
% 写入相移图案 Y
for i = 1: N
idx = idx + 1;
% 写入图片
save_file_img = strcat(save_folder, "/", int2str(idx), ".bmp");
disp("写入文件到:" + save_file_img);
img = squeeze(patterns_phaseshift_Y(i, :, :));
imwrite(img, save_file_img);
% 写入csv文件
img_row = squeeze(img(1, :)) * 255.;
for w = 1: W
fprintf(file, strcat(int2str(round(img_row(w))), ","));
end
fprintf(file, "\n");
end
% 写入格雷码程序 Y
for i = 1: num
idx = idx + 1;
% 写入图像
save_file_img = strcat(save_folder, "/", int2str(idx), ".bmp");
disp("写入文件到:" + save_file_img);
img = squeeze(patterns_graycode_Y(i, :, :));
imwrite(img, save_file_img);
% 写入图像
img_row = squeeze(img(1, :));
for w = 1: W
fprintf(file, strcat(int2str(round(img_row(w))), ","));close all;
clc; clear;
tic;
%% 01 参数配置
calib_folder = "data/calib";
N = 12;
n = 4;
num = n + 2;
B_min = 10; % 低于这个调制度的我们就认为它的相位信息不可靠
IT = 0.5; % 格雷码阈值
win_size = 7; % 中值滤波窗口大小
W = 1280;
H = 720;
points_per_row = 7;
points_per_col = 6;
w = 2;
load("data/calib/camera_imagePoints.mat");
[~, ~, calib_num] = size(imagePoints);
prjPoints = zeros(size(imagePoints));
%% 02 标定投影仪、相机
for calib_idx = 1: calib_num
disp(calib_idx);
data_folder = calib_folder + "/" + num2str(calib_idx);
%% 02 近似查看图像圆心
img = 255 - imread(data_folder + "/18.bmp");
for i = 1: points_per_row * points_per_col
xy = imagePoints(i, :, calib_idx);
x = round(xy(1));
y = round(xy(2));
img(y, x) = 255;
end
figure(); mesh(img);
%% 03 解X\Y相位
files_phaseShiftX = cell(1, N);
idx = 1;
for i = 1: N
files_phaseShiftX{i} = strcat(data_folder, "/", int2str(idx), ".bmp");
idx = idx + 1;
end
files_grayCodeX = cell(1, num);
for i = 1: num
files_grayCodeX{i} = strcat(data_folder, "/", int2str(idx), ".bmp");
idx = idx + 1;
end
files_phaseShiftY = cell(1, N);
for i = 1: N
files_phaseShiftY{i} = strcat(data_folder, "/", int2str(idx), ".bmp");
idx = idx + 1;
end
files_grayCodeY = cell(1, num);
for i = 1: num
files_grayCodeY{i} = strcat(data_folder, "/", int2str(idx), ".bmp");
idx = idx + 1;
end
[phaX, difX] = m_calc_absolute_phase(files_phaseShiftX, files_grayCodeX, IT, B_min, win_size);
[phaY, difY] = m_calc_absolute_phase(files_phaseShiftY, files_grayCodeY, IT, B_min, win_size);
phaX = phaX * W;
phaY = phaY * H;
for i = 1: points_per_row * points_per_col
xy = imagePoints(i, :, calib_idx);
x = xy(1); y = xy(2);
x_round = round(x);
y_round = round(y);
% 对x、y附近对相位进行样条曲线插值
xs = zeros(1, 2 * w + 1);
ys = zeros(1, 2 * w + 1);
phas_x = zeros(1, 2 * w + 1);
phas_y = zeros(1, 2 * w + 1);
ii = 1;
for j = - 1 * w: w
es,'X (mm)');
ylabel(player.Axes,'Y (mm)');
zlabel(player.Axes,'Z (mm)');
view(player,ptCloud);
pha_y = spline(ys, phas_y, y);
prjPoints(i, :, calib_idx) = [pha_x, pha_y];
end
end
save(calib_folder + "\projector_imagePoints.mat", 'prjPoints');
toc;
end
fprintf(file, "\n");
end
disp("写入完成");
fclose(file);
toc;
最新发布