OpenCv3.0+SVM的使用心得(二)

来源:互联网 发布:aj1高仿淘宝店 编辑:程序博客网 时间:2024/05/29 16:48

主要有4点总结:
1.
读取txt的内容(文件路径),按行输出。下面语句中,pictures.txt中是文件夹中的文件(图片)列表,samplePath是文件夹路径(string格式)。string和char类型可以使用‘+’连接。

char positiveImgName[256];fream f;f.open("D:\\pictures.txt",ios::in);while (!f.eof()){    f.getline(positiveImgName,256,'\n');    string picturePath=samplePath+positiveImgName;}

2.
对于某些样本照片,可能大小不如我们所愿,因此要对其进行截取。
我们可以从Mat类型中提取矩形区域:

cv::Mat bigImage=cv::Mat::zeros(cv::Size(660,350));cv::Mat smallImage=cv::Mat(bigImage,cv::Rect(0,0,110,70));

但是,需要注意这么做并没有复制图像数据,仅仅为同样的image data创建了另一个wrapper。如果需要复制数据,需要用:

cv::Mat smallImage = cv::Mat(bigImage, cv::Rect(0,0,110,70)).clone();

如果需要图像中多个不同大小的部分,需要将图像用网格划分,比如:

cv::Size smallSize(110,70);std::vector<Mat> smallImages;for (int y = 0; y < bigImage.rows; y += smallSize.height){    for (int x=0; x < bigImage.cols; x += smallSize.width)    {        cv::Rect rect =cv::Rect(x,y,smallSize.width, smallSize.height);        smallImages.push_back(cv::Mat(bigImage, rect));    }}

在图像处理中,样本的处理需要使用第二中复制数据的方式。

3.
使用dir\b>picture.lst命令行获取一个文件夹内所有文件的文件名,会在文档的最后多产生一个空行。

4.
训练出来的SVM classifier的support vector是以Mat类型进行存储,其rows是根据svm的参数而变化的,如果是二分类分类器,应该是1*n的大小。如果和规划的不一致,去查看训练数据是否有误(是否有些label未赋值等)。

0 0