opencv批处理提取图像的特征

来源:互联网 发布:软件体系有哪些 编辑:程序博客网 时间:2024/05/16 15:07

 转载:http://blog.csdn.net/zhangping1987/article/details/36433167

批处理(dir/a/s/b)

例:某目录下有a、b、c、d、e、f、g、h、j的图片和一个文件夹JN,里边包含一张图片john.jpg


我们在该目录下的命令行中 输入:dir/b

b:只显示当前目录下文件名及文件夹名

a-d:只是显示该目录下的文件名(没有了文件夹的名)

我们在该目录下的命令行中 输入:dir/a-d/b

S:显示该目录下的文件名和文件夹名,及子目录下的文件名,并显示这些文件的绝对路径

我们在该目录下的命令行中 输入:dir/s/b


我们在该目录下的命令行中 输入:dir/s/a-d/b(由于a-d的作用,文件夹JN没有显示出来)

我们在该目录下的命令行中 输入:dir/s/a-d/b>F:\目录.txt

就会在F盘生成一个文件名为 目录 的.txt文件,该文件包含上面的命令行打出的内容。


—————————————————————————————————————————————————————

第二步:既然已经生成上述文件 目录.txt,然会我们写程序读取这个 目录.txt 即可。

[html] view plain copy
 print?在CODE上查看代码片派生到我的代码片
  1. <span style="font-family:Microsoft YaHei;font-size:14px;"><span style="font-family:Microsoft YaHei;font-size:14px;"><span style="font-family:Microsoft YaHei;font-size:14px;">#include<iostream>  
  2. #include<fstream>  
  3. #include<string>  
  4. using namespace std;  
  5. int main(int argc,char* argv[])  
  6. {  
  7.     if(argc !=2)  
  8.     {  
  9.         cerr << "Wrong Argument !" <<endl;  
  10.         return -1;  
  11.     }  
  12.     //定义文件流,只能读取  
  13.     ifstream inPutFile(argv[1],ios::in);  
  14.     if(! inPutFile)  
  15.     {  
  16.         cerr << "File Open Erro !" <<endl;  
  17.         return -1;  
  18.     }  
  19.     //读取文件流中的每一行,并赋值给fileName,并在命令行中打印  
  20.     string fileName ;  
  21.     /*   
  22.     测试读取文件中的每一行  
  23.     */  
  24.     //行数  
  25.     int number = 0;  
  26.     while (getline(inPutFile,fileName))  
  27.     {  
  28.         number ++;  
  29.         cout<<"第"<< number << "行"<< fileName <<endl;  
  30.     }  
  31.     //注意一定要记得关闭文件流  
  32.     inPutFile.close();  
  33.     return 0;  
  34. }</span></span></span>  

我们编译一下:


我们看一下输出结果:

好的,这样,说明我们读到了每一行。

————————————————————————————————————————————————————

第三步:配置Opencv,然后,读取显示每一幅图片

[cpp] view plain copy
 print?在CODE上查看代码片派生到我的代码片
  1. <span style="font-family:Microsoft YaHei;font-size:14px;"><span style="font-family:Microsoft YaHei;font-size:14px;">#include<iostream>  
  2. #include<fstream>  
  3. #include<string>  
  4. using namespace std;  
  5. #include<opencv2\imgproc\imgproc.hpp>  
  6. #include<opencv2\core\core.hpp>  
  7. #include<opencv2\highgui\highgui.hpp>  
  8. using namespace cv;  
  9. int main(int argc,char* argv[])  
  10. {  
  11.     if(argc !=2)  
  12.     {  
  13.         cerr << "Wrong Argument !" <<endl;  
  14.         return -1;  
  15.     }  
  16.     //定义文件流,只能读取  
  17.     ifstream inPutFile(argv[1],ios::in);  
  18.     if(! inPutFile)  
  19.     {  
  20.         cerr << "File Open Erro !" <<endl;  
  21.         return -1;  
  22.     }  
  23.     //读取文件流中的每一行,并赋值给fileName,读取每一幅图像并显示  
  24.     string fileName ;  
  25.     Mat image;  
  26.     while (getline(inPutFile,fileName))  
  27.     {  
  28.           
  29.         image = imread(fileName,1);  
  30.         namedWindow(fileName,1);  
  31.         imshow(fileName,image);  
  32.     }  
  33.     waitKey(0);  
  34.     //注意一定要记得关闭文件流  
  35.     inPutFile.close();  
  36.     return 0;  
  37. }</span></span>  


