ContourDemo.exe 轮廓提取

一、使用步骤

检测产品轮廓,获取轮廓数量以及轮廓长度。
在这里插入图片描述
梯度阈值: 提取边缘轮廓时使用的参数,当边缘对比度较差时需要降低梯度阈值,如果 目标边缘清晰,则可以设置比较高,取值范围 0~255。
最短长度: 检测的最短轮廓数据,初始值默认为 20;

最长长度: 检测的最长轮廓数据,初始值默认为 2000;

高精度: 使用插值功能可以提升定位精度。

滤波器: 滤波器可以增强边缘效果,但也会丢失细节,有低、中和高 3 个选项,默认为 中。

二、代码演示

在 StdAfx.h 的头文件中添加 CKVISION 相关定义

// 添加自定义删除图形消息
#defineWM_DELETE_FIGURES WM_USER+123

#include"…\…\Include\CKGDI.h"
#include"…\…\Include\CKBase.h"
#include"…\…\Include\CKContour.h"

#ifdef_WIN64
#pragma comment(lib, “…\…\Lib_x64\CKGDI.lib”)

#pragma comment(lib, “…\…\Lib_x64\CKBase.lib”)
#pragma comment(lib, “…\…\Lib_x64\CKContour.lib”)
#else

#pragmacomment(lib,
#pragmacomment(lib,
#pragmacomment(lib,
#endif

“…\…\Lib\CKGDI.lib”)
“…\…\Lib\CKBase.lib”)
“…\…\Lib\CKContour.lib”)

usingnamespaceCKVision;

在应用程序入口和退出的地方增加初始化和释放 CKVISION 库。
// CContourDemoApp initialization

BOOLCContourDemoApp::InitInstance()
{
CKVision::InitLibrary(); // 初始化 CKVision 库
//…

//…End
CKVision::ExitLibrary(); // 退出 CKVision 库
}
在资源视图 Dialog 中添加相应的界面操作
// … … 详情请打开实例参考。

在对话框窗口的 .h 头文件中定义相应的图像处理功能:
CPrImage m_Image; // 基础图像
CContourDetect m_Contour; // 轮廓检测

CGdiRect
COverlay
COverlay
显示。
CGdiView

m_Rect;
m_Overlay;
m_Results;

m_GdiView;

// 矩形ROI 检测区域
// 图像显示表面, 前显示的动态图形,主要用于ROI 显示。
// 图像显示表面, 前显示的静态图形,主要用于检测结果生成图形

// 图形显示视图窗口

// 添加自定义消息删除图形
afx_msgLRESULTOnDeleteFigures( WPARAMwParam, LPARAMlParam ) ;

在对话框窗口的.cpp 实现文件中添加相应的功能实现。
//{{AFX_MSG_MAP (CContourDemoDlg)
ON_MESSAGE ( WM_DELETE_FIGURES, OnDeleteFigures )

// 以消息的方式删除图形
LRESULTCContourDemoDlg::OnDeleteFigures( WPARAMwParam, LPARAMlParam )
{
if( m_Results.GetCount() )
{
for( inti=0; i<m_Results.GetCount(); i++ )
{
deletem_Results[i] ;
}
m_Results.RemoveAll();
}

return 0L;
}
// 执行轮廓检测
voidCContourDemoDlg::OnExecute()
{
// TODO: Add your control notification handler code here
m_Contour.SetThreshold( GetDlgItemInt(IDC_EDIT1) ) ;
m_Contour.SetMinLength( GetDlgItemInt(IDC_EDIT2) ) ;
m_Contour.SetMaxLength( GetDlgItemInt(IDC_EDIT3) ) ;
m_Contour.SetFilterSize( m_Combo1.GetCurSel() ) ;
m_Contour.SetSubPixel( m_SubPixel.GetCheck() ) ;

BeginTime();
if( m_Rect.GetVisible() )
m_Contour.Execute( m_Image, m_Rect );// 执行轮廓检测
else
m_Contour.Execute( m_Image, MaxROI ) ;
EndTime();

CStringtext;
MPNT* data=NULL;
m_List1.DeleteAllItems();

//Overlay_DeleteAll(m_Results);// 删除所有图形, 请注意在线程中调用清除图形时,最好使用发 送消息的方式。
SendMessage( WM_DELETE_FIGURES , 0 , 0); // 发送消息删除图形

if( m_Contour.GetPointCount()>0 ) {
intnum, n=0, i=0;
while( i>=0 ) {
data = m_Contour.GetPointData(i) ;

i = m_Contour.GetContourId(i,num) ;

text.Format( “%d”, n ) ;
m_List1.InsertItem( n, text ) ;

text.Format( “%d”, num ) ;
m_List1.SetItemText( n, 1, text ) ;

text = (data->m&MCP_CLOSE) ? “是” : “否” ;
m_List1.SetItemText( n, 2, text ) ;

n++;
}

// 根据结果数据添加到覆盖图显示
CGdiContour* pp = newCGdiContour(
m_Contour.GetPointData(0),
m_Contour.GetPointCount() ) ;
if( pp!=NULL ) {
pp->Offset( 0.5, 0.5 ) ;
pp->SetPenWidth( 2 ) ;
pp->SetPenColor(RGB (0,200,0));
m_Results.AddItem(pp) ;
}
}
// 刷新视图显示
m_GdiView.Redraw();
}

// … … 详情请打开实例参考。

更多推荐