日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

花40分钟写一个-CBIR引擎-代码公开

發布時間:2025/6/15 21 豆豆
生活随笔 收集整理的這篇文章主要介紹了 花40分钟写一个-CBIR引擎-代码公开 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
? ? ? 瀏覽網頁的時候發現一篇不錯的文章"用Python和OpenCV創建一個圖片搜索引擎的完整指南"http://python.jobbole.com/80860/.作者在瀏覽自己旅游的照片的時候,發現照片太多了分類不過來,一時技癢寫了個分類軟件,雖然簡單但是有用。關鍵的是我發現他在原文中使用了半個小時就寫出來了。 ? ? ? ?蠻快的嘛,我想。那么我要用多長時間寫出來了,畢竟對于CBIR也是研究過的。 ? ? ? ?那么立即來做,首先我要找到是圖片。我沒有那么多旅游圖片(汗),但是別人的照片也是可以一樣用的。找到了之前專門用于測試CBIR的圖片集,大概是這個樣子

就是各種奇奇怪的照片。然后搭建opencv的基本框架。我們python用的不熟,但是c++下面自己是有類庫的,所以用起來也不是很復雜 ? ? ? ?首先是讀入所有的圖片: //遞歸讀取目錄下全部文件
void?getFiles(string?path,?vector<string>&?files,string?flag){
????//文件句柄
????long???hFile???=???0;
????//文件信息
????struct?_finddata_t?fileinfo;
????string?p;
????if((hFile?=?_findfirst(p.assign(path).append("\\*").c_str(),&fileinfo))?!=??-1){
????????do{
????????????//如果是目錄,迭代之,如果不是,加入列表
????????????if((fileinfo.attrib?&??_A_SUBDIR)){
????????????????if(strcmp(fileinfo.name,".")?!=?0??&&??strcmp(fileinfo.name,"..")?!=?0?&&?flag=="r")
????????????????????getFiles(?p.assign(path).append("\\").append(fileinfo.name),?files,flag?);
????????????}
????????????else{
????????????????files.push_back(p.assign(path).append("\\").append(fileinfo.name)?);
????????????}
????????}while(_findnext(hFile,?&fileinfo)??==?0);
????????_findclose(hFile);
????}
}
//遞歸讀取目錄下全部圖片
void?getFiles(string?path,?vector<Mat>&?files,string?flag){
????vector<string>?fileNames;
????getFiles(path,fileNames,flag);
????for?(int?i=0;i<fileNames.size();i++){
????????Mat?tmp?=?imread(fileNames[i]);
????????if?(tmp.rows>0)//如果是圖片
????????????files.push_back(tmp);
????}
}
//遞歸讀取目錄下全部圖片和名稱
void?getFiles(string?path,?vector<pair<Mat,string>>&?files,string?flag){
????vector<string>?fileNames;
????getFiles(path,fileNames,flag);
????for?(int?i=0;i<fileNames.size();i++){
????????Mat?tmp?=?imread(fileNames[i]);
????????if?(tmp.rows>0){
???????????????pair<Mat,string>?apir;
???????????????apir.first?=?tmp;
???????????????apir.second?=?fileNames[i];
???????????????files.push_back(apir);
????????}
????}
} 然后是編寫hsv距離,這個參考以前的資料 double?GetHsVDistance(Mat?src_base,Mat?src_test1){
????Mat???hsv_base;
????Mat???hsv_test1;
????///??Convert??to??HSV
????cvtColor(??src_base,??hsv_base,??COLOR_BGR2HSV??);
????cvtColor(??src_test1,??hsv_test1,??COLOR_BGR2HSV??);
????///??Using??50??bins??for??hue??and??60??for??saturation
????int??h_bins??=??50;??int??s_bins??=??60;
????int??histSize[]??=??{??h_bins,??s_bins??};
????//??hue??varies??from??0??to??179,??saturation??from??0??to??255
????float??h_ranges[]??=??{??0,??180??};
????float??s_ranges[]??=??{??0,??256??};
????const??float*??ranges[]??=??{??h_ranges,??s_ranges??};
????//??Use??the??o-th??and??1-st??channels
????int??channels[]??=??{??0,??1??};
????///??Histograms
????MatND??hist_base;
????MatND??hist_test1;
????///??Calculate??the??histograms??for??the??HSV??images
????calcHist(??&hsv_base,??1,??channels,??Mat(),??hist_base,??2,??histSize,??ranges,??true,??false??);
????normalize(??hist_base,??hist_base,??0,??1,??NORM_MINMAX,??-1,??Mat()??);
????calcHist(??&hsv_test1,??1,??channels,??Mat(),??hist_test1,??2,??histSize,??ranges,??true,??false??);
????normalize(??hist_test1,??hist_test1,??0,??1,??NORM_MINMAX,??-1,??Mat()??);
????///??Apply??the??histogram??comparison??methods
????double??base_test1??=??compareHist(??hist_base,??hist_test1,??0??);
????return?base_test1;
} 封裝成函數。這個函數比原文中作者提出的方法要簡單,我偷懶了。 然后就是要編寫主函數程序,這個比較麻煩的地方就是要比較出最前面的10 個圖片 。我采用比較笨的方法,趕時間嘛: int?_tmain(int?argc,?_TCHAR*?argv[])
{????
????vector<pair<Mat,string>>?imagepairs;
????vector<double>?dresult;
????double?dmax?=?0;
????int?imax?=?-1;
????
????//讀入圖片
????getFiles("images",imagepairs);
????Mat?src?=?imread("images/0.jpg");
????//距離測算
????for?(int?i=0;i<imagepairs.size();i++){
????????double?tmp?=?GetHsVDistance(src,imagepairs[i].first);
????????if?(tmp?==1)
????????????tmp?=0;//不能搞自己
????????char?cbuf[1024];
????????sprintf_s(cbuf,"dst/%d.jpg",i);
????????dresult.push_back(tmp);//推入vecresult中
????}
????//尋找前10個圖片
????for?(int?index?=?0;index<10;index++){
????????for?(int?i=0;i<imagepairs.size();i++){
????????????if?(dresult[i]>dmax){
????????????????dmax?=?dresult[i];
????????????????imax?=?i;
????????????}
????????}
????????char?cbuf[1024];
????????sprintf_s(cbuf,"dst/%d.jpg",index);
????????imwrite(cbuf,imagepairs[imax].first);
????????dresult[imax]?=?0;//剔出隊列
????????dmax?=?0;
????????imax?=?-1;
????}
????printf("OK");
????waitKey();
????return?0;
} 前后花了40-50分鐘時間,最后的效果不如作者的效果。主要差距在核心算法上面。看來日常的算法總結重構的確很有價值。 這篇文章先寫到這里,最近事多,等到閑下來再進行重構。歡迎大家批評指正。 ?