结果:

我们看到我们已经成功把每一幅图像读入到内存中,这样我们就可以求每一幅图像的特征。

—————————————————————————————————————————————————————

第四步:我们计算每一幅图像的直方图特征(当然opencv中sift、surf、densesift等,因为我这里的图片大小不一样,所以我用直方图的特征,使得特征向量的长度一样)

[cpp] view plain copy
 print?在CODE上查看代码片派生到我的代码片
  1. <span style="font-family:Microsoft YaHei;font-size:14px;">#include<iostream>  
  2. #include<fstream>  
  3. #include<string>  
  4. using namespace std;  
  5.   
  6. #include<opencv2\imgproc\imgproc.hpp>  
  7. #include<opencv2\core\core.hpp>  
  8. #include<opencv2\highgui\highgui.hpp>  
  9. using namespace cv;  
  10.   
  11. //计算二维直方图特征  
  12. Mat hist2d(const Mat& src);  
  13.   
  14. int main(int argc,char* argv[])  
  15. {  
  16.     if(argc !=2)  
  17.     {  
  18.         cerr << "Wrong Argument !" <<endl;  
  19.         return -1;  
  20.     }  
  21.     //定义文件流,只能读取  
  22.     ifstream inPutFile(argv[1],ios::in);  
  23.     if(! inPutFile)  
  24.     {  
  25.         cerr << "File Open Erro !" <<endl;  
  26.         return -1;  
  27.     }  
  28.     //读取文件流中的每一行,并赋值给fileName,读取每一幅图像并显示  
  29.     string fileName ;  
  30.     Mat image;  
  31.     Mat featureHist;  
  32.     Mat featureHists;  
  33.     while (getline(inPutFile,fileName))  
  34.     {  
  35.           
  36.         image = imread(fileName,1);  
  37.         //计算二维直方图特征  
  38.         featureHist = hist2d(image);  
  39.         //按行存储每一幅图像的二维直方图特征  
  40.         featureHists.push_back(featureHist);  
  41.     }  
  42.     //注意一定要记得关闭文件流  
  43.     inPutFile.close();  
  44.     return 0;  
  45. }  
  46.   
  47. Mat hist2d(const Mat& src)  
  48. {  
  49.     Mat hsv;  
  50.   
  51.     //颜色空间的转换 BGR2HSV  
  52.     cvtColor(src,hsv,CV_BGR2HSV);  
  53.   
  54.     //把H通道分为30个bin,把S通道分为32bin  
  55.     int hbins = 30;  
  56.     int sbins = 32;  
  57.     int histSize[] = { hbins , sbins};  
  58.   
  59.     //H的取值范围 0-179  
  60.     float hranges[]= {0,180};  
  61.     //S的取值范围 0-255  
  62.     float sranges [] ={0,256};  
  63.     const float* ranges [] ={hranges,sranges};  
  64.   
  65.     Mat hist2D,histRow,histRowDst;  
  66.     //我们根据图像的第一通道和第二通道,计算二维直方图,而且输出的hist2D为32F  
  67.     int channels [] ={0,1};  
  68.     calcHist(&hsv,1,channels,Mat(),hist2D,2,histSize,ranges,true,false);  
  69.     //把直方图特征按一行来存储  
  70.     histRow=hist2D.reshape(1,1);  
  71.   
  72.     //把直方图归一化  
  73.     normalize(histRow,histRowDst,1,0,NORM_L1);  
  74.   
  75.     return histRowDst;  
  76. }</span>  
