#include "StdAfx.h" #include "CameraHawkvis.h" #include "Propertie.h" #include "PropertieMgr.h" #include "LogMgr.h" #include "AuthorityMgr.h" #include "GlobalFunction.h" #include "ExceptionMsg.h" #include "FileMgr.h" #include "CStringFuc.h" #define RESULT_CNT 10 //抓取最多的模板个数 CCameraHawkvis *gCameraHawkvis = new CCameraHawkvis; CCameraHawkvis::CCameraHawkvis(void) { m_nExpore = 80000;//曝光值 m_bOpen = false;//相机是否打开 m_bRotate180 = true;//画面是否旋转180度 m_bMirrorH = false;//水平镜像 m_bMirrorV = false;//垂直镜像 } CCameraHawkvis::~CCameraHawkvis(void) { } CMFCPropertyGridProperty *CCameraHawkvis::CreatGridProperty() { CString PropertyName;//属性名称 CString Description;//描述 CString Path = _T("HawkvisCCD");;//存储路径 CString Name; //-------------------------------------------------------------------------------// PropertyName = _T("CCD "); CMFCPropertyGridProperty* pGroup = new CMFCPropertyGridProperty(PropertyName); //先把共同设定加进来 CMFCPropertyGridProperty* pBase = CCamera::CreatGridProperty(); pGroup->AddSubItem(pBase); PropertyName = _T("特殊设定"); CMFCPropertyGridProperty* pGroup1 = new CMFCPropertyGridProperty(PropertyName); if(gAuthorityMgr->CheckAuthority(_FACTORY)) { { //添加属性变量映射 Name = _T("m_bRotate180");//变量名字 CPropertie *pPropertie = new CPropertie; pPropertie->SetpVal((void*)&m_bRotate180); pPropertie->SetType(_PROP_TYPE_BOOL); pPropertie->SetpModule(this); pPropertie->SetPath(Path); pPropertie->SetName(Name); pPropertie->WriteRead(true);//读取保存的属性 //添加属性显示 PropertyName = _T("旋转180 度"); Description = _T("相机的画面是否旋转180 度"); CMFCPropertyGridProperty* p1 = new CMFCPropertyGridProperty(PropertyName, (_variant_t)m_bRotate180, Description); pGroup1->AddSubItem(p1); gDevicePropertieMgr.Insert(p1, pPropertie); } { //添加属性变量映射 Name = _T("m_nExpore");//变量名字 CPropertie *pPropertie = new CPropertie; pPropertie->SetpVal((void*)&m_nExpore); pPropertie->SetType(_PROP_TYPE_INT); pPropertie->SetpModule(this); pPropertie->SetPath(Path); pPropertie->SetName(Name); pPropertie->WriteRead(true);//读取保存的属性 //添加属性显示 PropertyName = _T("曝光值"); Description = _T("相机的曝光值(0~2000000)"); CMFCPropertyGridProperty* p1 = new CMFCPropertyGridProperty(PropertyName, (_variant_t)m_nExpore, Description); pGroup1->AddSubItem(p1); gDevicePropertieMgr.Insert(p1, pPropertie); } { //添加属性变量映射 Name = _T("m_bMirrorH");//变量名字 CPropertie *pPropertie = new CPropertie; pPropertie->SetpVal((void*)&m_bMirrorH); pPropertie->SetType(_PROP_TYPE_BOOL); pPropertie->SetpModule(this); pPropertie->SetPath(Path); pPropertie->SetName(Name); pPropertie->WriteRead(true);//读取保存的属性 //添加属性显示 PropertyName = _T("水平镜像"); Description = _T("水平镜像"); CMFCPropertyGridProperty* p1 = new CMFCPropertyGridProperty(PropertyName, (_variant_t)m_bMirrorH, Description); pGroup1->AddSubItem(p1); gDevicePropertieMgr.Insert(p1, pPropertie); } { //添加属性变量映射 Name = _T("m_bMirrorV");//变量名字 CPropertie *pPropertie = new CPropertie; pPropertie->SetpVal((void*)&m_bMirrorV); pPropertie->SetType(_PROP_TYPE_BOOL); pPropertie->SetpModule(this); pPropertie->SetPath(Path); pPropertie->SetName(Name); pPropertie->WriteRead(true);//读取保存的属性 //添加属性显示 PropertyName = _T("垂直镜像"); Description = _T("垂直镜像"); CMFCPropertyGridProperty* p1 = new CMFCPropertyGridProperty(PropertyName, (_variant_t)m_bMirrorV, Description); pGroup1->AddSubItem(p1); gDevicePropertieMgr.Insert(p1, pPropertie); } pGroup->AddSubItem(pGroup1); } return pGroup; } void CCameraHawkvis::ExportPar(ofstream *pFile) { CCamera::ExportPar(pFile); (*pFile)<<"[模块] [CCameraHawkvis]------------------------------------------------"<m_DlgHawkvisCamera.m_HawkvisCtrl); #if 0//def __HAWKVIS_MINDVISION_CCD__ //相机镜像 m_HawkvisCtrl->MV_SetReversal(0,m_bMirrorH);//水平方向 m_HawkvisCtrl->MV_SetReversal(1,m_bMirrorV);//垂直方向 //检查设置成功了没有 BOOL bMirrorH,bMirrorV; m_HawkvisCtrl->MV_GetReversal(0,&bMirrorH); m_HawkvisCtrl->MV_GetReversal(1,&bMirrorV); gLogMgr->WriteDebugLog("Hawkvis : MV_GetReversal : bMirrorH = "+Bool2Str(bMirrorH)); gLogMgr->WriteDebugLog("Hawkvis : MV_GetReversal : bMirrorV = "+Bool2Str(bMirrorV)); #endif } //打开相机 bool CCameraHawkvis::OpenCamera() { if(gLogMgr->IsDebuging())//调试状态 return true; return true; /* #ifdef __HAWKVIS_MINDVISION_CCD__ //m_HawkvisCtrl->MV_CloseCamera(); #else m_HawkvisCtrl->HV_CloseCamera(); #endif //gLogMgr->WriteDebugLog("Hawkvis : Close Cam"); #ifdef __HAWKVIS_MINDVISION_CCD__ if(m_HawkvisCtrl->MV_OpenCamera()) #else if(m_HawkvisCtrl->HV_OpenCamera()) #endif { gLogMgr->WriteDebugLog("Hawkvis : Open Cam ---->OK"); m_bOpen = true; OpenTemp();//读取模板 //设置曝光值 #ifdef __HAWKVIS_MINDVISION_CCD__ m_HawkvisCtrl->MV_SetCameraExpTime(m_nExpore); #else m_HawkvisCtrl->HV_SetCameraExpTime(m_nExpore); #endif return true; } else { gLogMgr->WriteDebugLog("Hawkvis : Open Cam ---->ERR"); return false; }*/ } //抓取(返回像素坐标) (一次只抓取一个mark 图形) bool CCameraHawkvis::CatchPoint(Dbxy &pt) { if(!m_bUse) return false; //清除之前绘制的圆 m_HawkvisCtrl->ClearGraphicObject(); //抓取一帧 #ifdef __HAWKVIS_MINDVISION_CCD__ if(!m_HawkvisCtrl->MV_GetOneFrame()) #else if(!m_HawkvisCtrl->HV_GetOneFrame()) #endif { CString str = _T("func : Hawkvis Get One Frame----->Error"); CExceptionMsg Msg; Msg.SetMsg(str); throw Msg; } Sleep(m_CatchWaitDelay);//等待数据结果输出到ocx 控件上 //模板查找 double pdbX[10], pdbY[10], pdbAngles[10], pdbScale[10], pdbSore[10]; long nCount[1] = { 1 }; //FindShapeMode 控件的模板查找函数。 //第一个参数,金字塔层数,取值范围1~5 //第二个参数,输出查找到的目标列坐标 //第三个参数,输出查找到的目标行坐标 //第四个参数,输出查找到的目标角度 //第五个参数,输出查找到的目标伸缩度 //第六个参数,输出查找到的目标分数 //第七个参数,输出查找到的目标个数 //第八个参数,输入查找模板的ID号 VARIANT *v_pdbX = new VARIANT[1]; VARIANT *v_pdbY = new VARIANT[1]; VARIANT *v_pdbAngles = new VARIANT[1]; VARIANT *v_pdbScale = new VARIANT[1]; VARIANT *v_pdbSore = new VARIANT[1]; bool ret = m_HawkvisCtrl->FindShapeModel(0, v_pdbY, v_pdbX, v_pdbAngles, v_pdbScale, v_pdbSore, nCount); if(!ret)//2018-01-15 增加保护,否则下面可能会报错 { CString str = _T("func : Hawkvis Find Shape Model----->Error"); CExceptionMsg Msg; Msg.SetMsg(str); throw Msg; } //pdbX for (long index = 0; index < ::SafeArrayGetElemsize(v_pdbX->parray); ++index){ ::SafeArrayGetElement(v_pdbX->parray, &index, pdbX + index); } //pdbY for (long index = 0; index < ::SafeArrayGetElemsize(v_pdbY->parray); ++index){ ::SafeArrayGetElement(v_pdbY->parray, &index, pdbY + index); } //pdbAngles for (long index = 0; index < ::SafeArrayGetElemsize(v_pdbAngles->parray); ++index){ ::SafeArrayGetElement(v_pdbAngles->parray, &index, pdbAngles + index); } //pdbScale for (long index = 0; index < ::SafeArrayGetElemsize(v_pdbScale->parray); ++index){ ::SafeArrayGetElement(v_pdbScale->parray, &index, pdbScale + index); } //pdbSore for (long index = 0; index < ::SafeArrayGetElemsize(v_pdbSore->parray); ++index){ ::SafeArrayGetElement(v_pdbSore->parray, &index, pdbSore + index); } //显示查找到的模板的位置 #if 1 CString str; str.Format("X: %0.3f, Y:%0.f", pdbX[0], pdbY[0]); pt.x = pdbX[0]; pt.y = pdbY[0]; str.Format("X: %0.3f, Y:%0.3f",pt.x,pt.y); gLogMgr->WriteDebugLog(str); #endif if(!IsDbxyZero(pt)) { m_HawkvisCtrl->SetCrossShow(1,30,30,-1,-1,true); m_HawkvisCtrl->ZoomFitWindow(); } return true; } //调用模板 void CCameraHawkvis::OpenTemp() { CFileMgr FileMgr; CString path = FileMgr.GetWorkPath(); m_HawkvisCtrl->LoadShapeModel((LPCTSTR)path); gLogMgr->WriteDebugLog("Hawkvis : LoadCatchTemp"); } #if 0 Dbxy CCameraHawkvis::CCDpt2Platcoord(Dbxy CCDpt) { Dbxy pt; pt.x = m_Coord.x - CCDpt.x; pt.y = m_Coord.y + CCDpt.y; return pt; } #endif