|
|
|
@ -83,8 +83,8 @@ void CProduct::ResetRealMarkPt()
|
|
|
|
|
m_RealMarkPt1.y = 0;
|
|
|
|
|
m_RealMarkPt2.x = 0;
|
|
|
|
|
m_RealMarkPt2.y = 0;
|
|
|
|
|
m_RealMarkPt3.x = 0;
|
|
|
|
|
m_RealMarkPt3.y = 0;
|
|
|
|
|
//m_RealMarkPt3.x = 0;
|
|
|
|
|
//m_RealMarkPt3.y = 0;
|
|
|
|
|
//偏移和旋转都要重设
|
|
|
|
|
m_Offset.x = 0;//理论数据映射为平台坐标的偏移X
|
|
|
|
|
m_Offset.y = 0;//理论数据映射为平台坐标的偏移Y
|
|
|
|
@ -140,6 +140,9 @@ void CProduct::SetRealMarkPt(Dbxy pt)
|
|
|
|
|
if(!IsSetRealMarkPt1() || !IsSetRealMarkPt2())
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
CalAffinePars();
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
//计算偏移旋转
|
|
|
|
|
CalTheoryToRealPar();
|
|
|
|
|
|
|
|
|
@ -157,20 +160,98 @@ void CProduct::SetRealMarkPt(Dbxy pt)
|
|
|
|
|
CalTheoryToRealPar();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#include<opencv2/opencv.hpp>
|
|
|
|
|
using namespace cv;
|
|
|
|
|
|
|
|
|
|
void CProduct::CalAffinePars()
|
|
|
|
|
{
|
|
|
|
|
CString logstr;
|
|
|
|
|
|
|
|
|
|
o_TheoryMarkPt1 = m_TheoryMarkPt1 - m_BasePt;
|
|
|
|
|
logstr.Format("TheoryMarkPt1 Coord(%f,%f)", o_TheoryMarkPt1.x, o_TheoryMarkPt1.y);
|
|
|
|
|
gLogMgr->WriteDebugLog(logstr);
|
|
|
|
|
|
|
|
|
|
o_TheoryMarkPt2 = m_TheoryMarkPt2 - m_BasePt;
|
|
|
|
|
logstr.Format("TheoryMarkPt2 Coord(%f,%f)", o_TheoryMarkPt2.x, o_TheoryMarkPt2.y);
|
|
|
|
|
gLogMgr->WriteDebugLog(logstr);
|
|
|
|
|
|
|
|
|
|
o_TheoryMarkPt3 = m_TheoryMarkPt3 - m_BasePt;
|
|
|
|
|
logstr.Format("TheoryMarkPt3 Coord(%f,%f)", o_TheoryMarkPt3.x, o_TheoryMarkPt3.y);
|
|
|
|
|
gLogMgr->WriteDebugLog(logstr);
|
|
|
|
|
|
|
|
|
|
o_RealMarkPt1 = m_RealMarkPt1 - m_BasePt;
|
|
|
|
|
logstr.Format("RealMarkPt1 Coord(%f,%f)", o_RealMarkPt1.x, o_RealMarkPt1.y);
|
|
|
|
|
gLogMgr->WriteDebugLog(logstr);
|
|
|
|
|
|
|
|
|
|
o_RealMarkPt2 = m_RealMarkPt2 - m_BasePt;
|
|
|
|
|
logstr.Format("RealMarkPt2 Coord(%f,%f)", o_RealMarkPt2.x, o_RealMarkPt2.y);
|
|
|
|
|
gLogMgr->WriteDebugLog(logstr);
|
|
|
|
|
|
|
|
|
|
o_RealMarkPt3 = m_RealMarkPt3 - m_BasePt;
|
|
|
|
|
logstr.Format("RealMarkPt3 Coord(%f,%f)", o_RealMarkPt3.x, o_RealMarkPt3.y);
|
|
|
|
|
gLogMgr->WriteDebugLog(logstr);
|
|
|
|
|
|
|
|
|
|
double TheoryDis = CalDistance(o_TheoryMarkPt1, o_TheoryMarkPt2);
|
|
|
|
|
logstr.Format("[Mark1&2理论间距]: [%f]", TheoryDis);
|
|
|
|
|
gLogMgr->WriteDebugLog(logstr);
|
|
|
|
|
|
|
|
|
|
double RealDis = CalDistance(o_RealMarkPt1, o_RealMarkPt2);
|
|
|
|
|
logstr.Format("[Mark1&2真实间距]: [%f]", RealDis);
|
|
|
|
|
gLogMgr->WriteDebugLog(logstr);
|
|
|
|
|
|
|
|
|
|
double DisDiff = abs(TheoryDis - RealDis);
|
|
|
|
|
logstr.Format(_T("[Mark 间距误差] = [%f]"), DisDiff);
|
|
|
|
|
gLogMgr->WriteDebugLog(logstr);
|
|
|
|
|
|
|
|
|
|
if (DisDiff > abs(gProductMgr->GetMaxMarkDisDiff()))
|
|
|
|
|
{
|
|
|
|
|
gTrackWorkFlow1.RadAlamOnOff(true);//报警提示
|
|
|
|
|
ResetRealMarkPt();
|
|
|
|
|
CString LogStr("Mark 间距误差超出范围,定位可能误判!");
|
|
|
|
|
AfxMessageBox(logstr);
|
|
|
|
|
gTrackWorkFlow1.RadAlamOnOff(false);//报警提示
|
|
|
|
|
CExceptionMsg Msg;
|
|
|
|
|
Msg.SetMsg(CString(""));
|
|
|
|
|
throw Msg;//抛出异常
|
|
|
|
|
/* CExceptionMsg Msg;
|
|
|
|
|
Msg.SetMsg(LogStr);
|
|
|
|
|
throw Msg;*/
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
Point2f ThroryCoords[3];
|
|
|
|
|
Point2f RealCoords[3];
|
|
|
|
|
|
|
|
|
|
Mat warp_mat(2, 3, CV_32FC1);
|
|
|
|
|
|
|
|
|
|
ThroryCoords[1] = Point2f(o_TheoryMarkPt1.x, o_TheoryMarkPt1.y);
|
|
|
|
|
ThroryCoords[2] = Point2f(o_TheoryMarkPt2.x, o_TheoryMarkPt2.y);
|
|
|
|
|
ThroryCoords[0] = Point2f(o_TheoryMarkPt3.x, o_TheoryMarkPt3.y);
|
|
|
|
|
|
|
|
|
|
RealCoords[1] = Point2f(o_RealMarkPt1.x, o_RealMarkPt1.y);
|
|
|
|
|
RealCoords[2] = Point2f(o_RealMarkPt2.x, o_RealMarkPt2.y);
|
|
|
|
|
RealCoords[0] = Point2f(o_RealMarkPt3.x, o_RealMarkPt3.y);
|
|
|
|
|
|
|
|
|
|
//得放射变换参数矩阵
|
|
|
|
|
warp_mat = getAffineTransform(ThroryCoords, RealCoords);
|
|
|
|
|
warp_mat.convertTo(warp_mat, CV_32FC1);//不转化时,默认CV_64FC1 后续计算会错误
|
|
|
|
|
|
|
|
|
|
//取出6个变换参数
|
|
|
|
|
m_p00 = warp_mat.at<float>(0, 0);
|
|
|
|
|
m_p01 = warp_mat.at<float>(0, 1);
|
|
|
|
|
m_p02 = warp_mat.at<float>(0, 2);
|
|
|
|
|
|
|
|
|
|
m_p10 = warp_mat.at<float>(1, 0);
|
|
|
|
|
m_p11 = warp_mat.at<float>(1, 1);
|
|
|
|
|
m_p12 = warp_mat.at<float>(1, 2);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
//计算真实数据的偏移和旋转值
|
|
|
|
|
void CProduct::CalTheoryToRealPar()
|
|
|
|
|
{
|
|
|
|
|
gLogMgr->WriteDebugLog("func : CalTheoryToRealPar");
|
|
|
|
|
|
|
|
|
|
if (gLogMgr->IsDebuging())//调试时,理论点用作实际点.
|
|
|
|
|
{
|
|
|
|
|
m_RealMarkPt1 = m_TheoryMarkPt1;
|
|
|
|
|
m_RealMarkPt2 = m_TheoryMarkPt2;
|
|
|
|
|
m_Offset.x = 0;
|
|
|
|
|
m_Offset.y = 0;
|
|
|
|
|
m_RotateAng = 0;
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
//以第一个点的来计算相对的偏移
|
|
|
|
|
m_Offset.x = m_RealMarkPt1.x - m_TheoryMarkPt1.x;
|
|
|
|
|
m_Offset.y = m_RealMarkPt1.y - m_TheoryMarkPt1.y;
|
|
|
|
@ -263,27 +344,6 @@ void CProduct::CalRealStretchPar()
|
|
|
|
|
//理论数据转换为实际数据
|
|
|
|
|
void CProduct::TheoryDataToRealData(vector<Dbxy> &vec,Dbxy &Offset)
|
|
|
|
|
{
|
|
|
|
|
#ifdef Create_MarkData_file
|
|
|
|
|
CStdioFile sf;
|
|
|
|
|
if (!sf.Open("MarkData.txt", CFile::modeCreate | CFile::modeReadWrite | CFile::modeNoTruncate))
|
|
|
|
|
sf.m_hFile = NULL;
|
|
|
|
|
CString str;
|
|
|
|
|
vector<Dbxy>::iterator iter = vec.begin();
|
|
|
|
|
vector<Dbxy>::iterator iter_end = vec.end();
|
|
|
|
|
for (; iter != iter_end; iter++)
|
|
|
|
|
{
|
|
|
|
|
(*iter) = TheoryPtToRealPt((*iter));
|
|
|
|
|
(*iter).x += Offset.x;
|
|
|
|
|
(*iter).y += Offset.y;
|
|
|
|
|
if (sf.m_hFile != NULL)
|
|
|
|
|
{
|
|
|
|
|
str.Format("MarkAreaCenter: X=%f;Y=%f \n", (*iter).x, (*iter).y);
|
|
|
|
|
sf.SeekToEnd();
|
|
|
|
|
sf.WriteString(str);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
sf.Close();
|
|
|
|
|
#else
|
|
|
|
|
vector<Dbxy>::iterator iter = vec.begin();
|
|
|
|
|
vector<Dbxy>::iterator iter_end = vec.end();
|
|
|
|
|
for(;iter!=iter_end;iter++)
|
|
|
|
@ -292,7 +352,41 @@ void CProduct::TheoryDataToRealData(vector<Dbxy> &vec,Dbxy &Offset)
|
|
|
|
|
(*iter).x += Offset.x;
|
|
|
|
|
(*iter).y += Offset.y;
|
|
|
|
|
}
|
|
|
|
|
#endif
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//理论数据转换为实际数据
|
|
|
|
|
void CProduct::TheoryDataToRealData(vector<Dbxy> &vec, Dbxy &BaseOffset, Dbxy CutAdjust)
|
|
|
|
|
{
|
|
|
|
|
vector<Dbxy>::iterator iter = vec.begin();
|
|
|
|
|
vector<Dbxy>::iterator iter_end = vec.end();
|
|
|
|
|
for (;iter != iter_end;iter++)
|
|
|
|
|
{
|
|
|
|
|
//(*iter) = TheoryPtToRealPt((*iter));
|
|
|
|
|
//(*iter) = (*iter) - m_BasePt;
|
|
|
|
|
auto x = (*iter).x;
|
|
|
|
|
auto y = (*iter).y;
|
|
|
|
|
double retx = m_p00*x + m_p01*y + m_p02+ CutAdjust.x;
|
|
|
|
|
double rety = m_p10*x + m_p11*y + m_p12+ CutAdjust.y;
|
|
|
|
|
(*iter).x = retx;
|
|
|
|
|
(*iter).y = rety;
|
|
|
|
|
|
|
|
|
|
auto temp = BaseOffset - m_BasePt;
|
|
|
|
|
|
|
|
|
|
(*iter) = (*iter) - temp;
|
|
|
|
|
|
|
|
|
|
/*(*iter).x += CutAdjust.x;
|
|
|
|
|
(*iter).y += CutAdjust.y;*/
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
void CProduct::ResetAffinePars()
|
|
|
|
|
{
|
|
|
|
|
m_p00 = 1;
|
|
|
|
|
m_p01 = 0;
|
|
|
|
|
m_p02 = 0;
|
|
|
|
|
|
|
|
|
|
m_p10 = 0;
|
|
|
|
|
m_p11 = 1;
|
|
|
|
|
m_p12 = 0;
|
|
|
|
|
}
|
|
|
|
|
//获取实际产品的尺寸比例
|
|
|
|
|
Dbxy CProduct::CalRealProductScale()
|
|
|
|
@ -434,4 +528,16 @@ void CProduct::TheoryDataToRealData(vector<vector<Dbxy>> &vec,Dbxy &Offset)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//理论数据转换为实际数据
|
|
|
|
|
void CProduct::TheoryDataToRealData(vector<vector<Dbxy>> &vec, Dbxy &BaseOffset, Dbxy CutAdjust)
|
|
|
|
|
{
|
|
|
|
|
gLogMgr->WriteDebugLog("CProduct::TheoryDataToRealData");
|
|
|
|
|
vector<vector<Dbxy>>::iterator iter = vec.begin();
|
|
|
|
|
vector<vector<Dbxy>>::iterator iter_end = vec.end();
|
|
|
|
|
for (;iter != iter_end;iter++)
|
|
|
|
|
{
|
|
|
|
|
TheoryDataToRealData(*iter, BaseOffset,CutAdjust);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
#endif
|
|
|
|
|