DITO需要向X正方向偏移,Offset為正
DITO需要向Y正方向偏移,Offset為負
DITO需要向順時針偏移, Offset為正,LCM需要向逆時針偏移, Offset為負
如X1 X2大,DITO需往Y軸正方向走,DY為負
如Y1 Y4大,DITO需往X軸負方向走,DX為負
如X1 > X2 Y1 < Y4 ,需順時針旋轉,Dθ為正
上面是手机触摸屏幕已贴合的示意图,cg是玻璃层,dito是显示层。
当前状况是,下面cg在一个可旋转和移动的载具上,上面的dito在另一个夹爪上,这个夹爪不能旋转和移动,只能释放,释放时,没有位移和旋转,cg和dito二者处于未贴合状态。
已知黑色矩形和红色矩形的四个角坐标。
下一步,要做的是计算黑色矩形和红色矩形的偏差,包括offsetx,offsety,角度偏差。
假如三个偏差都是0,贴合后,如上图。cg和dito的贴合是在一个密闭容器,抽真空后,就挤压在一起了。
2011年,这个贴合的算法的吸引力好像大过了我看到的视觉神奇。这一篇,先算法,下一篇,讲视觉如何找矩形的角坐标。
当时觉得算法很简单,最后落实在项目中成千上万的生产,一点都不简单,这里边的代码,都是自动化设备运行中撞机事故的结晶。有点吓人,最后项目稳定,团队撤走,留我维护,心里那个忐忑,人要自立,必须战胜这个心魔,那时我都30岁了,本以为就这样生产下去了,没想量产爬坡,我后来还改进了这个算法,只使用了对角线四个点矫正,贴合,这多亏我从前做足了准备,细研究了那些吓人的每一处代码,想一想,机会还是留给了有准备的我(在富士康,你总能看到这句话)。
十几年后回过头看,好像还是简单,可能是忘完了吧,或许是进步了吧!
其实,我们觉得简单,是一种非常好的信念,只有这样,才有做下去的理由,人吗,就是找正当和不正当的理由,坚持到最后。这是人性,趋利避害。
最初,只是跟机器,有问题,就会看别人改动点代码,自己傻子一样,看,下一步知道,哎,出错了,找这里。一个普通人的角色,本来就是这样。
我在这里工作,暂时没有了钱的威胁,那么我能不能在普通状态改变一点,孩子都三四岁了!
那就干一行爱一行,先把自己认为这个重要的算法啃下来。上过学,知道空间平行两个平面上不同两个矩形对齐,一个是中心对齐,另一个是对应边平行。
这样不就ok了?是这个道理,好,开始看代码,看他怎么搞,到了社会上,没人教你,没关系,现场是最好的学习地,多挤点时间,自学,虽然工厂是让你工作的,不是让你学习的,但只要你想干,总能找到理由。
找重点,寻线路,看细节,我知道是到了我们机器视觉工站,plc会发起信号,这就够了,如下:
1,GetPLCCommMessage();看里面有什么?
2, case 1://啟動跑位
this->StartAutoRun();这里面有什么?
3, this->StartTimer(ID_TIMER_AUTO_RUN);好,继续顺下去
4, case ID_TIMER_AUTO_RUN:
this->SetTimer(ID_TIMER_AUTO_RUN,100,NULL);不管其他,继续走
5,case ID_TIMER_AUTO_RUN:
this->AutoRun(); //自動運行
break;
6,if (this->gb_refViewNum==4)
AutoRunToFourView();这个应该是原版
else if (this->gb_refViewNum==2)
AutoRunToTwoView();这个是我写的
7,for (int i=0;i<2;i++)//取了8幅图,一定是两个矩形的八个角都在里头
{
for (int j=0;j<4;j++)
{
this->m_DlgCCDViewArr[i][j].SaveImage(sPath);//保存圖像組
}
}
显然,说起来就没完没了,我们分开下节继续讲,待续