接着上一节,相机取了8副像,两个矩形的8个角都在图像里头,你可以想象以下相机和cg,dito的关系,最初我们的硬件如下:
8,gb_analyzeByFour(int type)//計算及分析
float dAngle=0.0; //紀錄分析得到的角度偏差, 不能初始化為0
float dx=0,dy=0; //recode x, y offset
我们8副图像在m_DlgCCDViewArr[2][4]这里头,这是一个基于ni图像处理类,我们下一节详细介绍以下,以后evsion,visionpro都可以用这一个类,包括我们现在自己的megauging图像处理api,也可以把他们在类中替换掉,替换掉ni国外图像处理软件,这是我最初写视觉软件的想法。
for (int i=0;i<2;i++)
{
for (int j=0;j<4;j++)
{
if (!this->m_DlgCCDViewArr[i][j].m_GaugeOK )
{
this->m_DlgCCDViewArr[i][j].ShowWindow(SW_HIDE);
this->m_DlgCCDViewArr[i][j].RefreshWindowGauge();
this->m_DlgCCDViewArr[i][j].MatchImage();
}
//m_Result.MatchScore處理Match得分低的情況
if (this->m_DlgCCDViewArr[i][j].m_Result.MatchScore<300.0)//this->m_MatchOption.minMatchScore)
{
this->m_Counter.ERR_Match++;
ShowMsgToUser("重新學習match");
this->SaveLog("重新學習match");
result = 2;//重新Match
break;
}
if(j==0 )
{
m_WorldPoint[i][j].b = this->m_DlgCCDViewArr[i][j].m_Intersection.x/*+ (i-1)*gb_offset[m_CurrClamp].dx*/;
m_WorldPoint[i][j].a = -this->m_DlgCCDViewArr[i][j].m_Intersection.y + (this->m_pCCDCurrPath.pPoint->x/MotionRatio) /*+ (i-1)*gb_offset[m_CurrClamp].dy*/;//原來為-
}.........................
你可以看到,通过这个ni图像类处理后,两个矩形的八个角坐标就得到了,在m_DlgCCDViewArr[i][j].m_Intersection(x,y)里头。当然最初的8副图像就是传到这个类里头的。
现在,这个类的作用很明显,有图像输入,有结果输出。
这个类里,我最喜欢的单词gauge(十年后,突然发现,杨振宁第二次诺贝尔获奖那篇论文题目,最醒目的一个字,就是这个gauge)也在,他是怎么处理的呢?首先想到的是,相机,轴,载具不在一个平面里头,我们应该把他正投影到一个平面坐标系里,然后关系就很明显,就像我们前头想的两个矩形一一对应的边平行,中心重合,就ok了,实际也是这样来的,所有代码看懂后,就是如此,问题是,不好看啊!当初我有一两年都在看这个程序,学习vc++,并且现场跟机,处理现场问题,绝招就是挤时间,偷学。
m_WorldPoint[2][4],看到没,这个就是最后统一坐标系中的8个角的坐标。
m_Intersection是什么意思,十字交叉点,意思很明确,就是矩形中每相邻两边,就会有一个十字交叉点,我们初中学过几何,都知道。但要在图像中找到这直线,很难啊!所以当初就用ni的图像卡尺工具来gauge,原来我最早想这个问题时,我知道了houghline,道理很简单,可以试试,代替ni找线的卡尺工具,两条线相交,初中数学也能实现,关键用c++要实现,现在我megauging也可以实现相应功能,但我权衡后,没有用houghline,为什么?
下一节,待续,详细算法介绍