养生 装修 购物 美食 感冒 便秘 营销 加盟 小吃 火锅 管理 创业 搭配 减肥 培训 旅游

opencv:从文件中批量读取图片

时间:2024-10-13 13:14:56

绪:在相机标定,图片训练,机器学习,人脸识别中,需要涉及到批量处理图片的问题;本经验主要介绍3种批量读取图片的方法:一:通过命名规律直接读取;二:采用文本文件进行批量读取;三:由库函数读取图片;

opencv:从文件中批量读取图片

方法/步骤

1、方法一:以一定规律命名的图像,通过stringstream由int型变换为string型,对图像进行读取;

opencv:从文件中批量读取图片

opencv:从文件中批量读取图片

opencv:从文件中批量读取图片

2、方法二:以文本文件的格式批量读取图像:如以.txt格式,则.txt的内容如下:【注】:每行为一个图像名;

opencv:从文件中批量读取图片

opencv:从文件中批量读取图片

opencv:从文件中批量读取图片

3、方法三:只需要一个“dirent.h”头文件,便可以遍历指定文件夹的所有文件;代码如下:

opencv:从文件中批量读取图片

opencv:从文件中批量读取图片

4、dirent.h:头文件可以通过百度搜索并下载。

opencv:从文件中批量读取图片

5、diren隋茚粟胫t.h:中的函数:/**OpendirectorystreamusingplainoldC-string.*/霜杼厮贿staticDIR*opendir(constchar*dirname){structDIR*dirp;interror;/*Musthavedirectoryname*/if(dirname==NULL||dirname[0]=='\0'){dirent_set_errno(ENOENT);returnNULL;}/*AllocatememoryforDIRstructure*/dirp=(DIR*)malloc(sizeof(structDIR));if(dirp){wchar_twname[PATH_MAX];size_tn;/*Convertdirectorynametowide-characterstring*/error=dirent_mbstowcs_s(&n,wname,PATH_MAX,dirname,PATH_MAX);if(!error){/*Opendirectorystreamusingwide-charactername*/dirp->wdirp=_wopendir(wname);if(dirp->wdirp){/*Directorystreamopened*/error=0;}else{/*Failedtoopendirectorystream*/error=1;}}else{/**Cannotconvertfilenametowide-characterstring.This*occursifthestringcontainsinvalidmulti-bytesequencesor*theoutputbufferistoosmalltocontaintheresulting*string.*/error=1;}}else{/*CannotallocateDIRstructure*/error=1;}/*Cleanupincaseoferror*/if(error&&dirp){free(dirp);dirp=NULL;}returndirp;}

6、/**Readnextdirectoryentry.**Whenworkingwi隋茚粟胫thtextconsoles,ple锾攒揉敫asenotethatfilenamesreturnedby*readdir()arerepresentedinthedefaultANSIcodepagewhileanyoutputto*consoleistypicallyformattedonanothercodepage.Thus,non-ASCII*charactersinfilenameswillnotusuallydisplaycorrectlyonconsole.The*problemcanbefixedintwoways:(1)changethecharactersetofconsole*to1252usingchcputilityanduseLucidaConsolefont,or(2)use*_cprintffunctionwhenwritingtoconsole.The_cprinf()willre-encode*ANSIstringstotheconsolecodepagesomanynon-ASCIIcharacterswill*displaycorrecly.*/staticstructdirent*readdir(DIR*dirp){WIN32_FIND_DATAW*datap;structdirent*entp;/*Readnextdirectoryentry*/datap=dirent_next(dirp->wdirp);if(datap){size_tn;interror;/*Attempttoconvertfilenametomulti-bytestring*/error=dirent_wcstombs_s(&n,dirp->ent.d_name,PATH_MAX,datap->cFileName,PATH_MAX);/**Ifthefilenamecannotberepresentedbyamulti-bytestring,*thenattempttouseold8+3filename.Thisallowstraditional*Unix-codetoaccesssomefilenamesdespiteofunicode*characters,althoughfilenamesmayseemunfamiliartotheuser.**Bewarethatthecodebelowcannotcomeupwithashortfile*nameunlessthefilesystemprovidesone.Atleast*VirtualBoxsharedfoldersfailtodothis.*/if(error&&datap->cAlternateFileName[0]!='\0'){error=dirent_wcstombs_s(&n,dirp->ent.d_name,PATH_MAX,datap->cAlternateFileName,PATH_MAX);}if(!error){DWORDattr;/*Initializedirectoryentryforreturn*/entp=&dirp->ent;/*Lengthoffilenameexcludingzeroterminator*/entp->d_namlen=n-1;/*Fileattributes*/attr=datap->dwFileAttributes;if((attr&FILE_ATTRIBUTE_DEVICE)!=0){entp->d_type=DT_CHR;}elseif((attr&FILE_ATTRIBUTE_DIRECTORY)!=0){entp->d_type=DT_DIR;}else{entp->d_type=DT_REG;}/*Resetdummyfields*/entp->d_ino=0;entp->d_reclen=sizeof(structdirent);}else{/**Cannotconvertfilenametomulti-bytestringsoconstruct*anerrornousdirectoryentryandreturnthat.Notethat*wecannotreturnNULLasthatwouldstoptheprocessing*ofdirectoryentriescompletely.*/entp=&dirp->ent;entp->d_name[0]='?';entp->d_name[1]='\0';entp->d_namlen=1;entp->d_type=DT_UNKNOWN;entp->d_ino=0;entp->d_reclen=0;}}else{/*Nomoredirectoryentries*/entp=NULL;}returnentp;}

7、/**Closedirectorystream.*/staticintclosedi筠续师诈r(DIR*dirp){in墉掠载牿tok;if(dirp){/*Closewide-characterdirectorystream*/ok=_wclosedir(dirp->wdirp);dirp->wdirp=NULL;/*Releasemulti-bytecharacterversion*/free(dirp);}else{/*Invaliddirectorystream*/dirent_set_errno(EBADF);ok=/*failure*/-1;}returnok;}

© 一点知识