|
|
#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]------------------------------------------------"<<endl;
|
|
|
|
|
|
}
|
|
|
void CCameraHawkvis::Ini()
|
|
|
{
|
|
|
//绑定霍克视觉的ocx 控件
|
|
|
//m_HawkvisCtrl = &(GetFrame()->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
|