obj = VideoReader('7385387fac45ea1333c10147d8031da8.mp4');%输入视频位置 numFrames = obj.NumberOfFrames;% 帧的总数 for k = 1 :1 % 读取前15帧 frame = read(obj,k);%读取第几帧 %输入图像 I= frame; [H,W,G]=size(I) ; subplot(331),imshow(I),title('原图'); %将图像二值化 I1=im2bw(I,0.6); subplot(332),imshow(I1),title('二值化'); %进行开运算闭运算 se=strel('disk',5); I2=imclose(I1,se); I3=imopen(I2,se); subplot(333),imshow(I3),title('开运算闭运算'); %进行canny算子边缘检测 L=bwlabel(I3); L1=edge(L,'canny'); subplot(334),imshow(L1),title('canny算子边缘检测'); %膨胀运算 SE = strel('disk', 4); J = imdilate(I4, SE); subplot(335),imshow(J),title('将图像膨胀处理'); % 将二值图像转化为连通域标记图像 cc = bwconncomp(J); L = labelmatrix(cc); % 计算所有连通域的属性 props = regionprops(cc, 'area', 'BoundingBox'); % 根据面积筛选出面积大于 1000 的连通域 idx = find(area >= 2000 & area <= 3800); % 创建不同形状的平行四边形 ps1 = polyshape([200 236 315 300],[360 160 180 360]); ps2 = polyshape([420 500 400 350],[360 360 190 220]); % 绘制框选形状 figure; imshow(I); hold on; for i = 1:length(idx) % 判断连通域是否在 ps1 中 if ps1.isinterior(props(idx(i)).BoundingBox(1:2)) plot(ps1); end % 判断连通域是否在 ps2 中 if ps2.isinterior(props(idx(i)).BoundingBox(1:2)) plot(ps2); end end hold off; imwrite(I,strcat('D:\课设图片二\',num2str(k),'.jpg'),'jpg');% 保存帧 end改进代码,保存带有多边形框选的每一帧图片
时间: 2024-04-03 10:34:47 浏览: 11
好的,我理解了你的问题。根据你的代码,我可以给你一些改进建议,让你能够保存带有多边形框选的每一帧图片。
首先,你需要在每一帧图像上绘制多边形。可以使用MATLAB中的函数poly2mask将多边形转换为二进制掩模,然后将其与原始图像相乘,这样就可以只保留多边形内的像素。代码如下所示:
```matlab
% 创建不同形状的平行四边形
ps1 = polyshape([200 236 315 300],[360 160 180 360]);
ps2 = polyshape([420 500 400 350],[360 360 190 220]);
% 绘制框选形状并保存带有多边形框选的每一帧图片
for k = 1:numFrames
% 读取第k帧
frame = read(obj,k);
% 输入图像
I = frame;
[H,W,G] = size(I);
% 将图像二值化
I1 = im2bw(I,0.6);
% 进行开运算闭运算
se = strel('disk',5);
I2 = imclose(I1,se);
I3 = imopen(I2,se);
% 进行canny算子边缘检测
L = bwlabel(I3);
L1 = edge(L,'canny');
% 将图像膨胀处理
SE = strel('disk', 4);
I4 = imdilate(L1, SE);
% 将二值图像转化为连通域标记图像
cc = bwconncomp(I4);
L = labelmatrix(cc);
% 计算所有连通域的属性
props = regionprops(cc, 'area', 'BoundingBox');
% 根据面积筛选出面积大于 1000 的连通域
idx = find([props.Area] >= 1000);
% 绘制框选形状并保存带有多边形框选的每一帧图片
for i = 1:length(idx)
% 判断连通域是否在 ps1 中
if ps1.isinterior(props(idx(i)).BoundingBox(1:2))
% 将多边形转换为掩模
mask = poly2mask(ps1.Vertices(:,1),ps1.Vertices(:,2),H,W);
% 将掩模与原始图像相乘,只保留多边形内的像素
I_masked = uint8(double(I).*repmat(mask,[1 1 3]));
% 保存带有多边形框选的每一帧图片
imwrite(I_masked,strcat('D:\课设图片二\',num2str(k),'_',num2str(i),'.jpg'),'jpg');
end
% 判断连通域是否在 ps2 中
if ps2.isinterior(props(idx(i)).BoundingBox(1:2))
% 将多边形转换为掩模
mask = poly2mask(ps2.Vertices(:,1),ps2.Vertices(:,2),H,W);
% 将掩模与原始图像相乘,只保留多边形内的像素
I_masked = uint8(double(I).*repmat(mask,[1 1 3]));
% 保存带有多边形框选的每一帧图片
imwrite(I_masked,strcat('D:\课设图片二\',num2str(k),'_',num2str(i),'.jpg'),'jpg');
end
end
end
```
需要注意的是,这里将每个多边形转换为掩模后与原始图像相乘得到的是一个三维数组,需要将其转换为uint8类型的图像,才能使用imwrite函数保存为jpg格式的图片。