📄 对话框显示iplimagedlg.cpp
字号:
// 对话框显示iplImageDlg.cpp : implementation file
//
#include "stdafx.h"
#include "对话框显示iplImage.h"
#include "对话框显示iplImageDlg.h"
#include "ADDERDLG.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CAboutDlg dialog used for App About
CString filename;
CvvImage m_CvvImage;
CvvImage m_CvvImage1;
IplImage* m_IplImage;
CvvImage img;
IplImage* imgtemp=0;
char* name = 0;
IplImage* imgtemp1=0;
IplImage* imgnull=0;
static CvHidHaarClassifierCascade* hid_cascade = 0;
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
// boolbtn = false;
}
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()
/////////////////////////////////////////////////////////////////////////////
// CIplImageDlg dialog
CIplImageDlg::CIplImageDlg(CWnd* pParent /*=NULL*/)
: CDialog(CIplImageDlg::IDD, pParent)
{
//{{AFX_DATA_INIT(CIplImageDlg)
// NOTE: the ClassWizard will add member initialization here
//}}AFX_DATA_INIT
// Note that LoadIcon does not require a subsequent DestroyIcon in Win32
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
boolbtn = false;
}
void CIplImageDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CIplImageDlg)
// NOTE: the ClassWizard will add DDX and DDV calls here
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CIplImageDlg, CDialog)
//{{AFX_MSG_MAP(CIplImageDlg)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_BN_CLICKED(IDGRAY, OnGray)
ON_BN_CLICKED(IDC_CANNY, OnCanny)
ON_BN_CLICKED(IDC_LAPLACE, OnLaplace)
ON_BN_CLICKED(IDC_NOISE, OnNoise)
ON_BN_CLICKED(IDC_OPEN, OnOpenImage)
ON_BN_CLICKED(IDC_DETECT, OnDetect)
ON_BN_CLICKED(IDC_HOUGH, OnHough)
ON_BN_CLICKED(IDC_TRANSE, OnTranse)
ON_BN_CLICKED(IDC_SMOOTH, OnSmooth)
ON_BN_CLICKED(IDC_SAVE, OnSave)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CIplImageDlg message handlers
BOOL CIplImageDlg::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 CIplImageDlg::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 CIplImageDlg::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();
CClientDC dc(this);
if(name)
{
m_IplImage=cvLoadImage(name);
m_CvvImage.CopyOf(m_IplImage,1);
CRect cvRect(0,0, 300, 300 );
m_CvvImage.DrawToHDC(dc.GetSafeHdc(),cvRect);
if(boolbtn)
{
CRect rect(310,0,610, 300 );
m_CvvImage1.DrawToHDC(dc.GetSafeHdc(),rect);
}
}
}
}
// The system calls this to obtain the cursor to display while the user drags
// the minimized window.
HCURSOR CIplImageDlg::OnQueryDragIcon()
{
return (HCURSOR) m_hIcon;
}
void CIplImageDlg::OnGray() //BGR-GRAY(8U1C)
{
// TODO: Add your control notification handler code here
imgtemp=cvCreateImage(cvGetSize(m_IplImage),IPL_DEPTH_8U,1);
cvCvtColor(m_IplImage, imgtemp, CV_BGR2GRAY); //rgb转换为灰度
m_CvvImage1.CopyOf(imgtemp,1);
boolbtn = true;
Invalidate();
}
void CIplImageDlg::OnCanny() //BGR-GRAY(8U1C)-cvCanny
{
// TODO: Add your control notification handler code here
IplImage* dst=cvCreateImage(cvGetSize(m_IplImage),IPL_DEPTH_8U,1);
imgtemp=cvCreateImage(cvGetSize(m_IplImage),IPL_DEPTH_8U,1);
cvCvtColor(m_IplImage, imgtemp, CV_BGR2GRAY); //rgb转换为灰度
cvCanny(imgtemp,dst, 100, 200, 3);
IplImage* rgbImage = cvCreateImage(cvGetSize(m_IplImage),IPL_DEPTH_8U,3);
cvCvtColor(dst,rgbImage,CV_GRAY2BGR);
// m_CvvImage1.CopyOf(dst,1);
m_CvvImage1.CopyOf(rgbImage,1);
boolbtn = true;
Invalidate();
}
void CIplImageDlg::Laplace(int m)
{
imgtemp=cvCreateImage(cvGetSize(m_IplImage),IPL_DEPTH_8U,1);
IplImage* dst=cvCreateImage(cvGetSize(m_IplImage),IPL_DEPTH_16S,1);
IplImage* temp2=cvCreateImage(cvGetSize(m_IplImage),IPL_DEPTH_8U,1);
cvCvtColor(m_IplImage, imgtemp, CV_BGR2GRAY); //rgb转换为灰度
cvLaplace(imgtemp,dst,m);
cvConvertScale( dst, temp2);
TRACE1("拉普拉斯的输出图像深度为 %d\n",temp2->depth);
m_CvvImage1.CopyOf(temp2,1);
// delete dlgPara;
boolbtn = true;
Invalidate();
}
void CIplImageDlg::OnLaplace() //BGR-GRAY(16S1C)-cvLaplace()
{
// TODO: Add your control notification handler code here
// DLGLAPLACE *dlgPara = new DLGLAPLACE(this);
/*
if (dlgPara.DoModal() != IDOK)
{
return;
}
*/
/*
if (dlgPara == NULL)
{
dlgPara = new DLGLAPLACE(this);
dlgPara->Create(DLGLAPLACE::IDD) ;
dlgPara->ShowWindow(SW_SHOW);
}
else
dlgPara->SetActiveWindow();
*/
DLGLAPLACE* dlgPara = new DLGLAPLACE(this);
dlgPara->Create(DLGLAPLACE::IDD) ;
dlgPara->ShowWindow(SW_SHOW);
}
void CIplImageDlg::OnNoise() //BGR-GRAY-BGR(8U3C)-加噪声
{
// TODO: Add your control notification handler code here
IplImage* dst=cvCreateImage(cvGetSize(m_IplImage),IPL_DEPTH_8U,3);
imgtemp=cvCreateImage(cvGetSize(m_IplImage),IPL_DEPTH_8U,1);
cvCvtColor(m_IplImage, imgtemp, CV_BGR2GRAY); //rgb转换为灰度
cvCvtColor(imgtemp,dst,CV_GRAY2BGR);
DWORD i,j;
srand((unsigned)time(NULL));//生成伪随机种子
for (j = 0;j < dst->height;j++)
{
for(i = 0;i < dst->width ;i++)
{
if(rand()>30000)
{
//图像中当前点置为黑
((uchar*)(dst->imageData + dst->widthStep*j))[i*3] = 0;
((uchar*)(dst->imageData + dst->widthStep*j))[i*3+1] = 0;
((uchar*)(dst->imageData + dst->widthStep*j))[i*3+2] = 0;
}
}
}
ShowIplImage(dst);
}
void CIplImageDlg::OnOpenImage()
{
// TODO: Add your control notification handler code here
CFileDialog dlg(TRUE,"bmp","*.bmp");
if(dlg.DoModal() == IDOK)
{
boolbtn = false;
Invalidate();
filename = dlg.GetPathName();
name = filename.GetBuffer(filename.GetLength());
Invalidate();
// OnPaint();
// UpdateData(false); 错误
}
}
void CIplImageDlg::OnDetect()
{
// TODO: Add your control notification handler code here
CvHaarClassifierCascade* cascade;
CvMemStorage* storage = cvCreateMemStorage(0);
CvSeq* faces;
// int optlen = strlen("--cascade=");
int i;
//load classifier cascade from XML file
cascade = (CvHaarClassifierCascade*)cvLoad("D:\\OpenCV\\data\\haarcascades\\haarcascade_frontalface_default.xml");
faces = cvHaarDetectObjects(
m_IplImage,
cascade,
storage,
1.2, //scale the cascade by 20% after each pass
2, //groups of 3 (2+1) or more neighbor face rectangles are joined into
//a single "face", smaller groups are rejected
CV_HAAR_DO_CANNY_PRUNING,
//use Canny edge detector to reduce number of false alarms
cvSize(0,0) //start from the minimum face size allowed by the particular classifier
);
for(i=0;i<(faces?faces->total:0);i++)
{
CvRect* r = (CvRect*)cvGetSeqElem(faces,i);
CvPoint pt1 = {r->x, r->y};
CvPoint pt2 = {r->x + r->width, r->y + r->height};
cvRectangle(m_IplImage,pt1,pt2,CV_RGB(255,0,0),3,8,0);
}
cvNamedWindow("faces",1);
cvShowImage("faces",m_IplImage);
cvWaitKey();
cvReleaseImage(&m_IplImage);
cvReleaseHaarClassifierCascade(&cascade);
cvReleaseMemStorage(&storage);
/*
m_CvvImage1.CopyOf(image,1);
boolbtn = true;
Invalidate();
*/
}
void CIplImageDlg::OnHough()
{
// TODO: Add your control notification handler code here
IplImage* dst = cvCreateImage( cvGetSize(m_IplImage), 8, 1 );
IplImage* color_dst = cvCreateImage( cvGetSize(m_IplImage), 8, 3 );
CvMemStorage* storage = cvCreateMemStorage(0);
CvSeq* lines = 0;
int i;
imgtemp=cvCreateImage(cvGetSize(m_IplImage),IPL_DEPTH_8U,1);
cvCvtColor(m_IplImage, imgtemp, CV_BGR2GRAY); //rgb转换为灰度
cvCanny( imgtemp, dst, 100, 200, 3 );
cvCvtColor( dst, color_dst, CV_GRAY2BGR );
lines = cvHoughLines2( dst, storage, CV_HOUGH_STANDARD, 1, CV_PI/180, 150, 0, 0 );
// cvLine( color_dst, pt1, pt2, CV_RGB(0,0,255), 3, 8 );
for( i = 0; i < lines->total; i++ )
{
float* line = (float*)cvGetSeqElem(lines,i);
float rho = line[0];
float theta = line[1];
CvPoint pt1, pt2;
double a = cos(theta), b = sin(theta);
if( fabs(a) < 0.001 )
{
pt1.x = pt2.x = cvRound(rho);
pt1.y = 0;
pt2.y = color_dst->height;
}
else if( fabs(b) < 0.001 )
{
pt1.y = pt2.y = cvRound(rho);
pt1.x = 0;
pt2.x = color_dst->width;
}
else
{
pt1.x = 0;
pt1.y = cvRound(rho/b);
pt2.x = cvRound(rho/a);
pt2.y = 0;
}
cvLine( color_dst, pt1, pt2, CV_RGB(255,0,0), 3, 8 );
}
/*
lines = cvHoughLines2( dst, storage, CV_HOUGH_PROBABILISTIC, 1, CV_PI/180, 80, 30, 10 );
for( i = 0; i < lines->total; i++ )
{
CvPoint* line = (CvPoint*)cvGetSeqElem(lines,i);
cvLine( color_dst, line[0], line[1], CV_RGB(0,0,255), 3, 8 );
}
*/
/*
m_CvvImage1.CopyOf(color_dst,1);
boolbtn = true;
Invalidate();*/
ShowIplImage(color_dst);
}
void CIplImageDlg::OnTranse()
{
// TODO: Add your control notification handler code here
IplImage* dst = cvCreateImage( cvGetSize(m_IplImage), 8, 1 );
IplImage* dsttemp = cvCreateImage( cvGetSize(m_IplImage), IPL_DEPTH_32F, 1 );
IplImage* dsttemp1 = cvCreateImage( cvGetSize(m_IplImage), IPL_DEPTH_32F, 1 );
IplImage* dsttemp2 = cvCreateImage( cvGetSize(m_IplImage), IPL_DEPTH_32F, 1 );
cvCvtColor(m_IplImage, dst, CV_BGR2GRAY); //rgb转换为灰度
double width = dst->width;
double heigh = dst->height;
cvConvert(dst,dsttemp);
/*
for(int i=0;i<width;i++)
for(int j=0;j<heigh;j++)
((uchar*)(dsttemp->imageData + dsttemp->widthStep*j))[i*3]=
((uchar*)(dsttemp->imageData + dsttemp->widthStep*j))[i*3]*pow((-1),(i+j));
// ((uchar*)(dsttemp->imageData + dsttemp->widthStep*j))[i*3]*3;
*/
cvDFT(dsttemp,dsttemp1,CV_DXT_FORWARD|CV_DXT_SCALE);
/*
for(int i=0;i<width;i++)
for(int j=0;j<heigh;j++)
((uchar*)(dsttemp1->imageData + dsttemp1->widthStep*j))[i*3]=
log10(1+(double)((uchar*)(dsttemp1->imageData + dsttemp1->widthStep*j))[i*3]);
*/
// cvDFT(dsttemp1,dsttemp2,CV_DXT_INVERSE);
ShowIplImage(dsttemp1);
cvNamedWindow("源图",1);
cvShowImage("源图",m_IplImage);
cvNamedWindow("变换",1);
cvShowImage("变换",dsttemp1);
cvWaitKey();
cvReleaseImage(&m_IplImage);
cvReleaseImage(&dsttemp1);
}
void CIplImageDlg::ShowIplImage(IplImage *out)
{
m_CvvImage1.CopyOf(out,1);
boolbtn = true;
Invalidate();
}
void CIplImageDlg::OnSmooth()
{
// TODO: Add your control notification handler code here
IplImage* dst = cvCreateImage( cvGetSize(m_IplImage), 8, 3 );
IplImage* dsttemp = cvCreateImage( cvGetSize(m_IplImage), IPL_DEPTH_32F, 1 );
IplImage* dsttemp1 = cvCreateImage( cvGetSize(m_IplImage), IPL_DEPTH_32F, 1 );
IplImage* dsttemp2 = cvCreateImage( cvGetSize(m_IplImage), IPL_DEPTH_32F, 1 );
// cvCvtColor(m_IplImage, m_IplImage, CV_BGR2GRAY); //rgb转换为灰度
double width = m_IplImage->width;
double heigh = m_IplImage->height;
for(int i=0;i<width;i++)
{
for(int j=0;j<heigh;j++)
{
if(((uchar*)(m_IplImage->imageData + m_IplImage->widthStep*i))[j]!=0)
TRACE1("%d ",((uchar*)(m_IplImage->imageData + m_IplImage->widthStep*i))[j]);
}
}
// cvSmooth(m_IplImage,dst);
// ShowIplImage(dst);
}
void CIplImageDlg::OnSave()
{
// TODO: Add your control notification handler code here
cvSaveImage("C:\\save.bmp",m_CvvImage1.GetImage());
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -