标签:
依据实验结果,确定为对于RGB三个分量,每个分量都做差,然后取二范数,如果其中有一个分量大于0.5,这个结果就保留。这应该是我目前编过的最复杂的Matlab程序了,主要是通过这个程序学习到了matlab结构体的好处,数组和cell在处理大量的数据的时候都太麻烦了。结构体加上数组、cell,才是matlab程序语言设计的保存数据的最好的格式。现在知道了为啥matlab读取视频,保存格式为结构体了。fighting!
1 clear;close all;clc; 2 %% 3 %由于程序运行的时间太长了,保存第一个运行的输出 4 % 程序开始执行 5 % 读取图片文件信息,并按类、视频序号、文件尺寸, 6 % 存到结构体fileInfoPartition中,耗时:291.5183 7 % 8 % 把结构体fileInfoPartition按阈值0.5为分割在结构体fileInfoResult 9 % 共耗时:3601.5324 10 % 11 % 拷贝简化后的数据共花费时间:83.9876 12 % 13 % 拷贝冗余的数据共花费时间:91.4804 14 %% 15 %程序如何操作: 16 %把变量pathSource改为要处理的图片数据,所在的文件夹,就数字时间码识别而言。就是各个子分类0、1、2上一级文件夹 17 %把变量pathDestination改为处理好数据保存的文件夹 18 %destinationFlag和redundanceFlag分别控制是否保存原始的数据和冗余数据 19 %% 20 %下一步改进: 21 % 22 %% 23 %程序实现的功能 24 %1、根据指定的路径、视频序号和差距系数,挑选出对应相同视频号的相同位置数字的冗余的数据 25 %2、把先前挑选出的原始数据保存在文件夹pathdestination、冗余数据保存在文件夹pathredundance 26 %% 27 %程序中用到的新功能:之前一直没用过结构体,现在用了结构体数组。 28 %程序中用到的之前不清楚的函数如下 29 %1)unique(a):提取数组a中的唯一数据,输出结果按从大到小排序。但发现这只能处理1维数组效果比较好。 30 %多维数组并不会选取不同的数组,而会提取出数组中不同的数字 31 %2)setdiff(a,b):返回在a而不在b中的值,返回的值是按从小到大排列,如果a和b完全相同,则返回一个空矩阵 32 %3)exit(‘folder‘,dir):判断文件夹是否存在,存在返回7,不存在返回0.还可以判断文件是否存在之类的。 33 %4)norm(a):矩阵的2范数,求所有项的平方和在开根号 34 %5) 35 %% 36 %变量命名规则: 37 %总路径下一层的文件夹记为dir(directory) 38 %最后一层就是各个文件记为file 39 %% 40 %程序编程思路: 41 %比较冗余数据肯定是挑选出相同视频、相同位置、相同数字的图片(不同位置,也可能存在尺寸一样的情况) 42 %而满足相同视频、相同位置的图片,尺寸肯定是相同的。根据这点可以减少数据的运算量 43 %考虑到真实的数据,好像只能用做差的方差来找相同尺寸的图片直接的差异性 44 tic; 45 disp(‘程序开始执行‘); 46 %%%%%%%%%%%%需要更改的参数%%%%%%%%%%%%%%%%%%%% 47 %要处理的数据的源地址,里面有子文件夹0、1、2...9 48 49 pathSource=‘C:\Users\Dy\Desktop\彩色视频真实数据\sjz‘; 50 51 %保存去冗余后数据的路径 52 53 pathDestination=‘C:\Users\Dy\Desktop\彩色视频真实数据\sjdr‘; 54 55 %是否生成无冗余数据的标志符号,为0,不生成,非0生成 56 57 simplifyFlag=1; 58 59 %是否生成冗余数据的标志符号,为0,不生成,非0生成 60 61 redundanceFlag=1; 62 63 %判断数据,是否冗余的阈值,初步选为0.5 64 65 differentCriterion=0.5; 66 67 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 68 %先读取pathSource文件夹下存在的子文件,保存子文件夹信息。方便后面处理。 69 dirList=dir(pathSource);%读取文件夹列表,这种方式读取会保留原文件.(在结构体中第一个)和上一层目录..(在结构体第二个) 70 countDir=length(dirList);%文件夹个数 71 72 %% 73 %提取出原始数据里面的有用数据保存到结构体中 74 %把文件的全部信息一次性全部先读取到一个结构体数组fileInfoRaw中来 75 % 结构体数字,第一维为类别(相对应子文件夹文件名加1),第二维为图片序号 76 % 结构体数组中有字段 77 % name:图片的名字 78 % videonum:图片来源于那个视频 79 % size:[图片的宽(竖直方向跨度),图片的长度(水平方向跨度),3] 80 % dirList=dir(pathSource);%读取文件夹列表,这种方式读取会保留原文件.(在结构体中第一个)和上一层目录..(在结构体第二个) 81 % countDir=length(dirList);%文件夹个数 82 for numDir=3:countDir%先读取数据文件夹pathSource下的子文件夹 83 if(length(dirList(numDir).name)>=2)%根据这个过滤掉在此文件夹可能存在的各种txt文件 84 continue; 85 end 86 fileList=dir([pathSource,‘\‘,dirList(numDir).name]); 87 countFile=length(fileList); 88 for numFile=3:countFile%依次读取所有的文件名 89 %去除图片所属的视频序号 90 tempName=fileList(numFile).name; 91 nameStart=strfind(tempName,‘_‘); 92 nameEnd=strfind(tempName,‘-‘); 93 tempVideoOrder=tempName(nameStart+1:nameEnd-1); 94 tempPic=imread([pathSource,‘\‘,dirList(numDir).name,‘\‘,fileList(numFile).name]); 95 %tempSize=size(tempPic);%读取的当前图片的size 96 %要注意提取出来的子文件的名称再加1得到了结构体的数据信息,而numFile是从第3开始的,所以要减2 97 fileInfoRaw(str2double(dirList(numDir).name)+1,numFile-2).name=tempName; 98 fileInfoRaw(str2double(dirList(numDir).name)+1,numFile-2).videonum=str2double(tempVideoOrder); 99 fileInfoRaw(str2double(dirList(numDir).name)+1,numFile-2).size=size(tempPic); 100 end 101 end 102 103 %读取出所有的视频序号 104 %读取第一个子文件中的视频数据(一般而言每个视频肯定都会生成数据0,所以读取0文件夹可以选出所有的视频序号的) 105 [sumClasses,maxFile]=size(fileInfoRaw); 106 videoList(1)={0};%cell中第一项填充一个0方面后续的程序编写。 107 %原本想去除所有的视频序号,然后用unique提取出唯一信息。 108 %但由于视频序号并不是统一规格的长短,所以只能用比较麻烦的方法。 109 % for numFile=1:maxFile 110 % if ~isempty(fileInfoRaw(numFile).videonum) 111 % videoList=[videoList;fileInfoRaw(numFile).videonum]; 112 % end 113 % end 114 %读取第一个结构体,就是子文件夹0中的图片数量,挑选没有重复的数据 115 for numFile=1:maxFile 116 %注意这里的fileInfoRaw(1,numFile),就是指定了子文件夹0中的数据,不能忘记这个1 117 if ~isempty(fileInfoRaw(1,numFile).videonum) 118 countVideo=length(videoList); 119 for tempVideoNum=1:countVideo 120 if videoList{tempVideoNum} == fileInfoRaw(1,numFile).videonum 121 continue; 122 else 123 %一开始没加这行,伤不起呀。必须是比较完videoList中所有的 124 %视频序号都没有相同的视频,才开始往videoList中添加 125 if tempVideoNum == countVideo 126 %下面这种方式,对于cell的操作,每次videoList多生成一行 127 videoList=[videoList;fileInfoRaw(1,numFile).videonum]; 128 end 129 end 130 end 131 end 132 end 133 videoList=videoList(2:end);%删除第一项,得到了要处理的视频序号 134 sumVideo=length(videoList);%统计得到video的总数量 135 136 %由于要记录的信息太多,而又想不到能一步得到很多信息的方法。 137 %所以就把这些东西简单分为一小部分一小部分记录 138 %用二维结构体数组fileInfoSize保存图片的尺寸信息,第一维为类别,第二维为对应于videoList中相同位置的视频 139 %先用tempSize保存某一类,某一视频序号videoList{numVideo}下的所有的尺寸信息, 140 %然后再把这些信息保存到结构体fileInfoSize中 141 %结构体数组中有字段 142 %size:保存着对应于行(类别),列(视频videoList{numVideo})的所有尺寸 143 for numClass=1:sumClasses%对应的类别 144 for numVideo=1:sumVideo%对应的视频序号 145 146 if numVideo==4 147 temp=1; 148 end 149 150 tempSize={[0,0,0]};%必须是cell,才能方便每次统计在某个类别下面对应视频的size总数 151 %下面这个for,就是判断指定类别,指定视频序号的所有尺寸的累加 152 for i=1:maxFile 153 %因为结构体也是按最大尺寸,填充的,所以有一些是空的 154 %先判断,如果是空数据就不进行处理 155 156 if i==59 157 temp=1; 158 end 159 160 if isempty(fileInfoRaw(numClass,i).videonum) 161 break; 162 %一次也就判断指定视频的尺寸,所以下面加入判断是对应的视频才处理 163 elseif videoList{numVideo}==fileInfoRaw(numClass,i).videonum 164 165 countTempSize=length(tempSize); 166 %选取到某一个文件信息,然后用tempSize中的所有尺寸信息和其比较,如果都不相同,在添加到tempSize中 167 for numTempSize=1:countTempSize 168 %先用setdiff判断数组tempSize{numTempSize}和fileInfoRaw(numClass,i).size 169 %是否相同,如果相同则返回空,正好用isempty判断 170 %下面一开始判断两个数组是否相等是只有语句isempty(setdiff(tempSize{numTempSize},fileInfoRaw(numClass,i).size)) 171 %而这个函数为setdiff(a,b)只是返回b中没有的a的值,那么遇到a=[17 17 3] 172 %b=[17 15 3],则setdiff(a,b)返回空,所以用了下面这种加强的判断方法, 173 %[setdiff(a,b),setdiff(b,a)]注意两个数组直接连接用的是逗号 174 %这样就可以两个数组直接是不是相等,完全判断 175 if isempty([setdiff(tempSize{numTempSize},fileInfoRaw(numClass,i).size),setdiff(fileInfoRaw(numClass,i).size,tempSize{numTempSize})]) 176 %一开始这写为continue,这是错误的。因为上面的for是在整个tempSize里面 177 %找是否有相同的,有相同的就停止执行后面的else中的添加功能。 178 %如果改为continue了,反倒成了找tempSize中是否有和当前size中不同的数据 179 %如果有,就加进tempSize中。这相当蛋疼。哎,太菜了。 180 %不过也是之前没写过那么复杂的程序。。。。 181 break; 182 else 183 %又忘了加后面这个判断了,如果是所有的在tempSize中的尺寸都比较完之后 184 %还是没有发现和fileInfoRaw(numClass,i).size相同的数据,才往 185 %tempSize中添加新数据 186 if numTempSize == countTempSize 187 tempSize=[tempSize;fileInfoRaw(numClass,i).size]; 188 end 189 end 190 end 191 end 192 end 193 %上面这个for,就取出了对应类别,对应视频的所有不同的尺寸,由于有个初始的[0,0,0] 194 %所以去掉第一个初始值,从第二个开始 195 tempSize=tempSize(2:end); 196 fileInfoPartition(numClass,numVideo).picSize=tempSize; 197 end 198 end 199 200 %把每个类、每个视频中的所有的尺寸信息保存到了结构体fileInfoSize中, 201 %在结构体fileInfoSize再加入sumSize这个字段来统计,对应结构体下各种多少种size的图像 202 for numClass=1:sumClasses%对应的类别 203 for numVideo=1:sumVideo%对应的视频序号 204 fileInfoPartition(numClass,numVideo).sumSize=size(fileInfoPartition(numClass,numVideo).picSize,1); 205 end 206 end 207 208 %往结构体fileInfoPartition中添加字段nameList 209 %nameList中有sumSize行,分别对应于picSize中各行的尺寸 210 %由于早已经把要处理的信息都保存在结构体fileInforRaw,所以只要读取里面的信息就可以了 211 %[sumClasses,maxFile]=size(fileInfoRaw); 212 %sumVideo=length(videoList);%统计得到video的总数量 213 for numClass=1:sumClasses%对应的类别 214 for numVideo=1:sumVideo%对应的视频序号 215 for numSize=1:fileInfoPartition(numClass,numVideo).sumSize%遍历每个类别对应视频下的所有尺寸数据 216 tempName={‘0‘};%cell类型,方便统计最后的相同尺寸的文件的数量,可以存放不同类型的数据 217 for numFile=1:maxFile 218 %由于结构体,会规整整个结构体的尺寸,所以要首先判断,当前结构体数字下的内容是否为空 219 if isempty(fileInfoRaw(numClass,numFile).videonum) 220 %按顺序遍历整个结构体中的数据,如果发现空内容,所以当前分类的数据已经、 221 %遍历完,所以break,进入下一个类 222 break; 223 elseif videoList{numVideo}==fileInfoRaw(numClass,numFile).videonum 224 %上面先进行判断是不是属于这个视频的数据 225 %下面判断,是不是属于这个尺寸的数据 226 if isempty([setdiff(fileInfoPartition(numClass,numVideo).picSize{numSize},fileInfoRaw(numClass,numFile).size), ... 227 setdiff(fileInfoRaw(numClass,numFile).size,fileInfoPartition(numClass,numVideo).picSize{numSize})]) 228 tempName=[tempName;fileInfoRaw(numClass,numFile).name]; 229 end 230 end 231 end 232 %上面这个for为在某个类别,对应视频序号,按顺序的某个尺寸遍历完的所有文件名列表 233 tempName=tempName(2:end); 234 %由于打算把计算出来的文件名列表保存按行(对应于结构体中picSize中的尺寸信息) 235 %而这样文件名列表不同行(即不同尺寸)的文件数量是不相等的 236 %对于这种不同维度的数据,直接一行一行操作cell会出错,所以只能一个一个进行添加 237 sumName=length(tempName); 238 for i=1:sumName 239 fileInfoPartition(numClass,numVideo).nameList(numSize,i)=tempName(i); 240 end 241 %想到了反正都算出了了不同类别不同视频不同尺寸的文件数量 242 %那就把这个信息保存到结构体的字段picSizeCount中,每行都对应picSize中文件数量 243 fileInfoPartition(numClass,numVideo).picSizeCount(numSize,1)=sumName; 244 end 245 end 246 end 247 %读取文件信息,并按类、视频序号、文件名尺寸存到结构体fileInfoPartition中 248 disp(‘读取图片文件信息,并按类、视频序号、文件尺寸,‘); 249 disp([‘存到结构体fileInfoPartition中,耗时:‘,num2str(toc)]); 250 251 %% 252 %终于把有用的信息都提取到了结构体fileInfoPartition中,结构体总共有10行(10个类别),n列(n个视频) 253 %结构体有字段: 254 %picSize:对应类(结构体行)和视频(结构体列)的数据的尺寸 255 %sumSize:对应类(结构体行)和视频(结构体列)的数据的各种尺寸的总数 256 %nameList:对应类(结构体行)和视频(结构体列)和对应数据的尺寸(对应于字段picSize的行)的文件名列表 257 %picSizeCount:对应类(结构体行)和视频(结构体列)和对应数据的尺寸(对应于字段picSize的行)的文件总数 258 259 %计划把判断是否冗余,计算好后的数据保存到结构体fileInfoResult中 260 %picSize:对应类(结构体行)和视频(结构体列)的数据的尺寸 261 %sumSize:对应类(结构体行)和视频(结构体列)的数据的各种尺寸的总数 262 %nameList:对应类(结构体行)和视频(结构体列)和对应数据的尺寸(对应于字段picSize的行)的文件名列表 263 %和fileInfoPartition中数据相比是它的两倍的行数,相当于把fileInfoPartition中的每一行拆为两行,奇数行为冗余 264 %偶数行为对应的未冗余 265 %picSizePartitionCount:对应于namelist中各行的数据量 266 267 tic; 268 %先把数据在新建的结构体中完成分割,然后再根据destinationFlag和redundanceFlag确定是否要写入分割的数据 269 %先整体扫描结构体中fileInfoPartition,计算出所有的是否冗余的信息,然后存到fileInfoResult中 270 % pathSource=‘C:\Users\Dy\Desktop\彩色视频真实数据\val2‘; 271 %[sumClasses,maxFile]=size(fileInfoRaw); 272 %sumVideo=length(videoList);%统计得到video的总数量 273 %vainFlag:发现要添加一个vainFlag的标记来,取消掉某一个文件名的重复比较 274 %主要是考虑到每到一个文件名,都要计算后面所有的文件是否重复,这个计算量有点大。 275 %而且如果不添加这个flag,会导致比如重复图片中的最后一个图片会被添加到无冗余数据的列表中 276 for numClass=1:sumClasses%对应的类别 277 for numVideo=1:sumVideo%对应的视频序号 278 % if numVideo==3 279 % temp=1; 280 % end 281 for numSize=1:fileInfoPartition(numClass,numVideo).sumSize%遍历每个类别对应视频下的所有尺寸数据 282 %把字段picSize和sumSize也补上 283 fileInfoResult(numClass,numVideo).picSize=fileInfoPartition(numClass,numVideo).picSize; 284 fileInfoResult(numClass,numVideo).sumSize=fileInfoPartition(numClass,numVideo).sumSize; 285 %用中间变量nameRedundancyTempList来保存对应类别,视频,尺寸的独特的文件名和冗余文件名 286 nameRedundancyTempList={‘0‘};%保存对应类别,视频,尺寸的冗余的文件名 287 for numName=1:fileInfoPartition(numClass,numVideo).picSizeCount(numSize)%遍历每个类别对应视频下的对应尺寸的文件的多少 288 %初始化vainFlag,使其每次开始检测一个新的文件的时候,都是Ok的,后面发现如果是冗余数据,在置为0 289 vainFlag=1; 290 %加入判断条件如果遍历到的文件名,已经保存在nameRedundancyTempList中,那么就不需要进行后续的检查了。直接下一个文件 291 sumRedundancy=length(nameRedundancyTempList); 292 for i=1:sumRedundancy 293 %如果在nameRedundancyTempList中发现了当前处理的文件 294 if strcmp(fileInfoPartition(numClass,numVideo).nameList{numSize,numName},nameRedundancyTempList{i}) 295 vainFlag=0; 296 break;%那么就置vainFlag为0,跳出这个循环,也就不用在进行下面的这个文件的所有操作了。 297 end 298 end 299 %如果在冗余列表中发现已有了这个文件,那么这个文件属于vain,就不用进行下面的计算判断了 300 if vainFlag 301 %从头到尾,遍历整个文件名列表,作为要比较的原始数据 302 nameSource=[pathSource,‘\‘,num2str(numClass-1),‘\‘,fileInfoPartition(numClass,numVideo).nameList{numSize,numName}]; 303 picSource=im2double(imread(nameSource)); 304 %为numName可能的最后一个文件名,没有东西可以比较的情况,增加一个特定的判断 305 %而且必须增加一个这样的判断,因为后面和原始图像相比较的,是它的后面一个图像 306 %那么如果numName是文件名最后一个序列的时候,不加if先排除,for会出错 307 if numName~=fileInfoPartition(numClass,numVideo).picSizeCount(numSize) 308 for numNameCompare=(numName+1):fileInfoPartition(numClass,numVideo).picSizeCount(numSize) 309 nameCompare=[pathSource,‘\‘,num2str(numClass-1),‘\‘,fileInfoPartition(numClass,numVideo).nameList{numSize,numNameCompare}]; 310 picCompare=im2double(imread(nameCompare)); 311 picResult=picSource-picCompare; 312 %做出判断,如果差值里面有一个分量的范数大于0.5,那么就算是和原始图像有差距的图像 313 if norm(picResult(:,:,1))>=differentCriterion || norm(picResult(:,:,2))>=differentCriterion || norm(picResult(:,:,3))>=differentCriterion 314 %那么就算是和原始图像有差距的图像,先不进行处理 315 316 else%如果范数不大于0.5,那么算是相似的图像,这个就可以保存在fileInfoResult的nameList中对应的偶数行中 317 nameRedundancyTempList=[nameRedundancyTempList;fileInfoPartition(numClass,numVideo).nameList{numSize,numNameCompare}]; 318 end 319 end 320 end 321 end 322 end 323 %在这步,基本就是属于在某个类别、视频、尺寸下,所有的冗余的尺寸尺寸信息都保存在了nameRedundancyTempList,所以用下面的语句把内容,放到偶数nameList中去。 324 nameRedundancyTempList=nameRedundancyTempList(2:end); 325 sumRedundancy=length(nameRedundancyTempList); 326 if 0==sumRedundancy 327 %一开始没想到加这个if。主要是之前的方法忽略了一种极为特殊的情况,那就是如果在某类、某个视频,在某种尺寸下只有两个图片 328 %而且这两个图片是相异的(这种情况也有,也是后来发现程序运行bug,我才想到的) 329 %毕竟图片挑选的时候也是尽量挑选不一样的,视频太短的话,可能会出现这种情况 330 %这种特殊的情况下,nameRedundancyTempList里面没有数据,sumRedundancy=0 331 %则后面往奇数行的namelist中添加文件名的操作没办法实现。所以这个if后面,就是往结构体fileInfoResult 332 %的奇数行添加fileInfoPartition的整个文件名列表 333 for i=1:fileInfoPartition(numClass,numVideo).picSizeCount(numSize) 334 fileInfoResult(numClass,numVideo).nameList(2*numSize-1,i)=fileInfoPartition(numClass,numVideo).nameList(numSize,i); 335 end 336 %对应的偶数行的nameList就是为空了 337 fileInfoResult(numClass,numVideo).nameList(2*numSize,1)={[]};%要注意这里赋空值的操作,一开始直接是[]赋值过去是不可以的 338 %补上这种特殊情况的picSizePartitionCount 339 fileInfoResult(numClass,numVideo).picSizePartitionCount(2*numSize-1,1)=fileInfoPartition(numClass,numVideo).picSizeCount(numSize,1); 340 fileInfoResult(numClass,numVideo).picSizePartitionCount(2*numSize,1)=0; 341 else 342 for i=1:sumRedundancy 343 fileInfoResult(numClass,numVideo).nameList(2*numSize,i)=nameRedundancyTempList(i); 344 end 345 fileInfoResult(numClass,numVideo).picSizePartitionCount(2*numSize,1)=sumRedundancy;%反正都算了sumRedundancy,顺带把计数字段填上 346 fileInfoResult(numClass,numVideo).picSizePartitionCount(2*numSize-1,1)= ... 347 fileInfoPartition(numClass,numVideo).picSizeCount(numSize)-sumRedundancy;%把计数字段不冗余的文件名补齐 348 %顺带把不冗余的文件名补齐 349 numName=1;%这里重新定义一个numName,和上面的(244行)遍历每个类别对应视频下的对应尺寸的文件的多少重复使用变量,但是互不干扰 350 for i=1:fileInfoPartition(numClass,numVideo).picSizeCount(numSize) 351 for j=1:sumRedundancy 352 if strcmp(fileInfoPartition(numClass,numVideo).nameList(numSize,i),fileInfoResult(numClass,numVideo).nameList(2*numSize,j)) 353 %即为找到了这个文件名是冗余文件,那就没必要进行后面的判断 354 break; 355 elseif j==sumRedundancy 356 %如果在j等于sumRedundancy的时候,还没有找到同名文件,说明这个是独特的文件,那么添加到奇数的nameList中 357 fileInfoResult(numClass,numVideo).nameList(2*numSize-1,numName)=fileInfoPartition(numClass,numVideo).nameList(numSize,i); 358 numName=numName+1; 359 end 360 end 361 end 362 end 363 end 364 end 365 end 366 %把结构体fileInfoPartition按阈值为分割在结构体fileInfoResult,耗时 367 disp(‘ ‘); 368 disp([‘把结构体fileInfoPartition按阈值‘,num2str(differentCriterion),‘为分割在结构体fileInfoResult‘]); 369 disp([‘共耗时:‘,num2str(toc)]); 370 371 %终于把需要的信息都按照需求整到了结构体fileInfoResult中 372 373 %在路径pathDestination根据标识符simplifyFlag和redundanceFlag 374 %确定是否新建文件夹simplify和redundance,并在下面创建子文件夹0、1...9 375 %保存简化和冗余的数据 376 %要处理的数据的源地址,里面有子文件夹0、1、2...9 377 % pathSource=‘C:\Users\Dy\Desktop\sy1\val2‘; 378 %保存去冗余后数据的路径 379 %pathDestination=‘C:\Users\Dy\Desktop\彩色视频真实数据\sjdr‘; 380 %是否生成无冗余数据的标志符号,为0,不生成,非0生成 381 %simplifyFlag=1; 382 %是否生成冗余数据的标志符号,为0,不生成,非0生成 383 %redundanceFlag=1; 384 %由于创建了两个标志符,所以最简单的编程方法就是一个标志一个标志编程 385 %开始拷贝去冗余的数据 386 tic; 387 if simplifyFlag 388 pathSimplify=[pathDestination,‘\simplify‘]; 389 mkdir(pathSimplify); 390 %[sumClasses,maxFile]=size(fileInfoRaw); 391 %sumVideo=length(videoList);%统计得到video的总数量 392 for numClass=1:sumClasses%对应的类别 393 mkdir([pathSimplify,‘\‘,num2str(numClass-1),‘\‘]); 394 for numVideo=1:sumVideo%对应的视频序号 395 for numSize=1:fileInfoResult(numClass,numVideo).sumSize%对应的尺寸 396 for numName=1:fileInfoResult(numClass,numVideo).picSizePartitionCount(2*numSize-1) 397 copyfile([pathSource,‘\‘,num2str(numClass-1),‘\‘,fileInfoResult(numClass,numVideo).nameList{2*numSize-1,numName}], ... 398 [pathSimplify,‘\‘,num2str(numClass-1),‘\‘,fileInfoResult(numClass,numVideo).nameList{2*numSize-1,numName}]); 399 end 400 end 401 end 402 end 403 end 404 disp(‘ ‘); 405 disp([‘拷贝简化后的数据共花费时间:‘,num2str(toc)]); 406 407 %开始拷贝去冗余的数据 408 tic; 409 if redundanceFlag 410 pathredundance=[pathDestination,‘\redundance‘]; 411 mkdir(pathredundance); 412 %[sumClasses,maxFile]=size(fileInfoRaw); 413 %sumVideo=length(videoList);%统计得到video的总数量 414 for numClass=1:sumClasses%对应的类别 415 mkdir([pathredundance,‘\‘,num2str(numClass-1),‘\‘]); 416 for numVideo=1:sumVideo%对应的视频序号 417 for numSize=1:fileInfoResult(numClass,numVideo).sumSize%对应的尺寸 418 for numName=1:fileInfoResult(numClass,numVideo).picSizePartitionCount(2*numSize) 419 copyfile([pathSource,‘\‘,num2str(numClass-1),‘\‘,fileInfoResult(numClass,numVideo).nameList{2*numSize,numName}], ... 420 [pathredundance,‘\‘,num2str(numClass-1),‘\‘,fileInfoResult(numClass,numVideo).nameList{2*numSize,numName}]); 421 end 422 end 423 end 424 end 425 end 426 disp(‘ ‘); 427 disp([‘拷贝冗余的数据共花费时间:‘,num2str(toc)]);
标签:
原文地址:http://www.cnblogs.com/yymn/p/4643879.html