📄 artdlg.cpp
字号:
// artDlg.cpp : implementation file
//
#include "stdafx.h"
#include "art.h"
#include "artDlg.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CArtDlg dialog
CArtDlg::CArtDlg(CWnd* pParent /*=NULL*/)
: CDialog(CArtDlg::IDD, pParent)
{
//{{AFX_DATA_INIT(CArtDlg)
m_WhiteOnBlack = FALSE;
//}}AFX_DATA_INIT
// Note that LoadIcon does not require a subsequent DestroyIcon in Win32
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}
void CArtDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CArtDlg)
DDX_Check(pDX, IDC_CHECK1, m_WhiteOnBlack);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CArtDlg, CDialog)
//{{AFX_MSG_MAP(CArtDlg)
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_BN_CLICKED(IDC_INIT, OnInit)
ON_BN_CLICKED(IDC_LOAD, OnLoad)
ON_BN_CLICKED(IDC_SAVEIMG, OnSaveimg)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CArtDlg message handlers
BOOL CArtDlg::OnInitDialog()
{
CDialog::OnInitDialog();
// Set the icon for this dialog. The framework does this automatically
// when the application's main window is not a dialog
SetIcon(m_hIcon, TRUE); // Set big icon
SetIcon(m_hIcon, FALSE); // Set small icon
nnum=1;
fixneuron=0;
Isload=FALSE;
Haveinit=FALSE;
recognize=FALSE;
haveinit=FALSE;
m_nbitcount=0;
mode=FALSE;
return TRUE; // return TRUE unless you set the focus to a control
}
// If you add a minimize button to your dialog, you will need the code below
// to draw the icon. For MFC applications using the document/view model,
// this is automatically done for you by the framework.
void CArtDlg::OnPaint() // 显示
{
if (IsIconic())
{
CPaintDC dc(this); // device context for painting
SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);
// Center icon in client rectangle
int cxIcon = GetSystemMetrics(SM_CXICON);
int cyIcon = GetSystemMetrics(SM_CYICON);
CRect rect;
GetClientRect(&rect);
int x = (rect.Width() - cxIcon + 1) / 2;
int y = (rect.Height() - cyIcon + 1) / 2;
// Draw the icon
dc.DrawIcon(x, y, m_hIcon);
}
else
{
CDialog::OnPaint();
}
if(Isload) // 显示载入的图片
{
CBitmap m_bitmap1;
m_nWidth = (int)m_pDib->GetWidth();
m_nHeight = (int)m_pDib->GetHeight();
pwnd1=GetDlgItem(IDC_STATIC1);
pControlDC1=pwnd1->GetDC();
CRect* pRect1=new CRect;
pwnd1->GetClientRect(pRect1);
int m_top1=pRect1->top;
int m_left1=pRect1->left;
int controlh1=pRect1->Height();
int controlw1=pRect1->Width();
delete pRect1;
pwnd1->Invalidate();
pwnd1->UpdateWindow();
CDC memDC1;
memDC1.CreateCompatibleDC(pControlDC1);
m_bitmap1.CreateCompatibleBitmap(pControlDC1, controlw1, controlh1);
pOldBitmap = memDC1.SelectObject(&m_bitmap1);
m_pDib->Draw(memDC1.m_hDC, 0, 0, m_nWidth, m_nHeight, 0, 0, m_nWidth, m_nHeight, DIB_RGB_COLORS, SRCCOPY);
pControlDC1->SetStretchBltMode(BLACKONWHITE);
pControlDC1->StretchBlt(0,0,controlw1,controlh1,&memDC1,0,0,m_nWidth,m_nHeight,SRCCOPY);
memDC1.SelectObject(pOldBitmap);
pwnd1->ReleaseDC(pControlDC1);
m_bitmap1.Detach();
m_bitmap1.DeleteObject();
}
if(recognize) // 显示识别后的图片
{
CBitmap m_bitmap2;
m_nWidth = (int)m_pDib->GetWidth();
m_nHeight = (int)m_pDib->GetHeight();
pwnd1=GetDlgItem(IDC_STATIC2);
pControlDC1=pwnd1->GetDC();
CRect* pRect2=new CRect;
pwnd1->GetClientRect(pRect2);
int m_top2=pRect2->top;
int m_left2=pRect2->left;
int controlh2=pRect2->Height();
int controlw2=pRect2->Width();
delete pRect2;
pwnd1->Invalidate();
pwnd1->UpdateWindow();
CDC memDC2;
memDC2.CreateCompatibleDC(pControlDC1);
m_bitmap2.CreateCompatibleBitmap(pControlDC1, controlw2, controlh2);
pOldBitmap = memDC2.SelectObject(&m_bitmap2);
m_pDib2->Draw(memDC2.m_hDC, 0, 0, m_nWidth, m_nHeight, 0, 0, m_nWidth, m_nHeight, DIB_RGB_COLORS, SRCCOPY);
pControlDC1->SetStretchBltMode(COLORONCOLOR);
pControlDC1->StretchBlt(0,0,controlw2,controlh2,&memDC2,0,0,m_nWidth,m_nHeight,SRCCOPY);
memDC2.SelectObject(pOldBitmap);
pwnd1->ReleaseDC(pControlDC1);
m_bitmap2.Detach();
m_bitmap2.DeleteObject();
}
if(haveinit) // 显示当前模式个数
{
strofnnum.Format(" 已存了%d个模式",nnum);
CWnd* pwnd3=GetDlgItem(IDC_STATIC3);
CDC* pControlDC3=pwnd3->GetDC();
pControlDC3->SetBkColor(RGB(234,232,216));
pControlDC3->TextOut(0,0,patternstring);
pwnd3->ReleaseDC(pControlDC3);
pwnd3=GetDlgItem(IDC_STATIC4);
pControlDC3=pwnd3->GetDC();
pControlDC3->SetBkColor(RGB(234,232,216));
pControlDC3->TextOut(0,0,strofnnum);
pwnd3->ReleaseDC(pControlDC3);
}
}
// The system calls this to obtain the cursor to display while the user drags
// the minimized window.
HCURSOR CArtDlg::OnQueryDragIcon()
{
return (HCURSOR) m_hIcon;
}
void CArtDlg::img2vector(BYTE *pimgdata, int A[], int width, int height)
{
int i,j;
BYTE temp,t;
for(i=0;i<height;i++)
{
int jump=((31+width)/32)*4;
temp=128;
int b=0;
for(j=0;j<width;j++)
{
t=*(pimgdata+b+(height-i-1)*jump);
t=(t&temp)/temp;
A[i*width+j]= (int)t;
temp=temp/2;
if(temp==0)
{
temp=128;
b=b++;
}
}
}
}
void CArtDlg::OnInit() //系统初始化
{
recognize=FALSE;
int xvector[200];
double c[200];
int i;
int num=3;
int tempnnum;
char ch1[10];
GetDlgItem(IDC_EDIT1)->GetWindowText(ch1,10);
rulo = double(atof(ch1)); //警戒值
BYTE* pimgdata1;
UpdateData(TRUE);
mode=m_WhiteOnBlack;
str.Format("..\\img\\bb%d.bmp",1);
CFile file;
BOOL fileexist=file.Open(str,CFile::modeRead,NULL);
if(fileexist)
{
file.Close();
}
else
{
str.Format(".\\img\\bb%d.bmp",1);
fileexist=file.Open(str,CFile::modeRead,NULL);
if(fileexist)
{
file.Close();
}
else
{
AfxMessageBox("Can not find file to initialize ",MB_OK,0);
return;
}
}
m_pDib=new CDib(str);
m_nWidth=m_pDib->GetWidth();
m_nHeight=m_pDib->GetHeight();
mlength=m_nWidth*m_nHeight;
m_nbitcount=m_pDib->GetBitCount();
m_pDib->ClearMemory();
initb(b,mlength); //权值初始化,自下而上
initt(t,mlength); //权值初始化,自上而下
do
{
tempnnum=nnum;
for(i=0;i<num;i++)
{
int xu=i+1;
str.Format("..\\img\\bb%d.bmp",xu);
CFile file;
BOOL fileexist=file.Open(str,CFile::modeRead,NULL);
if(fileexist)
{
file.Close();
}
else
{
str.Format(".\\img\\bb%d.bmp",xu);
}
m_pDib=new CDib(str);
pimgdata1=m_pDib->GetDibData();
m_pDib->ClearMemory();
img2vector(pimgdata1,xvector,m_nWidth,m_nHeight);
if(mode)
{
invvector(xvector,mlength);
}
matrixmulti(b,xvector,c,nnum,mlength,mlength,1); //矩阵相乘
BOOL rs=findpattern(t,b,xvector,c,nnum,mlength); // 判断是否是一个新模式,并存储
if(!rs)
{
addpattern(b,t,xvector,mlength,nnum); //增加一个模式
}
}
}
while(nnum!=tempnnum);
Haveinit=TRUE;
CWnd* pwnd=GetDlgItem(IDC_LOAD);
pwnd->EnableWindow(Haveinit);
pwnd=GetDlgItem(IDC_SAVEIMG);
pwnd->EnableWindow(recognize);
haveinit=TRUE;
pwnd=GetDlgItem(IDC_INIT);
pwnd->EnableWindow(FALSE);
Invalidate();
}
void CArtDlg::initb(double A[], int length) //权值初始化,自上而下
{
for(int i=0;i<length;i++)
{
A[i]=1.0/(1.0+length);
}
}
void CArtDlg::initt(int A[], int length) //权值初始化,自下而上
{
for(int i=0;i<length;i++)
{
A[i]=1;
}
}
BOOL CArtDlg::matrixmulti(double A[], int B[], double C[], int Am, int An, int Bm, int Bn) //矩阵相乘
{
if(An!=Bm)
{
return 1;
}
int m,n,l;
if (An!=Bm)
{ return 1;
}
for(m=0;m<Am;m++)
{
for(n=0;n<Bn;n++)
{
double sum=0;
for(l=0;l<An;l++)
{
sum=sum+A[m*An+l]*B[l*Bn+n];
}
C[m*Bn+n]=sum;
}
}
return 0;
}
int CArtDlg::findmaxneuro(double A[],int length) //选择最佳匹配样本
{
int index,i;
index=-1;
double max=0;
for(i=0;i<length;i++)
{
if(A[i]>max)
{
max=A[i];
index=i;
}
}
return index;
}
BOOL CArtDlg::findtiofneuro(int T[], int Ti[], int Tm, int Tn, int neuro)
{
if (neuro>Tm)
{
return FALSE;
}
int i;
for(i=0;i<Tn;i++)
{
Ti[i]=T[neuro*Tn+i];
}
return TRUE;
}
int CArtDlg::modofvector(int A[], int length) //向量相乘,计算匹配度
{
int result;
result=0;
for(int i=0;i<length;i++)
{
result=result+A[i];
}
return result;
}
void CArtDlg::vectormulti(int A[], int B[], int C[],int length)
{
for(int i=0;i<length;i++)
{
C[i]=A[i]*B[i];
}
}
BOOL CArtDlg::findpattern(int T[], double B[],int ivector[],double C[], int nofneuron, int length) //判断是否为新增输入
{ //rs=findpattern(t,b,xvector,c,nnum,mlength);
int ti[200],tx[200];
int i=0;
BOOL notfound=TRUE;
while((i<nofneuron)&¬found)
{
int numofmaxneuro=findmaxneuro(C,nofneuron); //选择最佳匹配样本
BOOL result=findtiofneuro(T,ti,nofneuron,length,numofmaxneuro); //
if(!result)
{
AfxMessageBox("Have a wrong ",MB_OK,0);
}
vectormulti(ti,ivector,tx,length);
double modx=modofvector(tx,length); //向量相乘,计算匹配度
double modti=modofvector(ivector,length);
double r=modx/modti;
if(r<rulo)
{
notfound=TRUE;
i++;
C[numofmaxneuro]=0;
}
else
{
fixneuron=numofmaxneuro;
notfound=FALSE;
adjustt(T,tx,length,fixneuron); //调整T的权值
// BOOL result1=findtiofneuro(T,ti,nofneuron,length,numofmaxneuro);
adjustb(B,tx,length,fixneuron); //调整B的权值
// result=findtiofneuro(T,ti,nofneuron,length,numofmaxneuro);
return TRUE;
}
}
return FALSE;
}
void CArtDlg::adjustt(int A[], int tx[], int length,int num) //调整T的权值
{
for(int i=0;i<length;i++)
{
A[num*length+i]=tx[i];
}
}
void CArtDlg::adjustb(double A[], int Ti[], int length, int num) //调整B的权值
{
double sumti=0;
int i;
for(i=0;i<length;i++)
{
sumti=sumti+Ti[i];
}
for(i=0;i<length;i++)
{
A[num*length+i]=Ti[i]/(0.5+sumti);
}
}
void CArtDlg::addpattern(double B[], int T[], int x[], int length, int& nofneuron) //增加一个模式
{
int i;
double sumx;
sumx=0;
for(i=0;i<length;i++)
{
sumx=sumx+x[i];
}
for(i=0;i<length;i++)
{
B[nofneuron*length+i]=x[i]/(1+sumx);
T[nofneuron*length+i]=x[i];
}
nofneuron++;
}
void CArtDlg::OnLoad() //载入新样本,并进行识别
{
int xvector[200];
double c[200];
CString filePath;
Invalidate();
BYTE* pimgdata;
// BYTE pimg[200];
CFileDialog fileOpenDlg(TRUE, "bmp", "*.bmp", NULL, "Bitmap Files(*.bmp)|*.bmp|All File(*.*)|*.*||", NULL);
int nRespond = fileOpenDlg.DoModal();
if(nRespond==IDOK)
{
filePath = fileOpenDlg.GetPathName();
m_pDib = new CDib(filePath);
m_pDib2=new CDib(filePath);
if(m_pDib->IsValid()==FALSE)
{
AfxMessageBox("Can not open the file",MB_OK,0);
}
pimgdata=m_pDib->GetDibData();
img2vector(pimgdata,xvector,m_nWidth,m_nHeight);
if(mode)
{
invvector(xvector,mlength);
}
matrixmulti(b,xvector,c,nnum,mlength,mlength,1); //矩阵相乘
BOOL rs=findpattern(t,b,xvector,c,nnum,mlength); // 判断是否是一个新模式,并存储
if(!rs)
{
addpattern(b,t,xvector,mlength,nnum); //增加一个模式
if(mode)
{
invvector(xvector,mlength);
}
vector2img(xvector,pimg,m_nWidth,m_nHeight);
m_pDib2->setdibdata(pimg);
patternstring=" 这是一个新增模式";
}
else
{
findtiofneuro(t,xvector,nnum,mlength,fixneuron);
if(mode)
{
invvector(xvector,mlength);
}
vector2img(xvector,pimg,m_nWidth,m_nHeight);
m_pDib2->setdibdata(pimg);
patternstring=" 这是一个库存模式";
}
Isload=TRUE;
recognize=TRUE;
}
if(nRespond==IDCANCEL)
{
recognize=FALSE;
patternstring="";
}
CWnd* pwnd=GetDlgItem(IDC_SAVEIMG);
pwnd->EnableWindow(recognize);
Invalidate();
}
void CArtDlg::vector2img(int A[], BYTE img[], int width, int height)
{
int i,j,b,w32bit;
BYTE temp,a;
w32bit=((31+width)/32)*4;
int length=w32bit*height;
for (i=0;i<length;i++)
{
img[i]=0;
}
for(i=0;i<height;i++)
{
a=0;b=0;temp=128;
for(j=0;j<width;j++)
{
if(A[(height-1-i)*width+j]>0)
{
a=a+temp;
img[i*w32bit+b]=a;
}
temp=temp/2;
if(temp==0)
{
temp=128;
a=0;b++;
}
}
}
}
void CArtDlg::invvector(int A[], int length)
{
int i;
for(i=0;i<length;i++)
{
A[i]=1-A[i];
}
}
void CArtDlg::OnOK()
{
CDialog::OnOK();
}
void CArtDlg::OnSaveimg()
{
CString filePath;
CFileDialog m_filesavedlg(FALSE, "bmp", "*.bmp", OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, "Bitmap Files(*.bmp)|*.bmp|All File(*.*)|*.*||", NULL);
if (recognize)
{
int nRespond = m_filesavedlg.DoModal();
if(nRespond == IDOK)
{
filePath = m_filesavedlg.GetPathName();
CFile file((LPCTSTR )filePath, CFile::modeCreate |
CFile::modeReadWrite | CFile::shareExclusive);
int dwSaveWidthBytes=((31+m_nHeight)/32)*4;
DWORD dwDibBitsSize = dwSaveWidthBytes * m_nHeight;
DWORD dwFileSize = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) + dwDibBitsSize;
if(m_nbitcount == 1) dwFileSize += (2 * sizeof(RGBQUAD));
DWORD dwOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER);
if(m_nbitcount == 1) dwOffBits += (2 * sizeof(RGBQUAD));
BITMAPFILEHEADER bmFileHeader;
bmFileHeader.bfType=0x4d42;
bmFileHeader.bfSize = dwFileSize;
bmFileHeader.bfReserved1 = 0;
bmFileHeader.bfReserved2 = 0;
bmFileHeader.bfOffBits = dwOffBits;
file.Write((LPSTR)&bmFileHeader, sizeof(BITMAPFILEHEADER));
int a=sizeof(BITMAPFILEHEADER);
int b= sizeof(BITMAPINFOHEADER);
dwOffBits =b;
if(m_nbitcount == 1) dwOffBits += (2 * sizeof(RGBQUAD));
BITMAPINFO* pbmInfo;
pbmInfo=m_pDib2->GetBmpInfo();
file.Write(pbmInfo,dwOffBits);
BYTE* pdata=m_pDib2->GetDibData();
file.Write(pdata,dwDibBitsSize);
file.Close();
}
}
Invalidate();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -