📄 childview.cpp
字号:
j_src=j+counts*w;
lpSrc=(BYTE *)lpDIBBits + lLineBytes * i_src + j_src;
lpDst=(BYTE *)lpNewDIBBits + lLineBytesnew * i + j;
*lpDst=*lpSrc;
}
::GlobalUnlock (hDIB);
m_dibRect.push_back (hDIB);
counts++;
}
m_charRect=m_charRectCopy;
m_dibRectCopy=m_dibRect;
//输出为.bmp文件
CString str;
counts=1;
while(!m_dibRect.empty ())
{
str.Format ("part%d.bmp",counts);
//str=strPath+"\\"+str;
CFile file(str, CFile::modeReadWrite|CFile::modeCreate);
hDIB=m_dibRect.front ();
::SaveDIB (hDIB,file);
m_dibRect.pop_front ();
file.Close ();
counts++;
}
m_dibRect=m_dibRectCopy;
}
void CChildView::OnImgprcThinning()
{
Thinning(m_hDIB);
//在屏幕上显示位图
CDC* pDC=GetDC();
DisplayDIB(pDC,m_hDIB);
}
void CChildView::OnInputGuiyihuaInfo()
{
CINPUT1 input;
input.w =8;
input.h =16;
if(input.DoModal ()!=IDOK) return;
w_sample=input.w;
h_sample=input.h;
gyhinfoinput=true;
}
void CChildView::OnBpnetTrain()
{
OnImgprcAll();
//判断是否经过了归一划的处理
if(gyhfinished==false)
{
//如果没有进行提示错误并返回
::MessageBox(NULL,"没有进行归一划预处理",NULL,MB_ICONSTOP);
return;
}
//建立BP网络训练参数对话框
CDBpParamater BpPa;
//初始化变量
BpPa.m_a=0;
BpPa.m_eta=0.015;
BpPa.m_ex=0.001;
BpPa.m_hn=10;
// 显示对话框
if(BpPa.DoModal()!=IDOK)
{
//返回
return;
}
//用户获得参数信息
//相关系数
double momentum=BpPa.m_a;
//最小均方误差
double min_ex=BpPa.m_ex;
//隐层数目
int n_hidden=BpPa.m_hn;
//训练步长
double eta=BpPa.m_eta;
//获得指向DIB的指针
BYTE *lpDIB=(BYTE*)::GlobalLock((HGLOBAL) m_hDIB);
//获得指向DIB象素的指针,并指向象素的起始位置
BYTE *lpDIBBits =(BYTE*)::FindDIBBits((char *)lpDIB);
//获得颜色信息
int numColors=(int) ::DIBNumColors((char *)lpDIB);
//不是灰度图返回
if (numColors!=256)
{
::GlobalUnlock((HGLOBAL) m_hDIB);
::MessageBox(NULL,"只能处理灰度图像",NULL,MB_ICONSTOP);
return;
}
//获取图像的宽度
LONG lWidth = (LONG) ::DIBWidth((char *)lpDIB);
//获取图像的高度
LONG lHeight = (LONG) ::DIBHeight((char *)lpDIB);
//计算图像每行的字节数
LONG lLineByte = (lWidth+3)/4*4;
//归一化的宽度
LONG lSwidth = w_sample;
//归一化的高度
LONG LSheight = h_sample;
//指向输入样本的特征向量的指针
double **data_in;
//从输入的训练样本中提取特征向量
data_in = code ( lpDIBBits, digicount, lLineByte, lSwidth, LSheight);
//计算输入层结点的数目
int n_in = LSheight*lSwidth;
double out[][4]={ 0.1,0.1,0.1,0.1,
0.1,0.1,0.1,0.9,
0.1,0.1,0.9,0.1,
0.1,0.1,0.9,0.9,
0.1,0.9,0.1,0.1,
0.1,0.9,0.1,0.9,
0.1,0.9,0.9,0.1,
0.1,0.9,0.9,0.9,
0.9,0.1,0.1,0.1,
0.9,0.1,0.1,0.9};
double **data_out;
data_out = alloc_2d_dbl(digicount,4);
for(int i=0;i<digicount;i++)
{
for(int j=0;j<4;j++)
data_out[i][j]=out[i%10][j];
}
BpTrain( data_in, data_out, n_in,n_hidden,min_ex,momentum,eta,digicount);
::GlobalUnlock(m_hDIB);
CDC* pDC=GetDC();
DisplayDIB(pDC,m_hDIB);
}
void CChildView::OnBpnetRecognize()
{
// TODO: Add your command handler code here
OnImgprcAll();
//判断是否经过了归一划的处理
if(gyhfinished==false)
{
//如果没有进行提示错误并返回
::MessageBox(NULL,"没有进行归一划预处理",NULL,MB_ICONSTOP);
return;
}
//获得指向DIB的指针
BYTE *lpDIB=(BYTE*)::GlobalLock((HGLOBAL) m_hDIB);
//获得指向DIB象素的指针,并指向象素的起始位置
BYTE *lpDIBBits =(BYTE*)::FindDIBBits((char *)lpDIB);
//获得颜色信息
int numColors=(int) ::DIBNumColors((char *)lpDIB);
//不是灰度图返回
if (numColors!=256)
{
::GlobalUnlock((HGLOBAL) m_hDIB);
::MessageBox(NULL,"只能处理256色图像",NULL,MB_ICONSTOP);
return;
}
//获取图像的宽度
LONG lWidth = (LONG) ::DIBWidth((char *)lpDIB);
//获取图像的高度
LONG lHeight = (LONG) ::DIBHeight((char *)lpDIB);
//计算图像每行的字节数
LONG lLineByte = (lWidth+3)/4*4;
//归一化的宽度
LONG lSwidth = w_sample;
//归一化的高度
LONG LSheight = h_sample;
// 读取结点信息
int n[3];
if(r_num(n,"num")==false)
return;
//获得输入层结点数目
int n_in=n[0];
//获得隐层结点数目
int n_hidden=n[1];
//获得输出层结点数目
int n_out=n[2];
//判断待识别样本的归一划信息是否与训练时相同
if(n_in!=lSwidth*LSheight)
{
//如果不相同提示错误并返回
::MessageBox(NULL,"归一划尺寸与上一次训练时不一致",NULL,MB_ICONSTOP);
return;
}
//指向输入样本的特征向量的指针
double **data_in;
//从输入的训练样本中提取特征向量
data_in = code ( lpDIBBits, digicount, lLineByte, lSwidth, LSheight);
//根据提取的特征进行样本识别
CodeRecognize(data_in, digicount,n_in,n_hidden,n_out);
::GlobalUnlock(m_hDIB);
CDC* pDC=GetDC();
DisplayDIB(pDC,m_hDIB);
}
void CChildView::OnDraw(CDC *pDC)
{
if(m_hDIB!=NULL)
DisplayDIB(pDC,m_hDIB);
}
void CChildView::Onaver()
{
// TODO: Add your command handler code here
//设定模板参数
double tem[9]={1,1,1,
1,1,1,
1,1,1};
//设定模板系数
double xishu = 0.111111;
//进行模板操作
m_hDIB =Template(m_hDIB,tem ,3,3, xishu);
//显示图像
CDC* pDC=GetDC();
DisplayDIB(pDC,m_hDIB);
}
void CChildView::OnGass()
{
// TODO: Add your command handler code here
//设定模板参数
double tem[9]={1,2,1,
2,4,2,
1,2,1};
//设定模板系数
double xishu = 0.0625;
//进行模板操作
m_hDIB =Template(m_hDIB,tem ,3,3, xishu);
//显示图像
CDC* pDC=GetDC();
DisplayDIB(pDC,m_hDIB);
}
void CChildView::OnMid()
{
// TODO: Add your command handler code here
//进行中值滤波
m_hDIB =MidFilter(m_hDIB,3,3);
//显示图像
CDC* pDC=GetDC();
DisplayDIB(pDC,m_hDIB);
}
void CChildView::OnImgprcEqualize()
{
Equalize(m_hDIB);
//显示图像
CDC* pDC=GetDC();
DisplayDIB(pDC,m_hDIB);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -