浏览网页的时候发现一篇不错的文章"用Python和OpenCV创建一个图片搜索引擎的完整指南"http://python.jobbole.com/80860/.作者在浏览自己旅游的照片的时候,发现照片太多了分类不过来,一时技痒写了个分类软件,虽然简单但是有用。关键的是我发现他在原文中使用了半个小时就写出来了。
蛮快的嘛,我想。那么我要用多长时间写出来了,毕竟对于CBIR也是研究过的。
那么立即来做,首先我要找到是图片。我没有那么多旅游图片(汗),但是别人的照片也是可以一样用的。找到了之前专门用于测试CBIR的图片集,大概是这个样子
就是各种奇奇怪怪的照片。然后搭建opencv的基本框架。我们python用的不熟,但是c++下面自己是有类库的,所以用起来也不是很复杂
首先是读入所有的图片:
;
){
);
_findclose(hFile);
}
}
;i);i){
pair<Mat,string> apir;
apir.first = tmp;
apir.second = fileNames[i];
files.push_back(apir);
}
}
}
){
);
_findclose(hFile);
}
}
;i);i){
pair<Mat,string> apir;
apir.first = tmp;
apir.second = fileNames[i];
files.push_back(apir);
}
}
}
然后是编写hsv距离,这个参考以前的资料
; ;
, };
, };
, };
, channels, Mat(), hist_base, , histSize, ranges, , , NORM_MINMAX, , Mat() );
calcHist( , channels, Mat(), hist_test1, , histSize, ranges, , , NORM_MINMAX, , Mat() );
);
return base_test1;
}
, };
, };
, };
, channels, Mat(), hist_base, , histSize, ranges, , , NORM_MINMAX, , Mat() );
calcHist( , channels, Mat(), hist_test1, , histSize, ranges, , , NORM_MINMAX, , Mat() );
);
return base_test1;
}
封装成函数。这个函数比原文中作者提出的方法要简单,我偷懒了。
然后就是要编写主函数程序,这个比较麻烦的地方就是要比较出最前面的10 个图片 。我采用比较笨的方法,赶时间嘛:
;
;
;i)
tmp ;];
sprintf_s(cbuf,;index;index;i];
sprintf_s(cbuf,;;
imax ;
}
printf(;
}
;
;i)
tmp ;];
sprintf_s(cbuf,;index;index;i];
sprintf_s(cbuf,;;
imax ;
}
printf(;
}
前后花了40-50分钟时间,最后的效果不如作者的效果。主要差距在核心算法上面。看来日常的算法总结重构的确很有价值。
这篇文章先写到这里,最近事多,等到闲下来再进行重构。欢迎大家批评指正。