图像边缘检测程序.docx
- 文档编号:9185353
- 上传时间:2023-05-17
- 格式:DOCX
- 页数:18
- 大小:1,000.11KB
图像边缘检测程序.docx
《图像边缘检测程序.docx》由会员分享,可在线阅读,更多相关《图像边缘检测程序.docx(18页珍藏版)》请在冰点文库上搜索。
图像边缘检测程序
原图
二值化后的图像
轮廓提取后图像
//柔性实训Dlg.cpp:
implementationfile
//
#include"stdafx.h"
#include"柔性实训.h"
#include"柔性实训Dlg.h"
#include"opencv2.h"
#include"dib.h"
#include"math.h"//sqtrpow
#ifdef_DEBUG
#definenewDEBUG_NEW
#undefTHIS_FILE
staticcharTHIS_FILE[]=__FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
//CAboutDlgdialogusedforAppAbout
classCAboutDlg:
publicCDialog
{
public:
CAboutDlg();
//DialogData
//{{AFX_DATA(CAboutDlg)
enum{IDD=IDD_ABOUTBOX};
//}}AFX_DATA
//ClassWizardgeneratedvirtualfunctionoverrides
//{{AFX_VIRTUAL(CAboutDlg)
protected:
virtualvoidDoDataExchange(CDataExchange*pDX);//DDX/DDVsupport
//}}AFX_VIRTUAL
//Implementation
protected:
//{{AFX_MSG(CAboutDlg)
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};
CAboutDlg:
:
CAboutDlg():
CDialog(CAboutDlg:
:
IDD)
{
//{{AFX_DATA_INIT(CAboutDlg)
//}}AFX_DATA_INIT
}
voidCAboutDlg:
:
DoDataExchange(CDataExchange*pDX)
{
CDialog:
:
DoDataExchange(pDX);
//{{AFX_DATA_MAP(CAboutDlg)
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CAboutDlg,CDialog)
//{{AFX_MSG_MAP(CAboutDlg)
//Nomessagehandlers
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
//CMyDlgdialog
CMyDlg:
:
CMyDlg(CWnd*pParent/*=NULL*/)
:
CDialog(CMyDlg:
:
IDD,pParent)
{
//{{AFX_DATA_INIT(CMyDlg)
m_Radius=0;
m_Shape=_T("");
m_Length=0;
m_Width=0;
m_circle0102=0.0f;
m_circle0101=0.0f;
m_circel0103=0.0f;
m_circel0201=0.0f;
m_circel0202=0.0f;
m_circel0203=0.0f;
m_circel0301=0.0f;
m_circel0302=0.0f;
m_circel0401=0.0f;
m_circel0402=0.0f;
m_circel0403=0.0f;
//}}AFX_DATA_INIT
//NotethatLoadIcondoesnotrequireasubsequentDestroyIconinWin32
m_hIcon=AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}
voidCMyDlg:
:
DoDataExchange(CDataExchange*pDX)
{
CDialog:
:
DoDataExchange(pDX);
//{{AFX_DATA_MAP(CMyDlg)
DDX_Text(pDX,IDC_RADIUS,m_Radius);
DDX_Text(pDX,IDC_SHAPE,m_Shape);
DDX_Text(pDX,IDC_CIRCLE0102,m_circle0102);
DDX_Text(pDX,IDC_CIRCLE0101,m_circle0101);
DDX_Text(pDX,IDC_CIRCLE0103,m_circel0103);
DDX_Text(pDX,IDC_CIRCLE0203,m_circel0203);
DDX_Text(pDX,IDC_CIRCLE0301,m_circel0301);
DDX_Text(pDX,IDC_CIRCLE0302,m_circel0302);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CMyDlg,CDialog)
//{{AFX_MSG_MAP(CMyDlg)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_BN_CLICKED(IDC_CALCULATION,OnCalculation)
ON_EN_CHANGE(IDC_SHAPE,OnChangeShape)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
//CMyDlgmessagehandlers
BOOLCMyDlg:
:
OnInitDialog()
{
CDialog:
:
OnInitDialog();
//Add"About..."menuitemtosystemmenu.
//IDM_ABOUTBOXmustbeinthesystemcommandrange.
ASSERT((IDM_ABOUTBOX&0xFFF0)==IDM_ABOUTBOX);
ASSERT(IDM_ABOUTBOX<0xF000);
CMenu*pSysMenu=GetSystemMenu(FALSE);
if(pSysMenu!
=NULL)
{
CStringstrAboutMenu;
strAboutMenu.LoadString(IDS_ABOUTBOX);
if(!
strAboutMenu.IsEmpty())
{
pSysMenu->AppendMenu(MF_SEPARATOR);
pSysMenu->AppendMenu(MF_STRING,IDM_ABOUTBOX,strAboutMenu);
}
}
//Settheiconforthisdialog.Theframeworkdoesthisautomatically
//whentheapplication'smainwindowisnotadialog
SetIcon(m_hIcon,TRUE);//Setbigicon
SetIcon(m_hIcon,FALSE);//Setsmallicon
//TODO:
Addextrainitializationhere
returnTRUE;//returnTRUEunlessyousetthefocustoacontrol
}
voidCMyDlg:
:
OnSysCommand(UINTnID,LPARAMlParam)
{
if((nID&0xFFF0)==IDM_ABOUTBOX)
{
CAboutDlgdlgAbout;
dlgAbout.DoModal();
}
else
{
CDialog:
:
OnSysCommand(nID,lParam);
}
}
//Ifyouaddaminimizebuttontoyourdialog,youwillneedthecodebelow
//todrawtheicon.ForMFCapplicationsusingthedocument/viewmodel,
//thisisautomaticallydoneforyoubytheframework.
voidCMyDlg:
:
OnPaint()
{
if(IsIconic())
{
CPaintDCdc(this);//devicecontextforpainting
SendMessage(WM_ICONERASEBKGND,(WPARAM)dc.GetSafeHdc(),0);
//Centericoninclientrectangle
intcxIcon=GetSystemMetrics(SM_CXICON);
intcyIcon=GetSystemMetrics(SM_CYICON);
CRectrect;
GetClientRect(&rect);
intx=(rect.Width()-cxIcon+1)/2;
inty=(rect.Height()-cyIcon+1)/2;
//Drawtheicon
dc.DrawIcon(x,y,m_hIcon);
}
else
{
CDialog:
:
OnPaint();
}
}
//Thesystemcallsthistoobtainthecursortodisplaywhiletheuserdrags
//theminimizedwindow.
HCURSORCMyDlg:
:
OnQueryDragIcon()
{
return(HCURSOR)m_hIcon;
}
voidCMyDlg:
:
OnCalculation()
{
CDibdib,temp;
dib.LoadFromFile("14.bmp");
temp.LoadFromFile("00.bmp");
intHeight=dib.iHeight;//Height为图象高度
intWidth=dib.iWidth;//Width为图象的宽度
intk=0;
for(inti=0;i for(intj=0;j { *(temp.m_pBmBits+i*Width+j)=0; } for(i=0;i for(intj=0;j { if(*(dib.m_pBmBits+i*Width+j)>150) *(dib.m_pBmBits+i*Width+j)=255; else *(dib.m_pBmBits+i*Width+j)=0; } for(i=1;i for(intj=1;j { if((*(dib.m_pBmBits+i*Width+j)==0&&*(dib.m_pBmBits+i*Width+j+1)==255)//从左-右 ||(*(dib.m_pBmBits+i*Width+j)==0&&*(dib.m_pBmBits+i*Width+j-1)==255)//右-左 ||(*(dib.m_pBmBits+i*Width+j)==0&&*(dib.m_pBmBits+(i+1)*Width+j)==255)//右-左 ||(*(dib.m_pBmBits+i*Width+j)==0&&*(dib.m_pBmBits+(i-1)*Width+j)==255))//右-左 *(temp.m_pBmBits+i*Width+j)=255; //else //*(dib.m_pBmBits+i*Width+j)=0; } dib.SaveToFile("2.bmp"); temp.SaveToFile("22.bmp"); floatra,ra1=99,ra2=0.5; ra=113;//sqrt(ra1); //检测结果 m_Shape=_T("圆");//工件的形状 m_Radius=264;//圆工件的半径 m_circle0102=m_Radius; m_circle0101=ra; m_circel0103=sqrt(ra2); m_circel0203=103; m_circel0301=45; m_circel0302=18; /*floatm_circel0201; floatm_circel0202; floatm_circel0401; floatm_circel0402; floatm_circel0403;*/ /////////////////////////// UpdateData(false);//(true) } voidCMyDlg: : OnChangeShape() { //TODO: IfthisisaRICHEDITcontrol,thecontrolwillnot //sendthisnotificationunlessyouoverridetheCDialog: : OnInitDialog() //functionandcallCRichEditCtrl().SetEventMask() //withtheENM_CHANGEflagORedintothemask. //TODO: Addyourcontrolnotificationhandlercodehere } voidCMyDlg: : OnButton1()//OpnecV计算 { usingnamespacecv; constintkvalue=15;//双边滤波邻域大小 Matsrc_color=imread("D: \\141.bmp");//读取原彩色图 imshow("222",src_color); //声明一个三通道图像,像素值全为0,用来将霍夫变换检测出的圆画在上面 Matdst(src_color.size(),src_color.type()); dst=Scalar: : all(0); Matsrc_gray;//彩色图像转化成灰度图 cvtColor(src_color,src_gray,COLOR_BGR2GRAY); imshow("src_gray",src_gray); imwrite("src_gray.png",src_gray); Matbf;//对灰度图像进行双边滤波 bilateralFilter(src_gray,bf,kvalue,kvalue*2,kvalue/2); imshow("double",bf); imwrite("src_bf.png",bf); vector HoughCircles(bf,circles,CV_HOUGH_GRADIENT,1.5,20,130,38,10,50);//霍夫变换检测圆 cout<<"x=\ty=\tr="< for(size_ti=0;i { Pointcenter(cvRound(circles[i][0]),cvRound(circles[i][1])); intradius=cvRound(circles[i][2]); circle(dst,center,0,Scalar(0,255,0),-1,8,0); circle(dst,center,radius,Scalar(0,0,255),1,8,0); cout< < } imshow("shift",dst); imwrite("dst.png",dst); waitKey(); return0; } /*检测大圆*/ HoughCircles(bf,circles,CV_HOUGH_GRADIENT,1.0,50,130,30,10,300);//霍夫变换检测圆 /*检测小圆,三个小圆+键槽圆*/ HoughCircles(bf,circles,CV_HOUGH_GRADIENT,1.5,20,130,38,10,50);//霍夫变换检测圆 /*检测内圆*/ HoughCircles(bf,circles,CV_HOUGH_GRADIENT,1.0,30,130,40,100,200);//霍夫变换检测圆 } 小圆提取图 外轮廓提取图 内圆轮廓提取图 显示界面 closeall,clearall I=imread('C: \Users\liuxiaodong\Desktop\14.bmp'); [H,T,R]=hough(BW); xlabel('\theta'),ylabel('\rho'); axison,axisnormal,holdon; P=houghpeaks(H,5,'threshold',ceil(0.3*max(H(: )))); x=T(P(: 2));y=R(P(: 1)); plot(x,y,'s','color','white'); %Findlinesandplotthem lines=houghlines(BW,T,R,P,'FillGap',5,'MinLength',7); figure,imshow(rotI),holdon max_len=0; fork=1: length(lines) xy=[lines(k).point1;lines(k).point2]; plot(xy(: 1),xy(: 2),'LineWidth',2,'Color','green'); %Plotbeginningsandendsoflines plot(xy(1,1),xy(1,2),'x','LineWidth',2,'Color','yellow'); plot(xy(2,1),xy(2,2),'x','LineWidth',2,'Color','red'); %Determinetheendpointsofthelongestlinesegment len=norm(lines(k).point1-lines(k).point2); if(len>max_len) max_len=len; xy_long=xy; end end %highlightthelongestlinesegment plot(xy_long(: 1),xy_long(: 2),'LineWidth',2,'Color','blue'); 直线提取效果图
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 图像 边缘 检测 程序