|
|
#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"
|
|
|
#include "DlgDnCutCamera.h"
|
|
|
|
|
|
#define RESULT_CNT 10 //抓取最多的模板个数
|
|
|
|
|
|
|
|
|
CCameraHawkvis *gCameraHawkvis = new CCameraHawkvis;
|
|
|
CCameraHawkvis::CCameraHawkvis(void)
|
|
|
{
|
|
|
m_nCam1Expore = 80000;//曝光值
|
|
|
m_nCam2Expore = 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_nCam1Expore);
|
|
|
pPropertie->SetType(_PROP_TYPE_INT);
|
|
|
pPropertie->SetpModule(this);
|
|
|
pPropertie->SetPath(Path);
|
|
|
pPropertie->SetName(Name);
|
|
|
pPropertie->WriteRead(true);//读取保存的属性
|
|
|
|
|
|
//添加属性显示
|
|
|
PropertyName = _T("Cam1曝光值");
|
|
|
Description = _T("相机1的曝光值(0~2000000)");
|
|
|
CMFCPropertyGridProperty* p1 = new CMFCPropertyGridProperty(PropertyName, (_variant_t)m_nCam1Expore, Description);
|
|
|
pGroup1->AddSubItem(p1);
|
|
|
gDevicePropertieMgr.Insert(p1, pPropertie);
|
|
|
}
|
|
|
{
|
|
|
//添加属性变量映射
|
|
|
Name = _T("m_n2Expore");//变量名字
|
|
|
CPropertie *pPropertie = new CPropertie;
|
|
|
pPropertie->SetpVal((void*)&m_nCam2Expore);
|
|
|
pPropertie->SetType(_PROP_TYPE_INT);
|
|
|
pPropertie->SetpModule(this);
|
|
|
pPropertie->SetPath(Path);
|
|
|
pPropertie->SetName(Name);
|
|
|
pPropertie->WriteRead(true);//读取保存的属性
|
|
|
|
|
|
//添加属性显示
|
|
|
PropertyName = _T("Cam2曝光值");
|
|
|
Description = _T("相机2的曝光值(0~2000000)");
|
|
|
CMFCPropertyGridProperty* p1 = new CMFCPropertyGridProperty(PropertyName, (_variant_t)m_nCam2Expore, 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_pHawkvisCtrl);
|
|
|
#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::SwitchCamera(long CamIndex)
|
|
|
{
|
|
|
SetCamIndex(CamIndex);
|
|
|
return true;
|
|
|
}
|
|
|
//抓取(返回像素坐标) (一次只抓取一个mark 图形)
|
|
|
bool CCameraHawkvis::CatchPoint(Dbxy &pt)
|
|
|
{
|
|
|
if (!m_bUse)
|
|
|
return false;
|
|
|
auto & m_HawkvisCtrl = (GetFrame()->m_DlgHawkvisCamera.m_pHawkvisCtrl);
|
|
|
//清除之前绘制的圆
|
|
|
m_HawkvisCtrl->ClearGraphicObject();
|
|
|
//抓取一帧
|
|
|
#ifdef __HAWKVIS_MINDVISION_CCD__
|
|
|
m_HawkvisCtrl->MV_GetOneFrame();
|
|
|
Sleep(100);
|
|
|
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;
|
|
|
}
|
|
|
|
|
|
if (!gDlgHawkvisCamera->bCurPicDefinitionOK())
|
|
|
{
|
|
|
gTrackWorkFlow1.RadAlamOnOff(true);
|
|
|
CString str = _T("当前图片清晰度过低!!!");
|
|
|
AfxMessageBox(str);
|
|
|
gTrackWorkFlow1.RadAlamOnOff(false);
|
|
|
|
|
|
CExceptionMsg Msg;
|
|
|
Msg.SetMsg(CString(""));
|
|
|
throw Msg;
|
|
|
}
|
|
|
|
|
|
|
|
|
#ifdef USE_Virtual_CCD_DATA
|
|
|
pt.x = 10;
|
|
|
pt.y = 10;
|
|
|
#else
|
|
|
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 = false;
|
|
|
try
|
|
|
{
|
|
|
ret = m_HawkvisCtrl->FindShapeModel(GetCurShapeModelID(), v_pdbY, v_pdbX, v_pdbAngles, v_pdbScale, v_pdbSore, nCount);
|
|
|
|
|
|
}
|
|
|
catch (...)
|
|
|
{
|
|
|
ret = false;
|
|
|
}
|
|
|
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
|
|
|
|
|
|
#endif//USE_Virtual_CCD_DATA
|
|
|
|
|
|
|
|
|
|
|
|
if (!IsDbxyZero(pt))
|
|
|
{
|
|
|
m_HawkvisCtrl->SetCrossShow(1, 30, 30, -1, -1, true);
|
|
|
m_HawkvisCtrl->ZoomFitWindow();
|
|
|
}
|
|
|
//m_HawkvisCtrl->MV_GetContinueFrame();
|
|
|
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
|