% 读取图片文件夹中的所有图片 img_folder = 'C:\Users\15225\Desktop\keti_matlab\Pending images/'; img_files = dir(fullfile(img_folder, '*.bmp')); for i = 1:length(img_files) % 读取图片 img = imread(fullfile(img_folder, img_files(i).name)); % 灰度化 gray_img = im2gray(img); % 阈值分割-亮度大于该值的设置为1(亮点) 反之为0(暗点) threshold = 240; bw_img = gray_img > threshold; % 去除小的连通域-像素个数大于该值的会被计算标记 反之不计算标记 bw_img = bwareaopen(bw_img, 750); % 填充连通域内部空洞 bw_img = imfill(bw_img, 'holes'); % 获取连通域属性-获取二值图像中所有连通域的重心坐标 CC = bwconncomp(bw_img); stats = regionprops(CC, 'Centroid'); % 在原图上绘制标记点和序号 figure; imshow(img); hold on; markers = struct('index', {}, 'position', {}); for j = 1:length(stats) x = stats(j).Centroid(1); y = stats(j).Centroid(2); % 绘制红色圆点大小为 - 10 宽度为 - 2 plot(x, y, 'ro', 'MarkerSize', 10, 'LineWidth', 2); % 在标记点旁边添加序号文本 text(x+10, y+10, num2str(j), 'Color', 'r'); % 存储序号和位置信息到结构体数组 markers(j).index = j; markers(j).position = [x, y]; end % 保存 二值化 图片 result_folder = 'C:\Users\15225\Desktop\keti_matlab\results\'; bw_result_file = fullfile(result_folder, sprintf('bw_result_%d.bmp', i)); imwrite(bw_img, bw_result_file); fprintf('Extracted markers saved to file: %s\n', bw_result_file); % 保存 重心标记 图片 result_file = fullfile(result_folder, sprintf('result_%d.bmp', i)); saveas(gcf, result_file); fprintf('Extracted markers saved to file: %s\n', result_file); % 保存 重心坐标 到文件 result_txt_file = fullfile(result_folder, sprintf('result_%d.txt', i)); fid = fopen(result_txt_file, 'w'); for j = 1:length(markers) fprintf(fid, 'Marker #%d: (%.6g, %.6g)\n', markers(j).index, markers(j).position); end fclose(fid); end 添加代码需求,保存重心在世界坐标系下的坐标
时间: 2024-02-25 17:52:12 浏览: 96
读取文件夹下的所有图片
3星 · 编辑精心推荐
可以在获取连通域属性后,使用相机标定得到的相机内参和外参将图像中的重心坐标转换为世界坐标系下的坐标。具体代码如下:
```matlab
% 获取连通域属性-获取二值图像中所有连通域的重心坐标
CC = bwconncomp(bw_img);
stats = regionprops(CC, 'Centroid');
% 相机标定得到的相机内参和外参
camera_params = load('camera_params.mat');
% 在原图上绘制标记点和序号
figure;
imshow(img);
hold on;
markers = struct('index', {}, 'image_position', {}, 'world_position', {});
for j = 1:length(stats)
x = stats(j).Centroid(1);
y = stats(j).Centroid(2);
% 绘制红色圆点大小为 - 10 宽度为 - 2
plot(x, y, 'ro', 'MarkerSize', 10, 'LineWidth', 2);
% 在标记点旁边添加序号文本
text(x+10, y+10, num2str(j), 'Color', 'r');
% 将图像坐标系下的重心坐标转换为世界坐标系下的坐标
image_points = [x; y; 1];
world_points = camera_params.R * camera_params.K \ image_points;
world_points = world_points / world_points(3);
% 存储序号、图像坐标和世界坐标
markers(j).index = j;
markers(j).image_position = [x, y];
markers(j).world_position = world_points';
end
% 保存 二值化 图片
result_folder = 'C:\Users\15225\Desktop\keti_matlab\results\';
bw_result_file = fullfile(result_folder, sprintf('bw_result_%d.bmp', i));
imwrite(bw_img, bw_result_file);
fprintf('Extracted markers saved to file: %s\n', bw_result_file);
% 保存 重心标记 图片
result_file = fullfile(result_folder, sprintf('result_%d.bmp', i));
saveas(gcf, result_file);
fprintf('Extracted markers saved to file: %s\n', result_file);
% 保存 重心坐标 到文件
result_txt_file = fullfile(result_folder, sprintf('result_%d.txt', i));
fid = fopen(result_txt_file, 'w');
for j = 1:length(markers)
fprintf(fid, 'Marker #%d: Image position - (%.6g, %.6g), World position - (%.6g, %.6g, %.6g)\n', ...
markers(j).index, markers(j).image_position, markers(j).world_position);
end
fclose(fid);
```
其中,`camera_params.mat`是一个.mat格式的文件,保存了相机的内参和外参信息,需要根据实际情况进行修改。
阅读全文