我的第一个openCV程序,是改别人的成果,呵呵。 实现了简单的图像处理功能,更多的程序,会随着我的学习逐渐添加。
// cvmedianfilterDlg.cpp : implementation file // #include "stdafx.h" #include "cvmedianfilter.h" #include "cvmedianfilterDlg.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif ///////////////////////////////////////////////////////////////////////////// // CAboutDlg dialog used for App About #include "cvaux.h" #include "cv.h" #include "highgui.h" //#include "ijl.h" ???? #include "cvcam.h" #include "math.h" //#include "ipl.h" #include <stdio.h> #include <stdlib.h> #include <string.h> #include <assert.h> #include <float.h> #include <limits.h> #include <time.h> #include <ctype.h> #include <direct.h> //#include "dibapi.h" ???? #pragma comment(lib,"cvaux.lib") #pragma comment(lib,"cvcam.lib") //#pragma comment(lib,"ijl15.lib") ???? #pragma comment(lib,"cv.lib") #pragma comment(lib, "highgui.lib") #define ORIG_WIN_SIZE 24 static CvMemStorage* storage1 = 0; static CvHidHaarClassifierCascade* hid_cascade = 0; //on_mouse( int event, int x, int y, int flags ); IplImage* detect_and_draw( IplImage* image ); char filename[]="D:\\Sample256-1.bmp"; 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() ///////////////////////////////////////////////////////////////////////////// // CCvmedianfilterDlg dialog CCvmedianfilterDlg::CCvmedianfilterDlg(CWnd* pParent /*=NULL*/) : CDialog(CCvmedianfilterDlg::IDD, pParent) { //m_num = 0; //{{AFX_DATA_INIT(CCvmedianfilterDlg) // 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); } void CCvmedianfilterDlg::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); //DDX_Text(pDX, IDC_NUM, m_num); //{{AFX_DATA_MAP(CCvmedianfilterDlg) // NOTE: the ClassWizard will add DDX and DDV calls here //}}AFX_DATA_MAP } BEGIN_MESSAGE_MAP(CCvmedianfilterDlg, CDialog) //{{AFX_MSG_MAP(CCvmedianfilterDlg) ON_WM_SYSCOMMAND() ON_WM_PAINT() ON_WM_QUERYDRAGICON() ON_BN_CLICKED(IDC_gray, Ongray) ON_BN_CLICKED(IDC_medfilter, Onmedfilter) ON_BN_CLICKED(IDC_singreen, Onsingreen) ON_BN_CLICKED(IDC_noise, Onnoise) ON_BN_CLICKED(IDC_saltnoise, Onsaltnoise) ON_BN_CLICKED(IDC_BUTTON1, OnCanny) ON_BN_CLICKED(IDC_BUTTON2, OnThreshold) ON_BN_CLICKED(IDC_Laplace, OnLaplace) ON_BN_CLICKED(IDC_Log, OnLog) ON_BN_CLICKED(IDC_Tough, OnTough) //}}AFX_MSG_MAP END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // CCvmedianfilterDlg message handlers BOOL CCvmedianfilterDlg::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 CCvmedianfilterDlg::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 CCvmedianfilterDlg::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 CCvmedianfilterDlg::OnQueryDragIcon() { return (HCURSOR) m_hIcon; } void CCvmedianfilterDlg::Ongray() { // TODO: Add your control notification handler code here UpdateData(true); char filename[]="D:\\Sample256-1.bmp"; //char filename[]="F:\\switty\\opencv吕斌\\newimage008.dib";//"F:\\xhl\\搞笑图片\\ert.jpg"; char *wndname; IplImage *gray = 0,*gray2=0; gray=cvLoadImage(filename,1); // gray2=cvLoadImage(filename,1); gray2=cvCreateImage(cvSize(gray->width,gray->height),IPL_DEPTH_8U,1); wndname="GRAY2BGR"; cvNamedWindow(wndname,1); cvCvtColor(gray, gray2, CV_BGR2GRAY); //rgb转换为灰度 cvShowImage(wndname,gray2); cvWaitKey(0); cvReleaseImage(&gray); cvReleaseImage(&gray2); cvDestroyWindow( wndname ); } void CCvmedianfilterDlg::Onmedfilter() { // TODO: Add your control notification handler code here char filename2[]="D:\\Sample256-1.bmp"; char filename1[]="D:\\Sample256-1.bmp"; char filename[]="D:\\Sample256-1.bmp"; char *wndname; IplImage *gray,*gray2,*dst,*dst3; gray=cvLoadImage(filename,1); gray2=cvCreateImage(cvSize(gray->width,gray->height),IPL_DEPTH_8U,1); dst=cvCreateImage(cvSize(gray->width,gray->height),IPL_DEPTH_8U,4); dst3=cvCreateImage(cvSize(gray->width,gray->height),IPL_DEPTH_8U,3); // wndname="以位图图像格式保存"; // cvSaveImage(filename1,dst3);//cvSaveImage(filename1,dst3); // cvNamedWindow(wndname,1); // gray1=cvLoadImage(filename1,1); // cvShowImage(wndname,gray1); if(num==0) { wndname="原图"; cvNamedWindow(wndname,1); cvShowImage(wndname,gray); wndname="灰度图像"; cvNamedWindow(wndname,1); cvCvtColor(gray, gray2, CV_BGR2GRAY); cvCvtColor(gray2,dst3,8); cvShowImage(wndname,dst3); cvWaitKey(0); // cvReleaseImage(&gray); // cvReleaseImage(&gray2); // cvReleaseImage(&dst3); // cvReleaseImage(&dst); // cvDestroyWindow(wndname); num=1; } else { CDC* pDC=GetDC(); CDC dcMem; CBitmap myBitmap; myBitmap.CreateCompatibleBitmap(pDC,gray->height,gray->width); dcMem.CreateCompatibleDC(pDC); dcMem.SelectObject(&myBitmap); //char *rvalue=0,*bvalue=0,*gvalue=0; DWORD iFilterH=3 ; // 滤波器的高度 DWORD iFilterW=3 ; // - 滤波器的宽度 DWORD iFilterMX=1 ; //- 滤波器的中心元素X坐标 DWORD iFilterMY=1 ; //- 滤波器的中心元素Y坐标 DWORD iFilterLen=iFilterH * iFilterW;//窗口大小 DWORD i,j,k,l,m,n; DWORD temp,temp1; BYTE r,r1,g,g1,b,b1,r2,g2,b2; BYTE bTemp; BYTE rvalue[9],bvalue[9],gvalue[9]; for(i=iFilterMY;i<(gray->height+iFilterMY+1);i++) for(j=iFilterMX;j<(gray->width-iFilterW+iFilterMX+1);j++) { temp=i*(gray->width)*3+j*3; r=(BYTE)(gray->imageData[temp]); g=(BYTE)(gray->imageData[temp+1]); b=(BYTE)(gray->imageData[temp+2]); for (k = 0; k < iFilterH; k++) for (l = 0; l < iFilterW; l++) { temp1=(i-iFilterMY+k)*(gray->width)*3+(j-iFilterMX+l)*3; r1=(BYTE)(gray->imageData[temp1]); g1=(BYTE)(gray->imageData[temp1+1]); b1=(BYTE)(gray->imageData[temp1+2]); rvalue[k * iFilterW + l]=r1; bvalue[k * iFilterW + l]=b1; gvalue[k * iFilterW + l]=g1; } for (m = 0; m < iFilterLen - 1; m ++) for (n = 0; n < iFilterLen - m - 1; n ++) if (rvalue[n] > rvalue[n + 1]) { bTemp = rvalue[n]; rvalue[n] = rvalue[n + 1]; rvalue[n + 1] = bTemp; } r2=rvalue[(iFilterLen + 1) / 2]; for (m = 0; m < iFilterLen - 1; m ++) for (n = 0; n < iFilterLen - m - 1; n ++) if (bvalue[n] > bvalue[n + 1]) { bTemp = bvalue[n]; bvalue[n] = bvalue[n + 1]; bvalue[n + 1] = bTemp; } b2=bvalue[(iFilterLen + 1) / 2]; for (m = 0; m < iFilterLen - 1; m ++) for (n = 0; n < iFilterLen - m - 1; n ++) if (gvalue[n] > gvalue[n + 1]) { bTemp = gvalue[n]; gvalue[n] = gvalue[n + 1]; gvalue[n + 1] = bTemp; } g2=gvalue[(iFilterLen + 1) / 2]; //b2=(BYTE)GetMedianNum(bvalue, iFilterH * iFilterW); //g2=(BYTE)GetMedianNum(gvalue, iFilterH * iFilterW); //r2=(BYTE)GetMedianNum(rvalue, iFilterH * iFilterW);*/ dcMem.SetPixel(j,i,RGB(b2,g2,r2)); } pDC->StretchBlt(0,0,gray->width,gray->height,&dcMem,0,0,gray->width,gray->height,SRCCOPY); ReleaseDC(pDC); ReleaseDC(&dcMem); // cvReleaseImage(&gray1); //cvDestroyWindow( wndname ); } cvReleaseImage(&gray); cvReleaseImage(&gray2); cvReleaseImage(&dst3); cvReleaseImage(&dst); cvDestroyWindow( wndname ); } void CCvmedianfilterDlg::OnOK() { // TODO: Add extra validation here CDialog::OnOK(); }
void CCvmedianfilterDlg::Onsingreen() //打开源图像 { // TODO: Add your control notification handler code here char filename[]="D:\\Sample256-1.bmp"; char *wndname; wndname="原图"; IplImage *image=0; image=cvLoadImage(filename,1); cvNamedWindow(wndname,1); cvShowImage(wndname,image); cvWaitKey(0); cvReleaseImage(&image); } void CCvmedianfilterDlg::Onnoise() { // TODO: Add your control notification handler code here char filename[]="D:\\Sample256-1.bmp"; char *wndname; wndname="噪声图像"; IplImage *gray; gray=cvLoadImage(filename,1); cvNamedWindow(wndname,1); cvShowImage(wndname,gray); } /* void CCvmedianfilterDlg::Onsaltnoise() { // TODO: Add your control notification handler code here char filename[]="D:\\Sample256-1.bmp"; char *wndname; IplImage *gray = 0,*gray2=0,*gray3=0,*dst=0,*dst3=0; gray=cvLoadImage(filename,1); gray2=cvCreateImage(cvSize(gray->width,gray->height),IPL_DEPTH_8U,1); gray3=cvCreateImage(cvSize(gray->width,gray->height),8,3); dst3=cvCreateImage(cvSize(gray->width,gray->height),IPL_DEPTH_8U,3); dst=cvCreateImage(cvSize(gray->width,gray->height),IPL_DEPTH_8U,4); wndname="GRAY2BGR"; cvCvtColor(gray, gray2,CV_BGR2GRAY); cvCvtColor(gray2,dst3,8); gray3=cvCloneImage(dst3); //以下加入椒盐噪声 CDC* pDC=GetDC(); CDC dcMem; CBitmap myBitmap; myBitmap.CreateCompatibleBitmap(pDC,gray3->height,gray3->width); dcMem.CreateCompatibleDC(pDC); dcMem.SelectObject(&myBitmap);
DWORD i,j;//,k,l,m,n; DWORD temp;//,temp1; BYTE r,g,b; srand((unsigned)time(NULL));//生成伪随机种子 for (j = 0;j < gray3->height;j++) { for(i = 0;i < gray3->width ;i++) { // 指向源图像第j行,第i个象素的指针 temp =j* (gray3->width)*3+ i*3; r=(BYTE)(dst3->imageData[temp]); g=(BYTE)(dst3->imageData[temp+1]); b=(BYTE)(dst3->imageData[temp+2]); if(rand()>30000) { //图像中当前点置为黑 r=b=g=0; dcMem.SetPixel(i,j,RGB(b,g,r)); } else { dcMem.SetPixel(i,j,RGB(b,g,r)); } } } pDC->StretchBlt( 0, 0, gray3->width, gray3->height, &dcMem, 0, 0, gray3->width*3, gray3->height*3, SRCCOPY); // wndname="noisegray3"; // cvNamedWindow(wndname,1); // cvShowImage(wndname,gray3); //cvWaitKey(0); // pDC->ReleaseDC(pDC); cvReleaseImage(&gray3); } */ void CCvmedianfilterDlg::Onsaltnoise() { // TODO: Add your control notification handler code here char filename[]="D:\\Sample256-1.bmp"; char *wndname; IplImage *gray = 0,*gray2=0,*gray3=0; gray=cvLoadImage(filename,1); gray2=cvCreateImage(cvSize(gray->width,gray->height),IPL_DEPTH_8U,1); gray3=cvCreateImage(cvSize(gray->width,gray->height),8,3); //cvCopy(gray,gray3); //在彩色图像加噪声 // cvCvtColor(gray,gray3,CV_BGR2GRAY); //在灰度图像加噪声,为什么这么写不行 cvCvtColor(gray, gray2,CV_BGR2GRAY); //在灰度图像加噪声 cvCvtColor(gray2,gray3,CV_GRAY2BGR); DWORD i,j; srand((unsigned)time(NULL));//生成伪随机种子 for (j = 0;j < gray3->height;j++) { for(i = 0;i < gray3->width ;i++) { if(rand()>30000) { //图像中当前点置为黑 ((uchar*)(gray3->imageData + gray3->widthStep*j))[i*3] = 0; ((uchar*)(gray3->imageData + gray3->widthStep*j))[i*3+1] = 0; ((uchar*)(gray3->imageData + gray3->widthStep*j))[i*3+2] = 0; } } } wndname="noisegray3"; cvNamedWindow(wndname,1); cvShowImage(wndname,gray3); cvWaitKey(0); cvReleaseImage(&gray3); cvReleaseImage(&gray2); cvReleaseImage(&gray); } void CCvmedianfilterDlg::OnCanny() //边缘检测 { // TODO: Add your control notification handler code here char filename[]="D:\\Sample256-1.bmp"; IplImage *ww=0,*ww1=0,*dst=0; ww=cvLoadImage(filename,1); ww1=cvCreateImage(cvSize(ww->width,ww->height),IPL_DEPTH_8U,1); dst=cvCreateImage(cvSize(ww->width,ww->height),IPL_DEPTH_8U,1); cvCvtColor(ww, ww1, CV_BGR2GRAY); cvCanny(ww1,dst, 100, 200, 3 ); //cvCanny的源图像必须是灰度图像 // cvCanny(ww1,dst, 100, 200, 5 ); // cvCanny(ww1,dst, 100, 200, 7 ); cvNamedWindow("canny算子(核=3)",1); cvShowImage("canny算子(核=3)",dst);
cvReleaseImage(&ww); cvReleaseImage(&dst); cvReleaseImage(&ww); } void CCvmedianfilterDlg::OnThreshold() { // TODO: Add your control notification handler code here IplImage *log=0,*pyr=0,*log1=0,*log2=0; IplImage *laplace=0,*laplace1=0,*dst=0, *thr=0; log=cvLoadImage(filename,1); pyr=cvCreateImage(cvSize(log->width/2,log->height/2),8,3); laplace=cvCreateImage(cvSize(log->width,log->height),8,3); cvPyrDown(log,pyr,CV_GAUSSIAN_5x5 ); cvPyrUp(pyr,laplace,CV_GAUSSIAN_5x5 ); laplace1=cvCreateImage(cvSize(log->width,log->height),IPL_DEPTH_8U,1); dst=cvCreateImage(cvSize(log->width,log->height),IPL_DEPTH_16S,1); cvCvtColor(laplace,laplace1, CV_BGR2GRAY); cvLaplace(laplace1,dst,3); thr=cvCreateImage(cvSize(log->width,log->height),IPL_DEPTH_8U,1);//wty cvThreshold(dst,thr,25,255,CV_THRESH_BINARY);//wty二值化阈值增强
cvMean( thr, laplace1);
cvNamedWindow("LOG-二值化",1); cvShowImage("LOG-二值化",thr); cvReleaseImage(&thr);//wty
cvReleaseImage(&log1); cvReleaseImage(&log2); cvReleaseImage(&log); cvReleaseImage(&pyr); cvReleaseImage(&laplace1); cvReleaseImage(&dst); cvReleaseImage(&laplace); } void CCvmedianfilterDlg::OnLaplace() { // TODO: Add your control notification handler code here IplImage *laplace=0,*laplace1=0,*dstlaplace=0; laplace=cvLoadImage(filename,1); laplace1=cvCreateImage(cvSize(laplace->width,laplace->height),IPL_DEPTH_8U,1); dstlaplace=cvCreateImage(cvSize(laplace->width,laplace->height),IPL_DEPTH_16S,1); cvCvtColor(laplace,laplace1, CV_BGR2GRAY); cvLaplace(laplace1,dstlaplace,3); //cvLaplace(laplace1,dstlaplace,5); //或 // cvLaplace(laplace1,dstlaplace,7); //或 cvNamedWindow("Laplace",1); cvShowImage("Laplace",dstlaplace); cvReleaseImage(&laplace1); cvReleaseImage(&dstlaplace); cvReleaseImage(&laplace); } void CCvmedianfilterDlg::OnLog() { // TODO: Add your control notification handler code here IplImage *log=0,*pyr=0,*log1=0,*log2=0; IplImage *laplace=0,*laplace1=0,*dst=0; log=cvLoadImage(filename,1); pyr=cvCreateImage(cvSize(log->width/2,log->height/2),8,3); laplace=cvCreateImage(cvSize(log->width,log->height),8,3); cvPyrDown(log,pyr,CV_GAUSSIAN_5x5 ); cvPyrUp(pyr,laplace,CV_GAUSSIAN_5x5 );// 高斯 laplace1=cvCreateImage(cvSize(log->width,log->height),IPL_DEPTH_8U,1);//laplace dst=cvCreateImage(cvSize(log->width,log->height),IPL_DEPTH_16S,1); cvCvtColor(laplace,laplace1, CV_BGR2GRAY); cvLaplace(laplace1,dst,3); //cvLaplace(laplace1,dstlaplace,5); //cvLaplace(laplace1,dstlaplace,7); cvNamedWindow("LOG算子(核=3)",1); cvShowImage("LOG算子(核=3)",dst); cvReleaseImage(&log1); cvReleaseImage(&log2); cvReleaseImage(&log); cvReleaseImage(&pyr); cvReleaseImage(&laplace1); cvReleaseImage(&dst); cvReleaseImage(&laplace); } void CCvmedianfilterDlg::OnTough() { // TODO: Add your control notification handler code here char *wndname; wndname="原图"; cvNamedWindow(wndname,1);
IplImage *ww = 0,*ww1=0,*dst=0,*dst1=0; ww=cvLoadImage(filename,1); cvShowImage(wndname,ww); ww1=cvCreateImage(cvSize(ww->width,ww->height),IPL_DEPTH_8U,1); dst=cvCreateImage(cvSize(ww->width,ww->height),IPL_DEPTH_8U,1); dst1=cvCreateImage(cvSize(ww->width,ww->height),IPL_DEPTH_8U,3); cvCvtColor(ww, dst, CV_BGR2GRAY); CvMemStorage* storage = cvCreateMemStorage(0); CvSeq* lines = 0; int i; cvCanny(dst,ww1, 50, 200, 3 ); cvCvtColor(ww1,dst1, CV_GRAY2BGR ); #if 1 lines = cvHoughLines2(ww1, storage,CV_HOUGH_STANDARD, 1, CV_PI/180,150,3,0 );
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 = dst3->height; } else if( fabs(b) < 0.001 ) { pt1.y = pt2.y = cvRound(rho); pt1.x = 0; pt2.x = dst3->width; } else { pt1.x = 0; pt1.y = cvRound(rho/b); pt2.x = cvRound(rho/a); pt2.y = 0; } cvLine( dst1, pt1, pt2, CV_RGB(255,0,0), 3, 8 ); } #else lines = cvHoughLines2(ww1, storage, CV_HOUGH_PROBABILISTIC, 1, CV_PI/180, 20, 40, 20); for( i = 0; i < lines->total; i++ ) { CvPoint* line = (CvPoint*)cvGetSeqElem(lines,i); cvLine( dst1, line[0], line[1], CV_RGB(255,0,0), 3, 8 ); } #endif cvNamedWindow( "原图", 1 ); cvShowImage( "原图", ww ); cvNamedWindow( "Hough检测", 1 ); cvShowImage( "Hough检测", dst1 ); cvWaitKey(0); cvReleaseImage(&dst);
cvReleaseImage(&ww); cvReleaseImage(&ww1); cvReleaseImage(&dst1); }

|