來自為知筆記(Wiz)



總結

以上是生活随笔為你收集整理的花40分钟写一个-CBIR引擎-代码公开的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 日本性xxxxx 免费毛片视频网站 | 两性免费视频 | 成人性生交大片 | 一区二区在线观看免费视频 | 久久午夜影院 | 亚洲国产精品久久久 | 花房姑娘免费全集 | 午夜试看120秒 | 久久这里只有精品首页 | 永久免费精品视频 | xxx国产在线观看 | 影音先锋成人在线 | 日韩乱码一区二区三区 | 日韩色区 | 成人av网页 | 奇米影视777第四色 2019中文字幕在线免费观看 | 少妇无码av无码专区在线观看 | 四虎成人在线视频 | 成人久久久精品国产乱码一区二区 | 综合激情av| 国产精品无码乱伦 | 老妇裸体性激交老太视频 | 国产尻逼 | 久草色在线 | 国产情侣一区二区三区 | 国产系列精品av | 黑人欧美一区二区三区 | 国产高清视频免费在线观看 | 亚洲成人激情在线 | av在线电影观看 | 好大好爽视频 | 在线观看成人 | 激情伊人五月天 | 久久午夜神器 | 国产一区二区三区视频在线播放 | 韩国19主播内部福利vip | 澳门黄色网 | 日韩精品无码一区二区三区 | 激情小说在线观看 | a天堂中文字幕 | 成人午夜影视 | 国产福利在线观看视频 | 波多野结衣av在线免费观看 | 国产动漫av| 桃色一区 | 亚洲天堂自拍 | 亚洲一区二区观看播放 | 国产香蕉在线视频 | 一区=区三区乱码 | 欧美日韩精品久久久免费观看 | 成人网站免费观看 | 国产毛片网 | 免费黄网在线看 | 91国产免费观看 | 中文字幕系列 | 性工作者十日谈 | 91成人免费版| 国产一区二区三区亚洲 | sm在线观看 | 日本大胆裸体做爰视频 | 国产精品久久久久久久久免费软件 | 色婷婷aⅴ一区二区三区 | 91大神久久 | 亚洲4区| 久久综合久久鬼 | av五月天在线 | 99久久国产热无码精品免费 | 欧美性做爰免费观看 | 亚洲欧美日韩专区 | 双性懵懂美人被强制调教 | 国产美女主播视频 | 亚洲私人影院 | 操出白浆视频 | 97国产免费 | 18日本xxxxxxxxx95 国产又好看的毛片 | 尹人综合在线 | 久久综合激的五月天 | 欧美999| 午夜插插插 | 成人一级免费视频 | 成人黄色一级片 | 国产夫妻视频 | 日本色呦呦 | jizz性欧美17 | 麻豆综合网 | 韩国av电影在线观看 | av网站在线观看免费 | 欧美大胆a视频 | 亚洲男人天堂2017 | 超碰青青操 | 秋霞av一区二区三区 | 国产精久久一区二区三区 | 国产裸体永久免费无遮挡 | 欧美bbbbb性bbbbb视频 | 成人黄色一级片 | 91在线日本 | 亚洲三区视频 | 激情五月视频 | 激情综合六月 |