在好例子网,分享、交流、成长!
您当前所在位置:首页C/C++ 开发实例图形和图像处理 → 基于HALCON的AI图像处理,完整版哦

基于HALCON的AI图像处理,完整版哦

图形和图像处理

下载此实例
  • 开发语言:C/C++
  • 实例大小:999.08M
  • 下载次数:12
  • 浏览次数:97
  • 发布时间:2024-12-24
  • 实例类别:图形和图像处理
  • 发 布 人:carllijun
  • 文件格式:.rar
  • 所需积分:10
 相关标签: Halcon 图像处理 完整版 Halcon

实例介绍

【实例简介】集成了3类AI  字符,缺陷和语义分割
【实例截图】from clipboard
【核心代码】
// MFCDlg.cpp: 实现文件
//

#include "pch.h"
#include "framework.h"
#include "MFC.h"
#include "MFCDlg.h"
#include "afxdialogex.h"

#include "MvCamera.h"
#include "HalconCpp.h"
#include "DLT.h"
#include <direct.h>
#include "USE_FUN.h"

#include "Algorithm.h"
#include "DlOcr.h"

#include "YtPlc_Keyence_Eip.h"

using namespace HalconCpp;

#ifdef _DEBUG
#define new DEBUG_NEW
#endif


#define STATUS_OK               0
#define STATUS_ERROR            -1


#if 1

#define SHOW_Result
#endif

Algorithm Alg;
DlOcr dl_ocr;
//CMvCamera g_Camera;
HTuple m_imageW = NULL, m_imageH = NULL;
HTuple HV_WindowHandle;
////////////////////////////
// 深度学习变量

HTuple  hv_ExampleDir, hv_DLPreprocessParam, hv_okngDLPreprocessParam;
HTuple  hv_DLOCRModelHandle, hv_DLModelHandle, hv_DLDeviceHandles, hv_DLDevice;
HTuple  hv_MetaData, hv_InferenceClassificationThreshold;
HTuple  hv_InferenceSegmentationThreshold, hv_DLDatasetInfo;
HTuple  hv_WindowDict, hv_DLSample_okng, hv_DLSample_ocr, hv_DLSample_scratch, hv_DLResult;
HTuple  hv_DeepOcrHandle, hv_DLOKNGModelHandle, hv_Alphabet, hv_DeepOcrResult;
HTuple  hv_BestModelFilename, hv_BestModelDeepOCRFilename, hv_DeviceRuntime;

HTuple  hv_RetrainedModelFileName, hv_PreprocessParamFileName, hv_ClassNames, hv_ClassIDs;
//////////////////////////////PLC//////////////////////////////////
string IP;
// //////////////////////
//统计变量
int check_numb=0,ng_num=0,ok_num=0;





class CAboutDlg : public CDialogEx
{
public:
CAboutDlg();

// 对话框数据
#ifdef AFX_DESIGN_TIME
enum { IDD = IDD_ABOUTBOX };
#endif

protected:
virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV 支持

// 实现
protected:
DECLARE_MESSAGE_MAP()
public:
afx_msg void OnBnClickedTriggerModeRadio();
afx_msg void OnBnClickedContinusModeRadio();
};

CAboutDlg::CAboutDlg() : CDialogEx(IDD_ABOUTBOX)
{
}

void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
CDialogEx::DoDataExchange(pDX);
}

BEGIN_MESSAGE_MAP(CAboutDlg, CDialogEx)
END_MESSAGE_MAP()


// CMFCDlg 对话框
// //!!!!MFC初始化
//if (!AfxWinInit(::GetModuleHandle(NULL), NULL, ::GetCommandLine(), 0))
//{
// //??_Module.LogEvent(_T("MFC初始化错误!"), EVENTLOG_ERROR_TYPE );
// return 1;
//}
//CMFCDlg Cmfcdlg;


CMFCDlg::CMFCDlg(CWnd* pParent /*=nullptr*/)
: CDialogEx(IDD_MFC_DIALOG, pParent)
, m_pcMyCamera(NULL)
, m_nDeviceCombo(0)
, m_bOpenDevice(FALSE)
, m_bStartGrabbing(FALSE)
, m_hGrabThread(NULL)
, m_bThreadState(FALSE)
, m_nTriggerMode(MV_TRIGGER_MODE_OFF)
, m_dExposureEdit(0)
, m_dGainEdit(0)
, m_dFrameRateEdit(0)
, m_bSoftWareTriggerCheck(FALSE)
, m_nTriggerSource(MV_TRIGGER_SOURCE_SOFTWARE)
, m_pSaveImageBuf(NULL)
, m_nSaveImageBufSize(0)
{
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}

void CMFCDlg::DoDataExchange(CDataExchange* pDX)
{
CDialogEx::DoDataExchange(pDX);
DDX_Control(pDX, IDC_DEVICE_COMBO, m_ctrlDeviceCombo);
DDX_Text(pDX, IDC_EXPOSURE_EDIT, m_dExposureEdit);
DDX_Text(pDX, IDC_GAIN_EDIT, m_dGainEdit);
DDX_Text(pDX, IDC_FRAME_RATE_EDIT, m_dFrameRateEdit);
DDX_Text(pDX, IDC_PIXEL_FORMAT_EDIT, (CString)(m_chPixelFormat));
DDX_Check(pDX, IDC_SOFTWARE_TRIGGER_CHECK, m_bSoftWareTriggerCheck);

DDX_Control(pDX, IDC_STEXT, St_numb);
DDX_Control(pDX, IDC_EDIT1, Check_Num);
DDX_Control(pDX, IDC_EDIT2, OK_num);
DDX_Control(pDX, IDC_EDIT3, NG_num);
DDX_Control(pDX, IDC_LIST1, m_ctrlMsgListBox);
DDX_Control(pDX, IDC_AUTO_MODE_RADIO, SampleAutoMode);
DDX_Control(pDX, IDC_OCR_MODE_RADIO, OcrMode);
DDX_Control(pDX, IDC_SCRATCH_MODE_RADIO, ScratchMode);
DDX_Control(pDX, IDC_GEAR_MODE_RADIO, GearMode);
}

BEGIN_MESSAGE_MAP(CMFCDlg, CDialogEx)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_BN_CLICKED(IDC_SOFTWARE_ONCE_BUTTON, &CMFCDlg::OnBnClickedSoftwareOnceButton)
ON_BN_CLICKED(IDC_STOP_GRABBING_BUTTON, &CMFCDlg::OnBnClickedStopGrabbingButton)
ON_BN_CLICKED(IDC_START_GRABBING_BUTTON, &CMFCDlg::OnBnClickedStartGrabbingButton)
ON_WM_QUERYDRAGICON()

ON_BN_CLICKED(IDC_OPEM_CAM, &CMFCDlg::OnBnClickedOpemCam)
ON_BN_CLICKED(IDC_BUTTON4, &CMFCDlg::OnBnClickedButton4)
ON_BN_CLICKED(IDC_CONNECT, &CMFCDlg::OnBnClickedConnect)
ON_BN_CLICKED(IDC_SOFTWARE_TRIGGER_CHECK, &CMFCDlg::OnBnClickedSoftwareTriggerCheck)
ON_BN_CLICKED(IDC_SET_PARAMETER_BUTTON, &CMFCDlg::OnBnClickedSetParameterButton)
ON_BN_CLICKED(IDC_GET_PARAMETER_BUTTON, &CMFCDlg::OnBnClickedGetParameterButton)

ON_BN_CLICKED(IDC_CONTINUS_MODE_RADIO, &CMFCDlg::OnBnClickedContinusModeRadio)
ON_BN_CLICKED(IDC_TRIGGER_MODE_RADIO, &CMFCDlg::OnBnClickedTriggerModeRadio)

ON_BN_CLICKED(IDC_BUT_LOAD_NET, &CMFCDlg::OnBnClickedButLoadNet)
ON_BN_CLICKED(IDC_BUTTON6, &CMFCDlg::OnBnClickedButton6)

ON_WM_CTLCOLOR()
ON_BN_CLICKED(IDC_BUT_Save_date, &CMFCDlg::OnBnClickedButSavedate)
ON_BN_CLICKED(IDC_BUT_clear_date, &CMFCDlg::OnBnClickedButcleardate)
ON_BN_CLICKED(IDC_AUTO_MODE_RADIO, &CMFCDlg::OnBnClickedAutoModeRadio)
ON_BN_CLICKED(IDC_OCR_MODE_RADIO, &CMFCDlg::OnBnClickedOcrModeRadio)
ON_BN_CLICKED(IDC_SCRATCH_MODE_RADIO, &CMFCDlg::OnBnClickedScratchModeRadio)
ON_BN_CLICKED(IDC_GEAR_MODE_RADIO, &CMFCDlg::OnBnClickedGearModeRadio)
ON_BN_CLICKED(IDC_BUTTON1, &CMFCDlg::OnBnClickedButton1)

