实例介绍
【实例简介】集成了3类AI 字符,缺陷和语义分割
【实例截图】
【核心代码】
// 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();
}
【实例截图】

【核心代码】
// 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();
}
好例子网口号:伸出你的我的手 — 分享!
小贴士
感谢您为本站写下的评论,您的评论对其它用户来说具有重要的参考价值,所以请认真填写。
- 类似“顶”、“沙发”之类没有营养的文字,对勤劳贡献的楼主来说是令人沮丧的反馈信息。
- 相信您也不想看到一排文字/表情墙,所以请不要反馈意义不大的重复字符,也请尽量不要纯表情的回复。
- 提问之前请再仔细看一遍楼主的说明,或许是您遗漏了。
- 请勿到处挖坑绊人、招贴广告。既占空间让人厌烦,又没人会搭理,于人于己都无利。
关于好例子网
本站旨在为广大IT学习爱好者提供一个非营利性互相学习交流分享平台。本站所有资源都可以被免费获取学习研究。本站资源来自网友分享,对搜索内容的合法性不具有预见性、识别性、控制性,仅供学习研究,请务必在下载后24小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明
网友评论
我要评论