这样就把所有的图像的二维直方图特征按行存储在featureHists中。当然可以把二维直方图特征换成自己想要用的任意特征。

—————————————————————————————————————————————————————

第五步:

我们所有图像的颜色直方图存储到.xml文件中,

[cpp] view plain copy
 print?在CODE上查看代码片派生到我的代码片
  1. #include<iostream>  
  2. #include<fstream>  
  3. #include<string>  
  4. using namespace std;  
  5.   
  6. #include<opencv2\imgproc\imgproc.hpp>  
  7. #include<opencv2\core\core.hpp>  
  8. #include<opencv2\highgui\highgui.hpp>  
  9. using namespace cv;  
  10.   
  11. //计算二维直方图特征  
  12. Mat hist2d(const Mat& src);  
  13.   
  14. int main(int argc,char* argv[])  
  15. {  
  16.     if(argc !=2)  
  17.     {  
  18.         cerr << "Wrong Argument !" <<endl;  
  19.         return -1;  
  20.     }  
  21.     //定义文件流,只能读取  
  22.     ifstream inPutFile(argv[1],ios::in);  
  23.     if(! inPutFile)  
  24.     {  
  25.         cerr << "File Open Erro !" <<endl;  
  26.         return -1;  
  27.     }  
  28.     //读取文件流中的每一行,并赋值给fileName,读取每一幅图像并显示  
  29.     string fileName ;  
  30.     Mat image;  
  31.     Mat featureHist;  
  32.     Mat featureHists;  
  33.     while (getline(inPutFile,fileName))  
  34.     {  
  35.           
  36.         image = imread(fileName,1);  
  37.         //计算二维直方图特征  
  38.         featureHist = hist2d(image);  
  39.         //按行存储每一幅图像的二维直方图特征  
  40.         featureHists.push_back(featureHist);  
  41.     }  
  42.     //注意一定要记得关闭文件流  
  43.     inPutFile.close();  
  44.   
  45.     /*第五步,把图像特征保存到.xml文件中*/  
  46.     FileStorage fs("C:\\Users\\zhaoyuan001\\Desktop\\test\\dirtest\\x64\\Debug\\da.xml",FileStorage::WRITE);  
  47.     fs<<"featureHists"<<featureHists;  
  48.     fs.release();  
  49.       
  50.     return 0;  
  51. }  
  52.   
  53. Mat hist2d(const Mat& src)  
  54. {  
  55.     Mat hsv;  
  56.   
  57.     //颜色空间的转换 BGR2HSV  
  58.     cvtColor(src,hsv,CV_BGR2HSV);  
  59.   
  60.     //把H通道分为30个bin,把S通道分为32bin  
  61.     int hbins = 30;  
  62.     int sbins = 32;  
  63.     int histSize[] = { hbins , sbins};  
  64.   
  65.     //H的取值范围 0-179  
  66.     float hranges[]= {0,180};  
  67.     //S的取值范围 0-255  
  68.     float sranges [] ={0,256};  
  69.     const float* ranges [] ={hranges,sranges};  
  70.   
  71.     Mat hist2D,histRow,histRowDst;  
  72.     //我们根据图像的第一通道和第二通道,计算二维直方图,而且输出的hist2D为32F  
  73.     int channels [] ={0,1};  
  74.     calcHist(&hsv,1,channels,Mat(),hist2D,2,histSize,ranges,true,false);  
  75.     //把直方图特征按一行来存储  
  76.     histRow=hist2D.reshape(1,1);  
  77.   
  78.     //把直方图归一化  
  79.     normalize(histRow,histRowDst,1,0,NORM_L1);  
  80.   
  81.     return histRowDst;  
  82. }  
_______________________________________________________________________________________________________________________________

上面已经批处理提取了图像的特征,那么通常我们再做目标识别、检测时,会给训练数据集,准备类标签,下面,继续对上述程序进行拓展。


0 0
原创粉丝点击