ON_WM_CLOSE()
END_MESSAGE_MAP()


/////////////////////////////
//和PLC 通讯新线程,数据量很小,不开线程也可以
UINT ThreadSingel(LPVOID pParam)
{
CMFCDlg Cmfcdlg;
if (!Cmfcdlg.JNSPLC.IsOpen())
{
Cmfcdlg.JNSPLC.Open(IP.c_str(), 8501);
}
if (Cmfcdlg.JNSPLC.IsOpen())
{
int a;
if (1 == 1)  a = 0;
else a = 1;
int* WritePlcdate1 = &a;
Cmfcdlg.JNSPLC.PLCWrite(WritePlcdate1, 1, 1, 5000);//  write_data,len,type,start_addr
}

return 0;
}



// CMFCDlg 消息处理程序

BOOL CMFCDlg::OnInitDialog()
{
CDialogEx::OnInitDialog();

// 将“关于...”菜单项添加到系统菜单中。

// IDM_ABOUTBOX 必须在系统命令范围内。
ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
ASSERT(IDM_ABOUTBOX < 0xF000);

CMenu* pSysMenu = GetSystemMenu(FALSE);
if (pSysMenu != nullptr)
{
BOOL bNameValid;
CString strAboutMenu;
bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX);
ASSERT(bNameValid);
if (!strAboutMenu.IsEmpty())
{
pSysMenu->AppendMenu(MF_SEPARATOR);
pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
}
}

// 设置此对话框的图标。  当应用程序主窗口不是对话框时,框架将自动
//  执行此操作
SetIcon(m_hIcon, TRUE); // 设置大图标
SetIcon(m_hIcon, FALSE); // 设置小图标

// TODO: 在此添加额外的初始化代码

HObject  ho_Image;
HTuple mod_Width = NULL, mod_Height = NULL;
//ReadImage(&ho_Image, "../image/1.jpg");
ReadImage(&ho_Image, "../image/1.bmp");
GetImageSize(ho_Image, &mod_Width, &mod_Height);
//mod_Width[0] = 640;
//mod_Height[0] = 480;
CRect rect;
GetDlgItem(IDC_PIC_VIO)->GetWindowRect(&rect);
HWND hwnd = GetDlgItem(IDC_PIC_VIO)->m_hWnd;
LONG LWwindID = (LONG)hwnd;
m_imageW[0] = rect.Width();
m_imageH[0] = rect.Height();
SetWindowAttr("background_color", "blue");
OpenWindow(0, 0, m_imageW, m_imageH, LWwindID, "", "", &HV_WindowHandle);
SetPart(HV_WindowHandle, 0, 0, mod_Height, mod_Width);
DispObj(ho_Image, HV_WindowHandle);


//GetDlgItem(IDC_CONTINUS_MODE_RADIO)->EnableWindow(m_bOpenDevice ? TRUE : FALSE);
//GetDlgItem(IDC_TRIGGER_MODE_RADIO)->EnableWindow(m_bOpenDevice ? TRUE : FALSE);
/////////////////////设置字体//////////////////////////
// 
CFont* pFont = new CFont();
//设置静态文本字体大小
pFont->CreatePointFont(1000, _T("宋体"));
GetDlgItem(IDC_STEXT)->SetFont(pFont);

//加载网络
LoadNet();
//加载参数
Read_Date();
//显示
Show_Date();
//
ChackMode = 1;
//CheckRadioButton(IDC_OCR_MODE_RADIO, IDC_SCRATCH_MODE_RADIO, IDC_AUTO_MODE_RADIO);
((CButton*)GetDlgItem(IDC_AUTO_MODE_RADIO))->SetCheck(BST_CHECKED);//程序启动时默认为单选按钮1选中


////////////////////////////////////////plc网络 开线程////////////////////
CString FilePath = "..\\config\\config.ini";
IP = g_cFileOprate.ReadIni(g_cFileOprate.m_strAppNameSystem, "PLC_IP");
//PLC_Rceive_Cord_StartAdd = GetPrivateProfileInt(_T("SYSTEM"), _T("PLC接收花篮编号的地址"), 54214, _T(FilePath));
//PLC_Rceive_Accom_StartAdd = GetPrivateProfileInt(_T("SYSTEM"), _T("花篮识别完成的地址"), 54215, _T(FilePath));
CWinThread*  g_pThreadSingel = AfxBeginThread(ThreadSingel, this, THREAD_PRIORITY_NORMAL, 0, 0);

//if (!Cmfcdlg.JNSPLC.IsOpen())
//{
// Cmfcdlg.JNSPLC.Open(IP.c_str(), 8501);
//}
//if (NULL == g_pThreadSingel)
//{
// MessageBox("创建PLC通讯线程失败\r\n");

//}

//////////////////////////////////////////////////////////////////////////////////
return TRUE;  // 除非将焦点设置到控件,否则返回 TRUE
}

void CMFCDlg::OnSysCommand(UINT nID, LPARAM lParam)
{
if ((nID & 0xFFF0) == IDM_ABOUTBOX)
{
CAboutDlg dlgAbout;
dlgAbout.DoModal();
}
else
{
CDialogEx::OnSysCommand(nID, lParam);
}
}

// 如果向对话框添加最小化按钮,则需要下面的代码
//  来绘制该图标。  对于使用文档/视图模型的 MFC 应用程序,
//  这将由框架自动完成。

void CMFCDlg::OnPaint()
{
if (IsIconic())
{
CPaintDC dc(this); // 用于绘制的设备上下文

SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);

// 使图标在工作区矩形中居中
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;

// 绘制图标
dc.DrawIcon(x, y, m_hIcon);
}
else
{
CDialogEx::OnPaint();
}
}

//当用户拖动最小化窗口时系统调用此函数取得光标
//显示。
HCURSOR CMFCDlg::OnQueryDragIcon()
{
return static_cast<HCURSOR>(m_hIcon);
}






