matlab点击图片一点返回,MATLAB提取图片点击处的坐标代码(仅供参考)

当初写这个小程序是为了提取图片点击处的坐标,每张照片自动循环进行标点,不用一张一张手动输入。我想提取手势图片的21个点的坐标。

x=dir(‘D:\MATLAB\work\rename1.m*.jpg’); %获取此目录下的图片

len=length(x);%计算图片的数量

fp=fopen(‘D:\MATLAB\work\Untitled3.m’,’w’);%以写的方式打开存放点坐标的文件

I=cell(1,len);%用cell存放照片

q=input(‘q=’);%此处是我个人意愿加上的一个东西,目的是接着上回的照片序号继续提取坐标,例如

%当我先标完了20张照片,我不想标了。下回开始标的时候,此时我输入q=20,那么接下来标的时候

%坐标前面的序号会紧跟着前面所标的。当第一次标的时候q=0就行了。

for i=1:len%开始循环

t=i+q;

ImageName=strcat(num2str(t),’.jpg’);%转换成字符串

I{t}=imread(ImageName);%读取照片

a=size(I{t});

m=a(1);

n=a(2);

if m<256|n<256%这个是为了防止照片过小,然后把照片放大

I{t}=imresize(I{t},[3*m,3*n]);

a=size(I{t});

m=a(1);

n=a(2);

end

fprintf(fp,’%5d.jpg(256*256): ‘,t);%先输出照片的序号

imshow(I{t});

for j=1:21%然后循环点击21个点,然后输出点击处的坐标

[x,y]=ginput(1);

hold on;

plot(x,y,’or’);

if x<0|x>n|y<0|y>m

fprintf(fp,’ -1, -1 ‘,x,y);%当所要点击的地方看不到,输出(-1,-1)

else

y1=(256*y)/m;%因为先在原图片点击的,如果需要控制照片大小,那么按比例变换坐标,这里

%我是需要在原照片上点击标尺准确度,然后换成照片为256*256格式的坐标,如果不需要,去掉

x1=(256*x)/n;

y=round(y1);

x=round(x1);

fprintf(fp,’%3.0d,%3.0d ‘,x,y);%输出最终坐标

end

hold off;

end

fprintf(fp,’\n’); %当取完一张照片,换行

end

fclose(fp);

%注:如果从网上找的一些照片,通常名字不一样,用这个小程序则需要将照片改成数字序列

%我也写了一个改名小程序,当然用软件改也行。建议这几个个小程序不要一起用。

%改名程序

x=dir(‘D:\MATLAB\work\HAND1.m*.jpg’); %原图放在HAND1.m文件夹中

len=length(x);

for a=1:len

x1=x(a).name;

x3=num2str(a);

x4=strcat(x3,’.jpg’);

copyfile([‘D:\MATLAB\work\HAND1.m\’ x1],[‘D:\MATLAB\work\rename1.m\’ x4]);%将修改过名字的图图片放在rename1.m中

end

fprintf(‘end’);

%检查并删除相同图片小程序,适用少量图片,图片太多时间太长

x=dir(‘D:\MATLAB\work\HAND1.m*.jpg’);

len=length(x);

for i=1:len

x=dir(‘D:\MATLAB\work\HAND1.m*.jpg’);

len=length(x);

im1=imread(x(i).name);

fprintf(‘%d ‘,i);

t=i+1;

for j=t:len

im2=imread(x(j).name);

if isequal(im1,im2)

delete(x(j).name);

end

end

end

小弟初涉代码界,望各位大哥批评指教。