基于opencv的bp神经网络判别

事先说明,本人纯粹是小白。写这篇博客也是相信小白惜小白,顺带锻炼一下写作能力(毕设需求),因此,有问题还是靠度娘吧! 作为刚接触程序的新人,看网上大佬们分享的程序,在对他们顶膜礼拜的同时,却不经怀有抱怨的心情。因为大部分大佬们,不知是想锻炼我们,还是单纯的嫌麻烦,亦或者对于他们来说,这根本就不是什么难懂的地方,我只想说,你们为什么就不写注释呢(血泪聚下)。这篇博客是在网上查找的程序基础上,标注自己的理解,或许有不当的地方,请大家指正,好了,我就不啰嗦了(应该也没人看)以下是干货。 我是利用bp神经网络进行对图片分类判别,神经网络的原理在网上有现成的,不想去搜的朋友可以看这一篇http://blog.csdn.net/garfielder007/article/details/51004919,原理稍稍理解后,我们就可以进行程序的实现了。 首先在VS中建立工程,名字随意,我这里起名为bpnet;在建好的工程文件夹中放入训练的文件,我这里分成两类,一类是清晰图片,另一类是模糊图片,都放在charSamples,如图,0文件夹为清晰,1文件夹为模糊

如图基于opencv的bp神经网络判别_第1张图片

添加源程序:

#include 
#include 
#include 

using namespace cv;
using namespace std;

char* WcharToChar(const wchar_t* wp)  
{  
    char *m_char;
    int len= WideCharToMultiByte(CP_ACP,0,wp,wcslen(wp),NULL,0,NULL,NULL);  
    m_char=new char[len+1];  
    WideCharToMultiByte(CP_ACP,0,wp,wcslen(wp),m_char,len,NULL,NULL);  
    m_char[len]='\0';  
    return m_char;  
}  

wchar_t* CharToWchar(const char* c)  
{   
    wchar_t *m_wchar;
    int len = MultiByteToWideChar(CP_ACP,0,c,strlen(c),NULL,0);  
    m_wchar=new wchar_t[len+1];  
    MultiByteToWideChar(CP_ACP,0,c,strlen(c),m_wchar,len);  
    m_wchar[len]='\0';  
    return m_wchar;  
}  

wchar_t* StringToWchar(const string& s)  
{  
    const char* p=s.c_str();  
    return CharToWchar(p);  
}  

int main()
{
	const string fileform = "*.jpg";//文件格式
	const string perfileReadPath = "charSamples"; //文件前置路径
   
	const int sample_mun_perclass = 40;//训练字符每类数量
	const int class_mun = 2;//训练字符类数
    
	const int image_cols = 8;//图片分为列,可自行调整,这里只是随意写的
	const int image_rows = 16;//图片分为行
    
	string fileReadName,fileReadPath;
    
        char temp[256];

	float trainingData[class_mun*sample_mun_perclass] [image_cols*image_rows] = {{0}};//每一行一个训练样本
	float labels[class_mun*sample_mun_perclass][class_mun] = {{0}};//训练样本标签
   

	for(int i=0;i<=class_mun-1;++i)//不同类
	{
		//读取每个类文件夹下所有图像
		int  j = 0;//每一类下读取图像计数个数
		sprintf(temp,"%d",i);//按顺序读图
		fileReadPath = perfileReadPath + "/" + temp + "/" + fileform;//文件读取路径
		cout<<"文件夹"<(1,5) << image_rows*image_cols,128,128,128,class_mun);//1个输入,1个输出,3个隐藏层,隐藏层数也根据内容自己调整
    bp.create(layerSizes,CvANN_MLP::SIGMOID_SYM,1.0,1.0);//CvANN_MLP::SIGMOID_SYM节点使用的函数
                                               
    cout<<"training...."<sampleMat(1,image_rows*image_cols); 
    for(int i = 0; i(0,i) = (float)test_temp.at(i/8,i%8);  //将test数据(unchar)copy到sampleMat(float)中图像特征
    }  

    Mat responseMat;  
    bp.predict(sampleMat,responseMat); //过调用predict函数,我们得到一个输出向量,它是一个1*nClass的行向量,
	                                   //其中每一列说明它与该类的相似程度(0-1之间),也可以说是置信度
    Point maxLoc;
    double maxVal = 0;
    minMaxLoc(responseMat,NULL,&maxVal,NULL,&maxLoc);//最小最大值
    string judge = "";
	if(maxLoc.x == 0)
		judge = "清晰";
     if(maxLoc.x == 1)
		judge = "模糊";
    cout<<"识别结果:"<


测试图:

基于opencv的bp神经网络判别_第2张图片

运行结果:

基于opencv的bp神经网络判别_第3张图片

以上,我的第一篇博客就写完了,建议配合大神们给出的原理理解会更好!



你可能感兴趣的:(编程语言)