// ch:相机回调函数 
 void __stdcall  CMFCDlg::ImageCallBack(unsigned char* pData, MV_FRAME_OUT_INFO_EX* pFrameInfo, void* pUser)
{
CString str1;
HObject ImageRGB;
CMFCDlg* pBasicDemo = (CMFCDlg*)pUser;

str1.Format(_T("触发一次"), 30, 20);
//消息框包含两个按钮:确定和帮助
AfxMessageBox(str1, MB_HELP | MB_ICONWARNING, 0);

//GenImage1(&Image, "byte", pFrameInfo->nWidth, pFrameInfo->nHeight, (Hlong)pData);//黑白
GenImageInterleaved(&(ImageRGB), (Hlong)pData, "rgb", (pFrameInfo->nWidth), pFrameInfo->nHeight, 0, "byte", (pFrameInfo->nWidth), pFrameInfo->nHeight, 0, 0, -1, 0);

switch (pBasicDemo->ChackMode)
{
case 1:
{

}
break;
case 2:
{

}
break;
case 4:
{

}
break;
case 8:
{
pBasicDemo->AttachFromFile(ImageRGB);
pBasicDemo->ImageOkNgChack(ImageRGB);

}
break;

default:
break;
}

}


 // ch:按钮使能 | en:Enable control
 void CMFCDlg::EnableControls(BOOL bIsCameraReady)
 {
//GetDlgItem(IDC_OPEN_BUTTON)->EnableWindow(m_bOpenDevice ? FALSE : (bIsCameraReady ? TRUE : FALSE));
// GetDlgItem(IDC_CLOSE_BUTTON)->EnableWindow((m_bOpenDevice && bIsCameraReady) ? TRUE : FALSE);
GetDlgItem(IDC_START_GRABBING_BUTTON)->EnableWindow((m_bStartGrabbing && bIsCameraReady) ? FALSE : (m_bOpenDevice ? TRUE : FALSE));
GetDlgItem(IDC_STOP_GRABBING_BUTTON)->EnableWindow(m_bStartGrabbing ? TRUE : FALSE);
GetDlgItem(IDC_SOFTWARE_TRIGGER_CHECK)->EnableWindow(m_bOpenDevice ? TRUE : FALSE);
GetDlgItem(IDC_SOFTWARE_ONCE_BUTTON)->EnableWindow((m_bStartGrabbing && m_bSoftWareTriggerCheck && ((CButton*)GetDlgItem(IDC_TRIGGER_MODE_RADIO))->GetCheck()) ? TRUE : FALSE);

GetDlgItem(IDC_EXPOSURE_EDIT)->EnableWindow(m_bOpenDevice ? TRUE : FALSE);
GetDlgItem(IDC_GAIN_EDIT)->EnableWindow(m_bOpenDevice ? TRUE : FALSE);
GetDlgItem(IDC_FRAME_RATE_EDIT)->EnableWindow(m_bOpenDevice ? TRUE : FALSE);
GetDlgItem(IDC_PIXEL_FORMAT_EDIT)->EnableWindow(FALSE);
GetDlgItem(IDC_GET_PARAMETER_BUTTON)->EnableWindow(m_bOpenDevice ? TRUE : FALSE);
GetDlgItem(IDC_SET_PARAMETER_BUTTON)->EnableWindow(m_bOpenDevice ? TRUE : FALSE);
GetDlgItem(IDC_CONTINUS_MODE_RADIO)->EnableWindow(m_bOpenDevice ? TRUE : FALSE);
GetDlgItem(IDC_TRIGGER_MODE_RADIO)->EnableWindow(m_bOpenDevice ? TRUE : FALSE);



 }


 // 获取相机参数
 void CMFCDlg::GetParmeter()
 {
int nRet = GetTriggerMode();
if (nRet != MV_OK)
{
ShowErrorMsg(TEXT("Get Trigger Mode Fail"), nRet);
}

nRet = GetExposureTime();
if (nRet != MV_OK)
{
ShowErrorMsg(TEXT("Get Exposure Time Fail"), nRet);
}

nRet = GetGain();
if (nRet != MV_OK)
{
ShowErrorMsg(TEXT("Get Gain Fail"), nRet);
}

nRet = GetFrameRate();
if (nRet != MV_OK)
{
ShowErrorMsg(TEXT("Get Frame Rate Fail"), nRet);
}

nRet = GetTriggerSource();
if (nRet != MV_OK)
{
ShowErrorMsg(TEXT("Get Trigger Source Fail"), nRet);
}

nRet = GetPixelFormat();
if (nRet != MV_OK)
{
ShowErrorMsg(TEXT("Get Pixel Format Fail"), nRet);
}

UpdateData(FALSE);
 }

  // ch:关闭设备 | en:Close Device
 int CMFCDlg::CloseDevice()
 {
m_bThreadState = FALSE;
if (m_hGrabThread)
{
WaitForSingleObject(m_hGrabThread, INFINITE);
CloseHandle(m_hGrabThread);
m_hGrabThread = NULL;
}

if (m_pcMyCamera)
{
m_pcMyCamera->Close();
delete m_pcMyCamera;
m_pcMyCamera = NULL;
}

m_bStartGrabbing = FALSE;
m_bOpenDevice = FALSE;

if (m_pSaveImageBuf)
{
free(m_pSaveImageBuf);
m_pSaveImageBuf = NULL;
}
m_nSaveImageBufSize = 0;

return MV_OK;
 }

 // ch:获取触发模式 | en:Get Trigger Mode
 int CMFCDlg::GetTriggerMode()
 {
MVCC_ENUMVALUE stEnumValue = { 0 };

int nRet = m_pcMyCamera->GetEnumValue("TriggerMode", &stEnumValue);
if (MV_OK != nRet)
{
return nRet;
}

m_nTriggerMode = stEnumValue.nCurValue;
if (MV_TRIGGER_MODE_ON == m_nTriggerMode)
{
// OnBnClickedTriggerModeRadio();
}
else
{
m_nTriggerMode = MV_TRIGGER_MODE_OFF;
// OnBnClickedContinusModeRadio();
}

return MV_OK;
 }

 // ch:设置触发模式 | en:Set Trigger Mode
 int CMFCDlg::SetTriggerMode()
 {
return m_pcMyCamera->SetEnumValue("TriggerMode", m_nTriggerMode);
 }

 // ch:获取曝光时间 | en:Get Exposure Time
 int CMFCDlg::GetExposureTime()
 {
MVCC_FLOATVALUE stFloatValue = { 0 };

int nRet = m_pcMyCamera->GetFloatValue("ExposureTime", &stFloatValue);
if (MV_OK != nRet)
{
return nRet;
}

m_dExposureEdit = stFloatValue.fCurValue;

return MV_OK;
 }

 // ch:设置曝光时间 | en:Set Exposure Time
 int CMFCDlg::SetExposureTime()
 {
m_pcMyCamera->SetEnumValue("ExposureAuto", MV_EXPOSURE_AUTO_MODE_OFF);

return m_pcMyCamera->SetFloatValue("ExposureTime", (float)m_dExposureEdit);
 }

 // ch:获取增益 | en:Get Gain
 int CMFCDlg::GetGain()
 {
MVCC_FLOATVALUE stFloatValue = { 0 };

int nRet = m_pcMyCamera->GetFloatValue("Gain", &stFloatValue);
if (MV_OK != nRet)
{
return nRet;
}
m_dGainEdit = stFloatValue.fCurValue;

return MV_OK;
 }

 // ch:设置增益 | en:Set Gain
 int CMFCDlg::SetGain()
 {
// ch:设置增益前先把自动增益关闭,失败无需返回
//en:Set Gain after Auto Gain is turned off, this failure does not need to return
m_pcMyCamera->SetEnumValue("GainAuto", 0);

return m_pcMyCamera->SetFloatValue("Gain", (float)m_dGainEdit);
 }

 // ch:获取帧率 | en:Get Frame Rate
 int CMFCDlg::GetFrameRate()
 {
MVCC_FLOATVALUE stFloatValue = { 0 };

int nRet = m_pcMyCamera->GetFloatValue("ResultingFrameRate", &stFloatValue);
if (MV_OK != nRet)
{
return nRet;
}
m_dFrameRateEdit = stFloatValue.fCurValue;

return MV_OK;
 }

 // ch:设置帧率 | en:Set Frame Rate
 int CMFCDlg::SetFrameRate()
 {
int nRet = m_pcMyCamera->SetBoolValue("AcquisitionFrameRateEnable", true);
if (MV_OK != nRet)
{
return nRet;
}

return m_pcMyCamera->SetFloatValue("AcquisitionFrameRate", (float)m_dFrameRateEdit);
 }

 // ch:获取触发源 | en:Get Trigger Source
 int CMFCDlg::GetTriggerSource()
 {
MVCC_ENUMVALUE stEnumValue = { 0 };

int nRet = m_pcMyCamera->GetEnumValue("TriggerSource", &stEnumValue);
if (MV_OK != nRet)
{
return nRet;
}

if ((unsigned int)MV_TRIGGER_SOURCE_SOFTWARE == stEnumValue.nCurValue)
{
m_bSoftWareTriggerCheck = TRUE;
}
else
{
m_bSoftWareTriggerCheck = FALSE;
}

return MV_OK;
 }

 // ch:设置触发源 | en:Set Trigger Source
 int CMFCDlg::SetTriggerSource()
 {
int nRet = MV_OK;
if (m_bSoftWareTriggerCheck)
{
m_nTriggerSource = MV_TRIGGER_SOURCE_SOFTWARE;
nRet = m_pcMyCamera->SetEnumValue("TriggerSource", m_nTriggerSource);
if (MV_OK != nRet)
{
ShowErrorMsg(TEXT("Set Software Trigger Fail"), nRet);
return nRet;
}
GetDlgItem(IDC_SOFTWARE_ONCE_BUTTON)->EnableWindow(TRUE);
}
else
{
m_nTriggerSource = MV_TRIGGER_SOURCE_LINE0;
nRet = m_pcMyCamera->SetEnumValue("TriggerSource", m_nTriggerSource);
if (MV_OK != nRet)
{
ShowErrorMsg(TEXT("Set Hardware Trigger Fail"), nRet);
return nRet;
}
GetDlgItem(IDC_SOFTWARE_ONCE_BUTTON)->EnableWindow(FALSE);
}

return nRet;
 }

 // ch:显示错误信息 | en:Show error message
 void CMFCDlg::ShowErrorMsg(CString csMessage, int nErrorNum)
 {
CString errorMsg;
if (nErrorNum == 0)
{
errorMsg.Format(_T("%s"), csMessage);
}
else
{
errorMsg.Format(_T("%s: Error = %x: "), csMessage, nErrorNum);
}

switch (nErrorNum)
{
case MV_E_HANDLE:           errorMsg = "Error or invalid handle ";                                         break;
case MV_E_SUPPORT:          errorMsg = "Not supported function ";                                          break;
case MV_E_BUFOVER:          errorMsg = "Cache is full ";                                                   break;
case MV_E_CALLORDER:        errorMsg = "Function calling order error ";                                    break;
case MV_E_PARAMETER:        errorMsg = "Incorrect parameter ";                                             break;
case MV_E_RESOURCE:         errorMsg = "Applying resource failed ";                                        break;
case MV_E_NODATA:           errorMsg = "No data ";                                                         break;
case MV_E_PRECONDITION:     errorMsg = "Precondition error, or running environment changed ";              break;
case MV_E_VERSION:          errorMsg = "Version mismatches ";                                              break;
case MV_E_NOENOUGH_BUF:     errorMsg = "Insufficient memory ";                                             break;
case MV_E_ABNORMAL_IMAGE:   errorMsg = "Abnormal image, maybe incomplete image because of lost packet ";   break;
case MV_E_UNKNOW:           errorMsg = "Unknown error ";                                                   break;
case MV_E_GC_GENERIC:       errorMsg = "General error ";                                                   break;
case MV_E_GC_ACCESS:        errorMsg = "Node accessing condition error ";                                  break;
case MV_E_ACCESS_DENIED: errorMsg = "No permission ";                                                   break;
case MV_E_BUSY:             errorMsg = "Device is busy, or network disconnected ";                         break;
case MV_E_NETER:            errorMsg = "Network error ";                                                   break;
}

MessageBox(errorMsg, TEXT("PROMPT"), MB_OK | MB_ICONWARNING);
 }

 // 该接口只展示GetEnumEntrySymbolic接口的使用方法
 int CMFCDlg::GetPixelFormat()
 {
MVCC_ENUMVALUE stEnumValue = { 0 };
MVCC_ENUMENTRY stPixelFormatInfo = { 0 };

int nRet = m_pcMyCamera->GetEnumValue("PixelFormat", &stEnumValue);
if (MV_OK != nRet)
{
return nRet;
}

stPixelFormatInfo.nValue = stEnumValue.nCurValue;
nRet = m_pcMyCamera->GetEnumEntrySymbolic("PixelFormat", &stPixelFormatInfo);
if (MV_OK != nRet)
{
return nRet;
}

strcpy_s(m_chPixelFormat, MV_MAX_SYMBOLIC_LEN, stPixelFormatInfo.chSymbolic);

return MV_OK;
 }

 
 // ch:按下链接相机
 void CMFCDlg::OnBnClickedConnect()
 {
CString strMsg;

m_ctrlDeviceCombo.ResetContent();
memset(&m_stDevList, 0, sizeof(MV_CC_DEVICE_INFO_LIST));

// ch:枚举子网内所有设备 | en:Enumerate all devices within subnet
int nRet = CMvCamera::EnumDevices(MV_GIGE_DEVICE | MV_USB_DEVICE, &m_stDevList);
if (MV_OK != nRet)
{
return;
}

// ch:将值加入到信息列表框中并显示出来 | en:Add value to the information list box and display
for (unsigned int i = 0; i < m_stDevList.nDeviceNum; i )
{
MV_CC_DEVICE_INFO* pDeviceInfo = m_stDevList.pDeviceInfo[i];
if (NULL == pDeviceInfo)
{
continue;
}

wchar_t* pUserName = NULL;
if (pDeviceInfo->nTLayerType == MV_GIGE_DEVICE)
{
int nIp1 = ((m_stDevList.pDeviceInfo[i]->SpecialInfo.stGigEInfo.nCurrentIp & 0xff000000) >> 24);
int nIp2 = ((m_stDevList.pDeviceInfo[i]->SpecialInfo.stGigEInfo.nCurrentIp & 0x00ff0000) >> 16);
int nIp3 = ((m_stDevList.pDeviceInfo[i]->SpecialInfo.stGigEInfo.nCurrentIp & 0x0000ff00) >> 8);
int nIp4 = (m_stDevList.pDeviceInfo[i]->SpecialInfo.stGigEInfo.nCurrentIp & 0x000000ff);

if (strcmp("", (LPCSTR)(pDeviceInfo->SpecialInfo.stGigEInfo.chUserDefinedName)) != 0)
{
DWORD dwLenUserName = MultiByteToWideChar(CP_ACP, 0, (LPCSTR)(pDeviceInfo->SpecialInfo.stGigEInfo.chUserDefinedName), -1, NULL, 0);
pUserName = new wchar_t[dwLenUserName];
MultiByteToWideChar(CP_ACP, 0, (LPCSTR)(pDeviceInfo->SpecialInfo.stGigEInfo.chUserDefinedName), -1, pUserName, dwLenUserName);
}
else
{
char strUserName[256] = { 0 };
sprintf_s(strUserName, 256, "%s %s (%s)", pDeviceInfo->SpecialInfo.stGigEInfo.chManufacturerName,
pDeviceInfo->SpecialInfo.stGigEInfo.chModelName,
pDeviceInfo->SpecialInfo.stGigEInfo.chSerialNumber);
DWORD dwLenUserName = MultiByteToWideChar(CP_ACP, 0, (LPCSTR)(strUserName), -1, NULL, 0);
pUserName = new wchar_t[dwLenUserName];
MultiByteToWideChar(CP_ACP, 0, (LPCSTR)(strUserName), -1, pUserName, dwLenUserName);
}
strMsg.Format(_T("[%d]GigE:    %s  (%d.%d.%d.%d)"), i, pUserName, nIp1, nIp2, nIp3, nIp4);
}
else if (pDeviceInfo->nTLayerType == MV_USB_DEVICE)
{
if (strcmp("", (char*)pDeviceInfo->SpecialInfo.stUsb3VInfo.chUserDefinedName) != 0)
{
DWORD dwLenUserName = MultiByteToWideChar(CP_ACP, 0, (LPCSTR)(pDeviceInfo->SpecialInfo.stUsb3VInfo.chUserDefinedName), -1, NULL, 0);
pUserName = new wchar_t[dwLenUserName];
MultiByteToWideChar(CP_ACP, 0, (LPCSTR)(pDeviceInfo->SpecialInfo.stUsb3VInfo.chUserDefinedName), -1, pUserName, dwLenUserName);
}
else
{
char strUserName[256] = { 0 };
sprintf_s(strUserName, 256, "%s %s (%s)", pDeviceInfo->SpecialInfo.stUsb3VInfo.chManufacturerName,
pDeviceInfo->SpecialInfo.stUsb3VInfo.chModelName,
pDeviceInfo->SpecialInfo.stUsb3VInfo.chSerialNumber);
DWORD dwLenUserName = MultiByteToWideChar(CP_ACP, 0, (LPCSTR)(strUserName), -1, NULL, 0);
pUserName = new wchar_t[dwLenUserName];
MultiByteToWideChar(CP_ACP, 0, (LPCSTR)(strUserName), -1, pUserName, dwLenUserName);
}
strMsg.Format(_T("[%d]UsbV3:  %s"), i, pUserName);
}
else
{
ShowErrorMsg(TEXT("Unknown device enumerated"), 0);
}
m_ctrlDeviceCombo.AddString(strMsg);

if (pUserName)
{
delete[] pUserName;
pUserName = NULL;
}
}

if (0 == m_stDevList.nDeviceNum)
{
ShowErrorMsg(TEXT("No device"), 0);
return;
}
m_ctrlDeviceCombo.SetCurSel(0);

EnableControls(TRUE);
 }
 
 // ch:按下打开相机
 void CMFCDlg::OnBnClickedOpemCam()
 {
if (TRUE == m_bOpenDevice || NULL != m_pcMyCamera)
{
return;
}
UpdateData(TRUE);

int nIndex = m_nDeviceCombo;
if ((nIndex < 0) | (nIndex >= MV_MAX_DEVICE_NUM))
{
ShowErrorMsg(TEXT("Please select device"), 0);
return;
}

// ch:由设备信息创建设备实例 | en:Device instance created by device information
if (NULL == m_stDevList.pDeviceInfo[nIndex])
{
ShowErrorMsg(TEXT("Device does not exist"), 0);
return;
}

m_pcMyCamera = new CMvCamera;
if (NULL == m_pcMyCamera)
{
return;
}

int nRet = m_pcMyCamera->Open(m_stDevList.pDeviceInfo[nIndex]);
if (MV_OK != nRet)
{
delete m_pcMyCamera;
m_pcMyCamera = NULL;
ShowErrorMsg(TEXT("Open Fail"), nRet);
return;
}

// ch:探测网络最佳包大小(只对GigE相机有效) | en:Detection network optimal package size(It only works for the GigE camera)
if (m_stDevList.pDeviceInfo[nIndex]->nTLayerType == MV_GIGE_DEVICE)
{
unsigned int nPacketSize = 0;
nRet = m_pcMyCamera->GetOptimalPacketSize(&nPacketSize);
if (nRet == MV_OK)
{
nRet = m_pcMyCamera->SetIntValue("GevSCPSPacketSize", nPacketSize);
if (nRet != MV_OK)
{
ShowErrorMsg(TEXT("Warning: Set Packet Size fail!"), nRet);
}
}
else
{
ShowErrorMsg(TEXT("Warning: Get Packet Size fail!"), nRet);
}
}

m_bOpenDevice = TRUE;

GetParmeter(); // ch:获取参数 | en:Get Parameter

//注册回调函数
nRet = m_pcMyCamera->RegisterImageCallBack(ImageCallBack, this);
if (nRet != MV_OK)
{

ShowErrorMsg(TEXT("Warning: Get Packet Size fail!"), nRet);
}
EnableControls(TRUE);
 }
 
 // ch:按下关闭按钮
 void CMFCDlg::OnBnClickedButton4()
 {
CloseDevice();
EnableControls(TRUE);
 }
 
 // ch:按下连续模式按钮 | en:Click Continues button
 void CMFCDlg::OnBnClickedContinusModeRadio()
 {
((CButton*)GetDlgItem(IDC_CONTINUS_MODE_RADIO))->SetCheck(TRUE);
((CButton*)GetDlgItem(IDC_TRIGGER_MODE_RADIO))->SetCheck(FALSE);
((CButton*)GetDlgItem(IDC_SOFTWARE_TRIGGER_CHECK))->EnableWindow(FALSE);
m_nTriggerMode = MV_TRIGGER_MODE_OFF;
int nRet = SetTriggerMode();
if (MV_OK != nRet)
{
return;
}
GetDlgItem(IDC_SOFTWARE_ONCE_BUTTON)->EnableWindow(FALSE);
 }

 // ch:按下触发模式按钮 | en:Click Trigger Mode button
 void CMFCDlg::OnBnClickedTriggerModeRadio()
 {
UpdateData(TRUE);
((CButton*)GetDlgItem(IDC_CONTINUS_MODE_RADIO))->SetCheck(FALSE);
((CButton*)GetDlgItem(IDC_TRIGGER_MODE_RADIO))->SetCheck(TRUE);
((CButton*)GetDlgItem(IDC_SOFTWARE_TRIGGER_CHECK))->EnableWindow(TRUE);
m_nTriggerMode = MV_TRIGGER_MODE_ON;
int nRet = SetTriggerMode();
if (MV_OK != nRet)
{
ShowErrorMsg(TEXT("Set Trigger Mode Fail"), nRet);
return;
}

//if (m_bStartGrabbing == TRUE)
{
if (true == m_bSoftWareTriggerCheck)
{
GetDlgItem(IDC_SOFTWARE_ONCE_BUTTON)->EnableWindow(TRUE);
}
}
 }


 // ch:按下开始采集按钮 | en:Click Start button
 void CMFCDlg::OnBnClickedStartGrabbingButton()
 {
if (FALSE == m_bOpenDevice || TRUE == m_bStartGrabbing || NULL == m_pcMyCamera)
{
return;
}

memset(&m_stImageInfo, 0, sizeof(MV_FRAME_OUT_INFO_EX));
m_bThreadState = TRUE;
unsigned int nThreadID = 0;


int nRet = m_pcMyCamera->StartGrabbing();
if (MV_OK != nRet)
{
m_bThreadState = FALSE;
ShowErrorMsg(TEXT("Start grabbing fail"), nRet);
return;
}

m_bStartGrabbing = TRUE;

EnableControls(TRUE);
 }

 // ch:按下结束采集按钮 | en:Click Stop button
 void CMFCDlg::OnBnClickedStopGrabbingButton()
 {
if (FALSE == m_bOpenDevice || FALSE == m_bStartGrabbing || NULL == m_pcMyCamera)
{
return;
}

m_bThreadState = FALSE;
if (m_hGrabThread)
{
WaitForSingleObject(m_hGrabThread, INFINITE);
CloseHandle(m_hGrabThread);
m_hGrabThread = NULL;
}

int nRet = m_pcMyCamera->StopGrabbing();
if (MV_OK != nRet)
{
ShowErrorMsg(TEXT("Stop grabbing fail"), nRet);
return;
}
m_bStartGrabbing = FALSE;
EnableControls(TRUE);
 }

 // ch:按下软触发按钮 | en:Click Software button
 void CMFCDlg::OnBnClickedSoftwareTriggerCheck()
 {
UpdateData(TRUE);

int nRet = SetTriggerSource();
if (nRet != MV_OK)
{
return;
}
EnableControls(TRUE);
 }

 // ch:按下软触发一次按钮 | en:Click Execute button
 void CMFCDlg::OnBnClickedSoftwareOnceButton()
 {
int nRet = m_pcMyCamera->CommandExecute("TriggerSoftware");
if (nRet != MV_OK)
{
ShowErrorMsg(TEXT("触发失败"), nRet);
}
 }

 // ch:按下获取参数按钮 | en:Click Get Parameter button
 void CMFCDlg::OnBnClickedGetParameterButton()
 {
int nRet = GetTriggerMode();
if (nRet != MV_OK)
{
ShowErrorMsg(TEXT("Get Trigger Mode Fail"), nRet);
}

nRet = GetExposureTime();
if (nRet != MV_OK)
{
ShowErrorMsg(TEXT("Get Exposure Time Fail"), nRet);
}

nRet = GetGain();
if (nRet != MV_OK)
{
ShowErrorMsg(TEXT("Get Gain Fail"), nRet);
}

nRet = GetFrameRate();
if (nRet != MV_OK)
{
ShowErrorMsg(TEXT("Get Frame Rate Fail"), nRet);
}

nRet = GetTriggerSource();
if (nRet != MV_OK)
{
ShowErrorMsg(TEXT("Get Trigger Source Fail"), nRet);
}

nRet = GetPixelFormat();
if (nRet != MV_OK)
{
ShowErrorMsg(TEXT("Get Pixel Format Fail"), nRet);
}

UpdateData(FALSE);
 }

