📄 zhangchandlg.cpp
字号:
// zhangchanDlg.cpp : implementation file
//
#include "stdafx.h"
#include "zhangchan.h"
#include "zhangchanDlg.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CAboutDlg dialog used for App About
class CAboutDlg : public CDialog
{
public:
CAboutDlg();
// Dialog Data
//{{AFX_DATA(CAboutDlg)
enum { IDD = IDD_ABOUTBOX };
//}}AFX_DATA
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CAboutDlg)
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support
//}}AFX_VIRTUAL
// Implementation
protected:
//{{AFX_MSG(CAboutDlg)
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};
CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
{
//{{AFX_DATA_INIT(CAboutDlg)
//}}AFX_DATA_INIT
}
void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CAboutDlg)
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
//{{AFX_MSG_MAP(CAboutDlg)
// No message handlers
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CZhangchanDlg dialog
CZhangchanDlg::CZhangchanDlg(CWnd* pParent /*=NULL*/)
: CDialog(CZhangchanDlg::IDD, pParent)
{
//{{AFX_DATA_INIT(CZhangchanDlg)
m_EditIn = _T("");
m_yuzhi = 400;
m_EditOut = _T("");
//}}AFX_DATA_INIT
// Note that LoadIcon does not require a subsequent DestroyIcon in Win32
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}
void CZhangchanDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CZhangchanDlg)
DDX_Text(pDX, IDC_EDIT1, m_EditIn);
DDX_Text(pDX, IDC_EDIT2, m_yuzhi);
DDX_Text(pDX, IDC_EDIT3, m_EditOut);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CZhangchanDlg, CDialog)
//{{AFX_MSG_MAP(CZhangchanDlg)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_BN_CLICKED(IDC_BUTTON1, OnInputData)
ON_BN_CLICKED(IDC_BUTTON2, OnOutputData)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CZhangchanDlg message handlers
BOOL CZhangchanDlg::OnInitDialog()
{
CDialog::OnInitDialog();
// Add "About..." menu item to system menu.
// IDM_ABOUTBOX must be in the system command range.
ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
ASSERT(IDM_ABOUTBOX < 0xF000);
CMenu* pSysMenu = GetSystemMenu(FALSE);
if (pSysMenu != NULL)
{
CString strAboutMenu;
strAboutMenu.LoadString(IDS_ABOUTBOX);
if (!strAboutMenu.IsEmpty())
{
pSysMenu->AppendMenu(MF_SEPARATOR);
pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
}
}
// 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
// TODO: Add extra initialization here
return TRUE; // return TRUE unless you set the focus to a control
}
void CZhangchanDlg::OnSysCommand(UINT nID, LPARAM lParam)
{
if ((nID & 0xFFF0) == IDM_ABOUTBOX)
{
CAboutDlg dlgAbout;
dlgAbout.DoModal();
}
else
{
CDialog::OnSysCommand(nID, lParam);
}
}
// 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 CZhangchanDlg::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();
}
}
// The system calls this to obtain the cursor to display while the user drags
// the minimized window.
HCURSOR CZhangchanDlg::OnQueryDragIcon()
{
return (HCURSOR) m_hIcon;
}
void CZhangchanDlg::OnInputData()
{
// TODO: Add your control notification handler code here
CFileDialog dlg(TRUE,"bmp",NULL,OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,"bmp File(*.bmp)|*.bmp||");
if(dlg.DoModal()==IDOK)
{
m_EditIn=dlg.GetPathName();
UpdateData(FALSE);
}
}
void CZhangchanDlg::OnOutputData()
{
// TODO: Add your control notification handler code here
CFileDialog dlg(FALSE,"bmp", NULL,OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,"bmp Files (*.bmp)|*.bmp||");
if(dlg.DoModal()==IDOK)
{
m_EditOut=dlg.GetPathName();
UpdateData(FALSE);
}
}
void CZhangchanDlg::OnOK()
{
// TODO: Add extra validation here
UpdateData(TRUE);
int m_width=0; //影像宽
int m_height=0; //影像高
int m_bytesPerLine=0; //原始影像每行字节数
CFile inputbmpfile; //原始影像文件
inputbmpfile.Open(m_EditIn,CFile::modeRead);
BITMAPFILEHEADER BmpFhead;
BITMAPINFOHEADER BmpIhead;
inputbmpfile.Read(&BmpFhead,sizeof(BITMAPFILEHEADER));
inputbmpfile.Read(&BmpIhead,sizeof(BITMAPINFOHEADER));
inputbmpfile.Seek(sizeof(RGBQUAD)*256,CFile::current);
m_width = BmpIhead.biWidth;
m_height = BmpIhead.biHeight;
m_bytesPerLine = (m_width*8+31)/32*4;
BYTE *m_inputimage = new BYTE [m_height*m_bytesPerLine]; //原始影像数据块
int *temp= new int[m_height*m_width];
int a[25]; //5*5模板
int b[49]; //7*7区域
inputbmpfile.ReadHuge(m_inputimage,m_height*m_bytesPerLine); //读入原始影像数据
DWORD bytesPerLine=(m_width*24+31)/32*4; //生成的彩色影像每行字节数
DWORD dwAllBytes=bytesPerLine*m_height; //彩色影像数据块的字节数
BYTE *m_outputimage = new BYTE [dwAllBytes]; //彩色影像数据块
BITMAPFILEHEADER BmpFhead2; //彩色影像文件头
BITMAPINFOHEADER BmpIhead2; //彩色影像文件头
BmpFhead2.bfType = ('M'<<8)|'B';
BmpFhead2.bfReserved1 = 0L;
BmpFhead2.bfReserved2 = 0L;
BmpFhead2.bfOffBits = sizeof(BITMAPINFOHEADER) + sizeof(BITMAPFILEHEADER);
BmpFhead2.bfSize = BmpFhead2.bfOffBits + dwAllBytes;
BmpIhead2.biSize = (DWORD) sizeof(BITMAPINFOHEADER);
BmpIhead2.biWidth = m_width;
BmpIhead2.biHeight = m_height;
BmpIhead2.biPlanes = 1;
BmpIhead2.biBitCount = 24;
BmpIhead2.biCompression = 0;
BmpIhead2.biSizeImage = 0;
BmpIhead2.biXPelsPerMeter = 0L;
BmpIhead2.biYPelsPerMeter = 0L;
BmpIhead2.biClrUsed = 0;
BmpIhead2.biClrImportant = 0;
CFile outputbmpfile;
outputbmpfile.Open(m_EditOut,CFile::modeCreate|CFile::modeWrite);
outputbmpfile.Write(&BmpFhead2,sizeof(BmpFhead2));
outputbmpfile.Write(&BmpIhead2,sizeof(BmpIhead2));
for(int i=0;i<m_height;i++)
{
for(int j=0;j<m_width;j++)
{
m_outputimage[i*bytesPerLine+3*j]=m_inputimage[i*m_bytesPerLine+j];
m_outputimage[i*bytesPerLine+3*j+1]=m_inputimage[i*m_bytesPerLine+j];
m_outputimage[i*bytesPerLine+3*j+2]=m_inputimage[i*m_bytesPerLine+j];
}
}
for( i=0;i<m_height;i++)
{
for(int j=0;j<m_width;j++)
{
if(i<2||i>m_height-3||j<2||j>m_width-3)
{
temp[i*m_width+j]=0;
}
else
{
a[0]=m_inputimage[i*m_bytesPerLine+j-2*m_bytesPerLine-2];
a[1]=m_inputimage[i*m_bytesPerLine+j-2*m_bytesPerLine-1];
a[2]=m_inputimage[i*m_bytesPerLine+j-2*m_bytesPerLine];
a[3]=m_inputimage[i*m_bytesPerLine+j-2*m_bytesPerLine+1];
a[4]=m_inputimage[i*m_bytesPerLine+j-2*m_bytesPerLine+2];
a[5]=m_inputimage[i*m_bytesPerLine+j-m_bytesPerLine-2];
a[6]=m_inputimage[i*m_bytesPerLine+j-m_bytesPerLine-1];
a[7]=m_inputimage[i*m_bytesPerLine+j-m_bytesPerLine];
a[8]=m_inputimage[i*m_bytesPerLine+j-m_bytesPerLine+1];
a[9]=m_inputimage[i*m_bytesPerLine+j-m_bytesPerLine+2];
a[10]=m_inputimage[i*m_bytesPerLine+j-2];
a[11]=m_inputimage[i*m_bytesPerLine+j-1];
a[12]=m_inputimage[i*m_bytesPerLine+j];
a[13]=m_inputimage[i*m_bytesPerLine+j+1];
a[14]=m_inputimage[i*m_bytesPerLine+j+2];
a[15]=m_inputimage[i*m_bytesPerLine+j+m_bytesPerLine-2];
a[16]=m_inputimage[i*m_bytesPerLine+j+m_bytesPerLine-1];
a[17]=m_inputimage[i*m_bytesPerLine+j+m_bytesPerLine];
a[18]=m_inputimage[i*m_bytesPerLine+j+m_bytesPerLine+1];
a[19]=m_inputimage[i*m_bytesPerLine+j+m_bytesPerLine+2];
a[20]=m_inputimage[i*m_bytesPerLine+j+2*m_bytesPerLine-2];
a[21]=m_inputimage[i*m_bytesPerLine+j+2*m_bytesPerLine-1];
a[22]=m_inputimage[i*m_bytesPerLine+j+2*m_bytesPerLine];
a[23]=m_inputimage[i*m_bytesPerLine+j+2*m_bytesPerLine+1];
a[24]=m_inputimage[i*m_bytesPerLine+j+2*m_bytesPerLine+2];
InterestValue(a,temp[i*m_width+j]);
}
}
}
int m_w1=m_width/7;
int m_w2=m_width%7;
int m_h1=m_height/7;
int m_h2=m_height%7;
int m_r=0;
int m_c=0;
for( i=0;i<m_h1;i++)
{
for(int j=0;j<m_w1;j++)
{
for(int k=0;k<7;k++)
{
b[7*k]=temp[i*m_width*7+j*7+k*m_width];
b[7*k+1]=temp[i*m_width*7+j*7+1+k*m_width];
b[7*k+2]=temp[i*m_width*7+j*7+2+k*m_width];
b[7*k+3]=temp[i*m_width*7+j*7+3+k*m_width];
b[7*k+4]=temp[i*m_width*7+j*7+4+k*m_width];
b[7*k+5]=temp[i*m_width*7+j*7+5+k*m_width];
b[7*k+6]=temp[i*m_width*7+j*7+6+k*m_width];
}
int m_tempnum=0;
int m_num=0;
getmax(b,m_tempnum,m_num);
if(m_tempnum>m_yuzhi) //特征点,划红叉
{
m_r=m_num/7;
m_c=m_num%7;
m_r=7*i+m_r;
m_c=7*j+m_c;
m_outputimage[(m_r-1)*bytesPerLine+3*m_c]=0;
m_outputimage[(m_r-1)*bytesPerLine+3*m_c+1]=0;
m_outputimage[(m_r-1)*bytesPerLine+3*m_c+2]=255;
m_outputimage[(m_r-2)*bytesPerLine+3*m_c]=0;
m_outputimage[(m_r-2)*bytesPerLine+3*m_c+1]=0;
m_outputimage[(m_r-2)*bytesPerLine+3*m_c+2]=255;
m_outputimage[(m_r+1)*bytesPerLine+3*m_c]=0;
m_outputimage[(m_r+1)*bytesPerLine+3*m_c+1]=0;
m_outputimage[(m_r+1)*bytesPerLine+3*m_c+2]=255;
m_outputimage[(m_r+2)*bytesPerLine+3*m_c]=0;
m_outputimage[(m_r+2)*bytesPerLine+3*m_c+1]=0;
m_outputimage[(m_r+2)*bytesPerLine+3*m_c+2]=255;
m_outputimage[m_r*bytesPerLine+3*(m_c-1)]=0;
m_outputimage[m_r*bytesPerLine+3*(m_c-1)+1]=0;
m_outputimage[m_r*bytesPerLine+3*(m_c-1)+2]=255;
m_outputimage[m_r*bytesPerLine+3*m_c]=0;
m_outputimage[m_r*bytesPerLine+3*m_c+1]=0;
m_outputimage[m_r*bytesPerLine+3*m_c+2]=255;
m_outputimage[m_r*bytesPerLine+3*(m_c-2)]=20;
m_outputimage[m_r*bytesPerLine+3*(m_c-2)+1]=0;
m_outputimage[m_r*bytesPerLine+3*(m_c-2)+2]=255;
m_outputimage[m_r*bytesPerLine+3*(m_c+1)]=0;
m_outputimage[m_r*bytesPerLine+3*(m_c+1)+1]=0;
m_outputimage[m_r*bytesPerLine+3*(m_c+1)+2]=255;
m_outputimage[m_r*bytesPerLine+3*(m_c+2)]=0;
m_outputimage[m_r*bytesPerLine+3*(m_c+2)+1]=0;
m_outputimage[m_r*bytesPerLine+3*(m_c+2)+2]=255;
}
}
}
outputbmpfile.WriteHuge(m_outputimage,dwAllBytes);
outputbmpfile.Close();
inputbmpfile.Close();
delete [] m_inputimage;
delete [] m_outputimage;
CDialog::OnOK();
}
void CZhangchanDlg::InterestValue( int *a, int &v) //得到5*5区域模板的兴趣值
{
int v1,v2,v3,v4;
v1=v2=v3=v4=0;
v1=(a[11]-a[10])*(a[11]-a[10])+(a[12]-a[11])*(a[12]-a[11])+(a[13]-a[12])*(a[13]-a[12])+(a[14]-a[13])*(a[14]-a[13]);
v2=(a[6]-a[0])*(a[6]-a[0])+(a[12]-a[6])*(a[12]-a[6])+(a[18]-a[12])*(a[18]-a[12])+(a[24]-a[18])*(a[24]-a[18]);
v3=(a[7]-a[2])*(a[7]-a[2])+(a[12]-a[7])*(a[12]-a[7])+(a[17]-a[12])*(a[17]-a[12])+(a[22]-a[17])*(a[22]-a[17]);
v4=(a[8]-a[4])*(a[8]-a[4])+(a[12]-a[8])*(a[12]-a[8])+(a[16]-a[12])*(a[16]-a[12])+(a[20]-a[16])*(a[20]-a[16]);
v=v1;
if(v>v2)
v=v2;
if(v>v3)
v=v3;
if(v>v4)
v=v4;
}
void CZhangchanDlg::getmax(int *m_a, int &m_max,int &m_num) //得到7*7区域的候选特征值
{
m_max=m_a[0];
for(int i=1;i<49;i++)
{
if(m_max<m_a[i])
{
m_max=m_a[i];
m_num=i;
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -