You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
TwoLaserHead-PushJig/LaiPuLaser/CameraHawkvis.cpp

306 lines
8.7 KiB
C++

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

#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 控件的模板查找函数。
//第一个参数金字塔层数取值范围15
//第二个参数,输出查找到的目标列坐标
//第三个参数,输出查找到的目标行坐标
//第四个参数,输出查找到的目标角度
//第五个参数,输出查找到的目标伸缩度
//第六个参数,输出查找到的目标分数
//第七个参数,输出查找到的目标个数
//第八个参数输入查找模板的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