// ch:按下设置参数按钮 | en:Click Set Parameter button
 void CMFCDlg::OnBnClickedSetParameterButton()
 {
UpdateData(TRUE);

bool bIsSetSucceed = true;
int nRet = SetExposureTime();
if (nRet != MV_OK)
{
bIsSetSucceed = false;
ShowErrorMsg(TEXT("Set Exposure Time Fail"), nRet);
}
nRet = SetGain();
if (nRet != MV_OK)
{
bIsSetSucceed = false;
ShowErrorMsg(TEXT("Set Gain Fail"), nRet);
}
nRet = SetFrameRate();
if (nRet != MV_OK)
{
bIsSetSucceed = false;
ShowErrorMsg(TEXT("Set Frame Rate Fail"), nRet);
}

if (true == bIsSetSucceed)
{
ShowErrorMsg(TEXT("Set Parameter Succeed"), nRet);
}
 }








 // ch:按下加载网络按钮 
 void CMFCDlg::OnBnClickedButLoadNet()
 {
LoadNet();
 }

 // ch:按下测试图片按钮 
 void CMFCDlg::OnBnClickedButton6()
 {
HObject Image;
dev_close_window_dict(hv_WindowDict);

AttachFromFile(Image);
if(ChackMode==8|| ChackMode == 1)//齿缺陷
ImageOkNgChack(Image);
if (ChackMode == 2||ChackMode == 1)//字符
ImageOcrChack(Image);
if (ChackMode == 4||ChackMode == 1)//划痕
ImageSemanticChack(Image);
 }




 // ch:设置OKNG颜色
 HBRUSH CMFCDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
 {
HBRUSH hbr = CDialogEx::OnCtlColor(pDC, pWnd, nCtlColor);

// TODO:  在此更改 DC 的任何特性
if (pWnd->GetDlgCtrlID() == IDC_STEXT)// IDC_Display为所选文本框ID
{
pDC->SetTextColor(RGB(0, 255, 0));//设置字体颜色 
pDC->SetBkColor(RGB(10, 10, 255));//设置背景颜色
// pDC->SetBkMode(TRANSPARENT);//设置背景透明
return HBRUSH(GetStockObject(HOLLOW_BRUSH));
}
return hbr;
 }

 // ch:加载网络程序
 void CMFCDlg::LoadNet()
 {
//////////////////ok NG///////////////////////////
try {
ShowMsg("加载网络!\r\n");
CreateDict(&hv_DLSample_okng);

ReadDict("../image/okng/model_opt.hdict", HTuple(), HTuple(), &hv_okngDLPreprocessParam);
//读入学习的网络模版及权重
ReadDlModel("../image/okng/model_opt.hdl", &hv_DLOKNGModelHandle);

//请选择CPU设备。
QueryAvailableDlDevices((HTuple("runtime").Append("runtime")), (HTuple("gpu").Append("cpu")),
&hv_DLDeviceHandles);
if (0 != (int((hv_DLDeviceHandles.TupleLength()) == 0)))
{
throw HException("No supported device found to continue this example.");
}
//由于query_available_dl_devices中使用的筛选器,第一个设备是GPU(如果可用)。
hv_DLDevice = ((const HTuple&)hv_DLDeviceHandles)[0];
//
//使用的批处理大小
SetDlModelParam(hv_DLOKNGModelHandle, "device", hv_DLDevice);

//检索class_name和class_id以进行可视化。并将它们编入词典
GetDlModelParam(hv_DLOKNGModelHandle, "meta_data", &hv_MetaData);

hv_InferenceClassificationThreshold = (hv_MetaData.TupleGetDictTuple("anomaly_classification_threshold")).TupleNumber();
hv_InferenceSegmentationThreshold = (hv_MetaData.TupleGetDictTuple("anomaly_segmentation_threshold")).TupleNumber();
CreateDict(&hv_DLDatasetInfo);
SetDictTuple(hv_DLDatasetInfo, "class_names", (HTuple("ok").Append("nok")));
SetDictTuple(hv_DLDatasetInfo, "class_ids", (HTuple(0).Append(1)));
CreateDict(&hv_WindowDict);

//为每个图像生成一个数据字典
ShowMsg("okng网络加载完成\r\n");
}
catch (...)
{
ShowMsg("okng网络加载失败\r\n");
};

//推理是基于使用Deep OCR操作符集。

try 
{

CreateDeepOcr(HTuple(), HTuple(), &hv_DLOCRModelHandle);
//
hv_BestModelDeepOCRFilename = HTuple("../mfc/image/ocr") "/model_opt.hdl";
ReadDeepOcr(hv_BestModelDeepOCRFilename, &hv_DLOCRModelHandle);

hv_DeviceRuntime.Clear();
hv_DeviceRuntime[0] = "gpu";
hv_DeviceRuntime[1] = "cpu";
QueryAvailableDlDevices(HTuple(hv_DeviceRuntime.TupleLength(), "runtime"), hv_DeviceRuntime,
&hv_DLDeviceHandles);
if (0 != (int((hv_DLDeviceHandles.TupleLength()) == 0)))
{
throw HException(//'找不到支持的设备来继续此示例.'
"No supported device found to continue this example");
}
//选择第一个设备。
hv_DLDevice = ((const HTuple&)hv_DLDeviceHandles)[1];

SetDeepOcrParam(hv_DLOCRModelHandle, "detection_batch_size", 1);
SetDeepOcrParam(hv_DLOCRModelHandle, "device", hv_DLDevice);

//hv_WindowHandle = HTuple();



ShowMsg("ocr网络加载完成\r\n");

}
catch (...)
{
ShowMsg("ocr网络加载失败\r\n");
}

////////////划痕/////////////

try
{
hv_RetrainedModelFileName = HTuple("../image/scrach") "/best_dl_model_segmentation.hdl";
 
hv_PreprocessParamFileName = HTuple("../image/scrach") "/dl_preprocess_param.hdict";

//ShowMsg("加载网络!\r\n");
ReadDlModel(hv_RetrainedModelFileName, &hv_DLModelHandle);
//ShowMsg("选择执行器!\r\n");
//SetDlModelParam(hv_DLModelHandle, "runtime", "gpu");
// ShowMsg("执行器ok!\r\n");
//校验GPU是否可以使用
QueryAvailableDlDevices((HTuple("runtime").Append("runtime")), (HTuple("gpu").Append("cpu")), &hv_DLDeviceHandles);
// ShowMsg("c\r\n");
if (0 != (int((hv_DLDeviceHandles.TupleLength()) == 0)))
{
ShowMsg("没有设备运行程序!\r\n");
}
//设置运行设备

hv_DLDevice = ((const HTuple&)hv_DLDeviceHandles)[0];

hv_ClassNames.Clear();
hv_ClassNames[0] = "OK";
hv_ClassNames[1] = "NG";
hv_ClassIDs.Clear();
hv_ClassIDs[0] = 0;
hv_ClassIDs[1] = 1;

//读取训练好的模型

ReadDict(hv_PreprocessParamFileName, HTuple(), HTuple(), &hv_DLPreprocessParam);



//设置批处理量为1,(将每张图片做为单次处理).
SetDlModelParam(hv_DLModelHandle, "batch_size", 1);

//
//初始化部署推理模型.
SetDlModelParam(hv_DLModelHandle, "device", hv_DLDevice);
//SetDlModelParam(hv_DLModelHandle, "runtime", "cpu");
//
//获取预处理参数.

ShowMsg("scrach网络加载完成\r\n");
}
catch (...)
{
//St_numb.SetWindowText("class_names");
ShowMsg("scrach网络加载失败\r\n");
};

 }

 // ch0:检测程序
 BOOL CMFCDlg::ImageOkNgChack(HObject Image)
 {
 
HTuple  hv_Tmp_Ctrl_Dict_Init, hv_Width, hv_Height;

CString str;

CString strDir;
// time_t timer0;//系统时间
CString temp;//序号或者时间
CString FilePath = _T("..\\config\\config.ini");


//strDir.Format(_T("D:\\NG_Image"));

ShowMsg("okng识别中\r\n");
try{
// DispObj(Image, HV_WindowHandle);

check_numb ;
str.Format(_T("%d"), check_numb);
Check_Num.SetWindowText(str);
// DispObj(Image, HV_WindowHandle);
//把图像装入字典
 
SetDictObject(Image, hv_DLSample_okng, "image");


//格式化图片使其和训练的一样,异常判断还是种类选择,图像大小,通道数,色彩范围,归一化,查找范围
preprocess_dl_samples(hv_DLSample_okng, hv_okngDLPreprocessParam);
//对预处理后的图像进行判断
ApplyDlModel(hv_DLOKNGModelHandle, hv_DLSample_okng, HTuple(), &hv_DLResult);
//
//用学习过的阈值推断结果。
threshold_dl_anomaly_results(hv_InferenceSegmentationThreshold, hv_InferenceClassificationThreshold,
hv_DLResult);
//写出结果

//WriteString(HV_WindowHandle, "Result: " (hv_DLResult.TupleGetDictTuple("anomaly_class")));
GetImageSize(Image, &hv_Width, &hv_Height);
SetPart(HV_WindowHandle, 0, 0, hv_Width, hv_Height);
DispObj(Image, HV_WindowHandle);

//Display the inference result.

#ifdef SHOW_Result
dev_display_dl_data(hv_DLSample_okng, hv_DLResult, hv_DLDatasetInfo, (HTuple("anomaly_result").Append("anomaly_image")),
HTuple(), hv_WindowDict);
#endif
CString str1;
CreateDict(&hv_Tmp_Ctrl_Dict_Init);


SetDictTuple(hv_Tmp_Ctrl_Dict_Init, "comp", "ok");
if (0 != ((hv_DLResult.TupleConcat(hv_Tmp_Ctrl_Dict_Init)).TupleTestEqualDictItem("anomaly_class", "comp")))
{
str1 = "OK";
ok_num ;
str.Format(_T("%d"), ok_num);
OK_num.SetWindowText(str);
}
else
{
str1 = "NG";
ng_num ;
str.Format(_T("%d"), ng_num);
NG_num.SetWindowText(str);
}
hv_Tmp_Ctrl_Dict_Init = HTuple::TupleConstant("HNULL");


//str1 = (CString)(hv_DLResult.TupleGetDictTuple("anomaly_class"));
//str1 = hv_DLResult
//str1 = "OK";
St_numb.SetWindowText(str1);

ShowMsg("okng识别完成\r\n");
 }
 //catch (...)
 //{
// ShowMsg("识别出错");
 //}
 catch (HException& exception)
 {
fprintf(stderr, "  Error #%u in %s: %s\n", exception.ErrorCode(),
exception.ProcName().TextA(),
exception.ErrorMessage().TextA());
ShowMsg(exception.ErrorMessage().TextA());
 }
return false;
 }

 // ch1:字符检测程序
 void CMFCDlg::ImageOcrChack(HObject Image)
 {
HTuple  hv_ocr_words, hv_ocr_word;
HTuple hv_Length;

HTuple hv_Width, hv_Height;
CString str;

try {
ShowMsg("ocr开始识别");
ApplyDeepOcr(Image, hv_DLOCRModelHandle, HTuple(), &hv_DeepOcrResult);
GetImageSize(Image, &hv_Width, &hv_Height);
SetPart(HV_WindowHandle, 0, 0, hv_Width, hv_Height);
DispObj(Image, HV_WindowHandle);

// if (0 != (int((HV_WindowHandle.TupleLength()) == 0)))
// {
 
// dl_ocr.dev_open_window_fit_image(Image, 0, 0, -1, -1, &HV_WindowHandle);
// }
// dl_ocr.dev_display_deep_ocr_results(Image, HV_WindowHandle, hv_DeepOcrResult, HTuple(), HTuple());

GetDictTuple(hv_DeepOcrResult, "words", &hv_ocr_words);

GetDictTuple(hv_ocr_words, "word", &hv_ocr_word);

TupleLength(hv_ocr_word, &hv_Length);
for(int a=0;a< hv_Length[0].I(); a )
{
CString strBuffer = hv_ocr_word[a].S();//  hv_DecodedDataStrings[0].S();
ShowMsg(strBuffer);
//ShowMsg("图像识别中\r\n");
 
}

#ifdef SHOW_Result
dev_display_deep_ocr_results(Image, HV_WindowHandle, hv_DeepOcrResult, HTuple(),
HTuple());
#endif
ShowMsg("ocr识别完成");


 



}
//catch (...)
//{
// ShowMsg("识别出错");
//}
catch (HException& exception)
{
fprintf(stderr, "  Error #%u in %s: %s\n", exception.ErrorCode(),
exception.ProcName().TextA(),
exception.ErrorMessage().TextA());
ShowMsg(exception.ErrorMessage().TextA());
}



 }
 // ch3:划痕检测程序
 BOOL CMFCDlg::ImageSemanticChack(HObject Image)
 {

HObject  ho_SegmentationImage, ho_ImageR, ho_ImageG, ho_ImageB, ho_MultiChannelImage1, ho_Region_Tu;
HObject  ho_Contours, ho_SelectedXLD;
HObject  ho_ROI_0, ho_ImageReduced, ho_Region;
// Local control variables
HTuple  hv_WindowHandle, hv_AllDir, hv_RetrainedModelFileName;
HTuple  hv_PreprocessParamFileName, hv_DLDeviceHandles;
HTuple  hv_DLDevice, hv_ClassNames, hv_ClassIDs;
HTuple  hv_ImageFiles, hv_Index, hv_DLSampleBatch;
HTuple  hv_DLResultBatch;
HTuple  hv_Number, hv_Width, hv_Height;
HTuple  hv_Row1, hv_Col, hv_bie;


CString str;

//CString strDir;
// time_t timer0;//系统时间
CString temp;//序号或者时间
CString FilePath = _T("..\\config\\config.ini");


//strDir.Format(_T("D:\\NG_Image"));

ShowMsg("划痕缺陷识别中\r\n");

check_numb ;
str.Format(_T("%d"), check_numb);
Check_Num.SetWindowText(str);
// hv_bie[0] = bie_zoom;
try
{
ClearWindow(HV_WindowHandle);
// GenRectangle1(&ho_ROI_0, 845, 525, 1510, 1135);

  //ReduceDomain(Image, ho_ROI_0, &ho_ImageReduced);
// CropDomain(ho_ImageReduced, &ho_ImageReduced);
GetImageSize(Image, &hv_Width, &hv_Height);

SetPart(HV_WindowHandle, 0, 0, hv_Width, hv_Height);

// ZoomImageSize(Image, &ho_ImageZoom, hv_Width / 2, hv_Height / 2, "constant");
DispObj(Image, HV_WindowHandle);
if (1)
//生成图像模型

{
Alg.gen_dl_samples_from_images(Image, &hv_DLSampleBatch);

//
//预处理图像模型
Alg.preprocess_dl_samples(hv_DLSampleBatch, hv_DLPreprocessParam);

//
//将学习模型,应用到图像模型中
ApplyDlModel(hv_DLModelHandle, hv_DLSampleBatch, (HTuple("segmentation_image").Append("segmentation_confidence")), &hv_DLResultBatch);

//获取预处理图像
GetDictObject(&Image, hv_DLSampleBatch, "image");

//获取结果图像
GetDictObject(&ho_SegmentationImage, hv_DLResultBatch, "segmentation_image");

//获取1号缺陷
Threshold(ho_SegmentationImage, &ho_Region_Tu, 1, 1);

// DispObj(ho_Region_Tu, HV_WindowHandle);
GetImageSize(ho_SegmentationImage, &hv_Width, &hv_Height);

SetPart(HV_WindowHandle, 0, 0, hv_Width, hv_Height);

GenContourRegionXld(ho_Region_Tu, &ho_Contours, "border");

SelectShapeXld(ho_Contours, &ho_SelectedXLD, "area", "and", 0, 999999);

CountObj(ho_SelectedXLD, &hv_Number);
}
if (0 != (int(hv_Number > 0)))
{
/* GetContourXld(ho_SelectedXLD, &hv_Row1, &hv_Col);
  GenRegionPolygon(&ho_Region, hv_Row1, hv_Col);
  //region绘制在图像
  PaintRegion(ho_Region, ho_ImageReduced, &ho_ImageR, 255, "fill");
  PaintRegion(ho_Region, ho_ImageReduced, &ho_ImageG, 0, "fill");
  PaintRegion(ho_Region, ho_ImageReduced, &ho_ImageB, 0, "fill");
  Compose3(ho_ImageR, ho_ImageG, ho_ImageB, &ho_MultiChannelImage1);*/
SetColor(HV_WindowHandle, "red");

DispObj(ho_SelectedXLD, HV_WindowHandle);

// ShowMsg("NG\r\n");

// St_numb.SetWindowText("NG");
ShowMsg("划痕缺陷识别完成\r\n");
return FALSE;
}
else
{
// St_numb.SetWindowText("OK");
return TRUE;
}




ShowMsg("sap识别完成\r\n");
}

//catch (...)
//{
// ShowMsg("识别出错");
//}
catch (HException& exception)
{
fprintf(stderr, "  Error #%u in %s: %s\n", exception.ErrorCode(),
exception.ProcName().TextA(),
exception.ErrorMessage().TextA());
ShowMsg(exception.ErrorMessage().TextA());
return false;
}
 }



 // ch:加载图像程序
 bool CMFCDlg::AttachFromFile(HObject& Image)
 {
// TODO: 在此处添加实现代码.
HObject Image1;
HObject EmptyObject;
HTuple IsEqual;
TCHAR szFilter[] = _T("Bitmap Files(*.bmp)|*.bmp||");

// CFileDialog openfile(TRUE, NULL, NULL,OFN_HIDEREADONLY||OFN_OVERWRITEPROMPT, szFilter, this,0,true);
CFileDialog openfile(TRUE, _T("bmp"), NULL, 0, szFilter, this);
if (openfile.DoModal() == IDOK)
{
// return false;
try
{

 
ReadImage(&Image, HTuple(openfile.GetPathName()));
GenEmptyObj(&EmptyObject);
TestEqualObj(Image, EmptyObject, &IsEqual);
}
catch (HException& exception)
{
fprintf(stderr, "  Error #%u in %s: %s\n", exception.ErrorCode(),
exception.ProcName().TextA(),
exception.ErrorMessage().TextA());
ShowMsg(exception.ErrorMessage().TextA());
return false;
}
//DispObj(Image, HV_WindowHandle);
if (0 != (IsEqual != 1))
{
return true;
}

return false;
}
return false;
 }

 // ch:保存图像程序 
 void CMFCDlg::SaveImage(CString str, HObject Image)
 {
char buffer[128] = { 0 };
strcpy(buffer, str.GetBuffer());
DispObj(Image, HV_WindowHandle);

WriteImage(Image, "bmp", 0, buffer);
return;
 }

 // ch:按下保存按钮 
 void CMFCDlg::OnBnClickedButSavedate()
 {
CString FilePath = "..\\config\\config.ini";
CString str;
str.Format("%.d", check_numb);
WritePrivateProfileString("SYSTEM", "拍照总数", str, FilePath);//结果:

str.Format("%.d", ok_num);
WritePrivateProfileString("SYSTEM", "OK总数", str, FilePath);//结果:

str.Format("%.d", ng_num);
WritePrivateProfileString("SYSTEM", "NG总数", str, FilePath);//结果:


 }

 // ch:读取数据
 int CMFCDlg::Read_Date()
 {
CString FilePath = "..\\config\\config.ini";

check_numb = GetPrivateProfileInt("SYSTEM", "拍照总数", 0, FilePath);
ok_num = GetPrivateProfileInt("SYSTEM", "OK总数", 0, FilePath);
ng_num = GetPrivateProfileInt("SYSTEM", "NG总数", 0, FilePath);

return 0;
 }


  // ch:创建文件夹
 void CMFCDlg::CreateDir(CString strDir)
 {
CFileStatus fs;
int i = 0;
if (!CFile::GetStatus(strDir, fs))
{
bool created = false;
while (!created && i < 10)
{
created = (_mkdir(strDir) == 0 ? true : false);
if (!created)
Sleep(5);
i ;
}
}
if (i == 10)
return;
 }

 // ch:按下清除数据按钮 
 void CMFCDlg::OnBnClickedButcleardate()
 {
CString FilePath = "..\\config\\config.ini";
CString strDir;
CString str;
check_numb = 0;
ok_num = 0;
ng_num = 0;

strDir.Format(_T("D:\\NG_Image"));

Show_Date();
 
str.Format("%.d", check_numb);
WritePrivateProfileString("SYSTEM", "拍照总数", str, FilePath);//结果:

str.Format("%.d", ok_num);
WritePrivateProfileString("SYSTEM", "OK总数", str, FilePath);//结果:

str.Format("%.d", ng_num);
WritePrivateProfileString("SYSTEM", "NG总数", str, FilePath);//结果:

DeleteDirectory(strDir);
 }



 // ch:删除文件夹
 void CMFCDlg::DeleteDirectory(CString strDir)
 {
if (strDir.IsEmpty())
{
RemoveDirectory(strDir);
return;
}
//**************首先删除文件及子文件夹*******************   
CFileFind ff;
BOOL bFound = ff.FindFile(strDir "\\*", 0);
while (bFound)
{
bFound = ff.FindNextFile();
CString temp = ff.GetFileName();
if (ff.GetFileName() == "." || ff.GetFileName() == "..")
continue;

//**************去掉文件(夹)只读等属性   
SetFileAttributes(ff.GetFilePath(), FILE_ATTRIBUTE_NORMAL);

if (ff.IsDirectory())
{
//**************递归删除子文件夹   
DeleteDirectory(ff.GetFilePath());
RemoveDirectory(ff.GetFilePath());;
}
else
{
::DeleteFile(ff.GetFilePath().GetBuffer(ff.GetFilePath().GetLength()));   //   删除文件   
}
}
ff.Close();
//**************然后删除该文件夹**************
RemoveDirectory(strDir);
return;
 }


 // ch:文本框显示数据 
 void CMFCDlg::Show_Date()
 {
CString str;

str.Format(_T("%d"), check_numb);
Check_Num.SetWindowText(str);

str.Format(_T("%d"), ok_num);
OK_num.SetWindowText(str);

str.Format(_T("%d"), ng_num);
NG_num.SetWindowText(str);
 }

 // ch:消息列表显示数据 
 void CMFCDlg::ShowMsg(CString strMsg)
 {
if (strMsg)
{
}
SYSTEMTIME time;
GetLocalTime(&time);
CString temp;

//temp.Format("[%d-%d-%d %d:%d:%d:%d]", time.wYear, time.wMonth, time.wDay, time.wHour, time.wMinute, time.wSecond, time.wMilliseconds);
temp.Format("[%d:%d:%d]",  time.wMinute, time.wSecond, time.wMilliseconds);
temp = "  ";
temp = strMsg;
m_ctrlMsgListBox.AddString(temp);
m_ctrlMsgListBox.RedrawWindow();
m_ctrlMsgListBox.SendMessage(WM_VSCROLL, SB_PAGEDOWN, 0);

if (m_ctrlMsgListBox.GetCount() > 100)
m_ctrlMsgListBox.ResetContent();
 }


 void CMFCDlg::OnBnClickedAutoModeRadio()
 {
// TODO: 在此添加控件通知处理程序代码
UpdateData();
CString ButtonText;
((CButton*)GetDlgItem(IDC_AUTO_MODE_RADIO))->SetCheck(TRUE);
((CButton*)GetDlgItem(IDC_OCR_MODE_RADIO))->SetCheck(FALSE);
((CButton*)GetDlgItem(IDC_SCRATCH_MODE_RADIO))->SetCheck(FALSE);
((CButton*)GetDlgItem(IDC_GEAR_MODE_RADIO))->SetCheck(FALSE);


ChackMode = 1;
this->GetDlgItemTextA(IDC_AUTO_MODE_RADIO , ButtonText);
MessageBox(ButtonText);
 }


 void CMFCDlg::OnBnClickedOcrModeRadio()
 {
((CButton*)GetDlgItem(IDC_AUTO_MODE_RADIO))->SetCheck(FALSE);
((CButton*)GetDlgItem(IDC_OCR_MODE_RADIO))->SetCheck(TRUE);
((CButton*)GetDlgItem(IDC_SCRATCH_MODE_RADIO))->SetCheck(FALSE);
((CButton*)GetDlgItem(IDC_GEAR_MODE_RADIO))->SetCheck(FALSE);
ChackMode = 2;

 }


 void CMFCDlg::OnBnClickedScratchModeRadio()
 {
((CButton*)GetDlgItem(IDC_AUTO_MODE_RADIO))->SetCheck(FALSE);
((CButton*)GetDlgItem(IDC_OCR_MODE_RADIO))->SetCheck(FALSE);
((CButton*)GetDlgItem(IDC_SCRATCH_MODE_RADIO))->SetCheck(TRUE);
((CButton*)GetDlgItem(IDC_GEAR_MODE_RADIO))->SetCheck(FALSE);
ChackMode = 4;
 }


 void CMFCDlg::OnBnClickedGearModeRadio()
 {
((CButton*)GetDlgItem(IDC_AUTO_MODE_RADIO))->SetCheck(FALSE);
((CButton*)GetDlgItem(IDC_OCR_MODE_RADIO))->SetCheck(FALSE);
((CButton*)GetDlgItem(IDC_SCRATCH_MODE_RADIO))->SetCheck(FALSE);
((CButton*)GetDlgItem(IDC_GEAR_MODE_RADIO))->SetCheck(TRUE);
ChackMode = 8;
 }


 void CMFCDlg::OnBnClickedButton1()
 {
CMFCDlg Cmfcdlg;
if (!Cmfcdlg.JNSPLC.IsOpen())
{
Cmfcdlg.JNSPLC.Open(IP.c_str(), 8501);
}
if (Cmfcdlg.JNSPLC.IsOpen())
{
int a;
if (1 == 1)  a = 0;
else a = 1;
int* WritePlcdate1 = &a;
Cmfcdlg.JNSPLC.PLCWrite(WritePlcdate1, 1, 1, 5000);//  write_data,len,type,start_addr
}
 }




 void CMFCDlg::OnClose()
 {
// TODO: 在此添加消息处理程序代码和/或调用默认值
if (0 != (int((hv_WindowDict.TupleLength()) != 0)))
{
dev_close_window_dict(hv_WindowDict);
}
CDialogEx::OnClose();
 }


实例下载地址

基于HALCON的AI图像处理,完整版哦

不能下载?内容有错? 点击这里报错 + 投诉 + 提问

好例子网口号:伸出你的我的手 — 分享

网友评论

发表评论

(您的评论需要经过审核才能显示)

查看所有0条评论>>

小贴士

感谢您为本站写下的评论,您的评论对其它用户来说具有重要的参考价值,所以请认真填写。

  • 类似“顶”、“沙发”之类没有营养的文字,对勤劳贡献的楼主来说是令人沮丧的反馈信息。
  • 相信您也不想看到一排文字/表情墙,所以请不要反馈意义不大的重复字符,也请尽量不要纯表情的回复。
  • 提问之前请再仔细看一遍楼主的说明,或许是您遗漏了。
  • 请勿到处挖坑绊人、招贴广告。既占空间让人厌烦,又没人会搭理,于人于己都无利。

关于好例子网

本站旨在为广大IT学习爱好者提供一个非营利性互相学习交流分享平台。本站所有资源都可以被免费获取学习研究。本站资源来自网友分享,对搜索内容的合法性不具有预见性、识别性、控制性,仅供学习研究,请务必在下载后24小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明

;
报警