在二维平面中,相同的来料都有它关于来料相同的平面矩阵,因此在初始来料上规划好路径后只要得到二次来料它发生的位移以及旋转角度就能很容易得到这次来料上的规划路径关系,从而控制机械手准确走完规划路径。
但当来料过大超出相机抓图的视野就可以通过mark点来获得这两个关系,mark点可以是一个、两个或者三个,分别取决于不同的场合。关于一个mark点的定位就非常简单了,但有个局限就是这个mark点必要很容确定旋转度数。
测试代码:
*来料发生位移+旋转
dev_close_window ()
dev_open_window (0, 0, 512, 512, 'black', WindowHandle)
dev_set_draw ('margin')
*模拟来料,这是一个正常的来料
gen_rectangle1 (ROI_0, 162.5, 111.5, 250.5, 364.5)
gen_rectangle1 (ROI_Mark, 169, 119, 186, 144)
concat_obj (ROI_0, ROI_Mark, ObjectsConcat)
*我们以这个区域的 中心点为基准点
area_center (ROI_Mark, Area, Row, Column)
gen_cross_contour_xld (Cross, Row, Column, 16, 0)
disp_message (WindowHandle, '用鼠标在图像上确定一个点来模拟抓取点', 'window', 12, 12, 'white', 'false')
draw_point (WindowHandle, pRow, pColumn)
dev_set_color ('green')
gen_cross_contour_xld (pCross, pRow, pColumn, 26, 0)
disp_message (WindowHandle,'('+pRow+','+pColumn+')', 'window', pRow, pColumn, 'green', 'false')
****************************************************
*第二次来料发生位移+旋转
dev_open_window (0, 512, 512, 512, 'black', WindowHandle1)
disp_message (WindowHandle1, '这是第二次来料模拟', 'window', 12, 12, 'white', 'false')
dev_set_color ('red')
*得到二次来料mark点旋转角度和坐标
Phi:=rad(60)
moveR:=200
moveC:=300
*创建变换模型
vector_angle_to_rigid (Row, Column, 0, moveR, moveC, Phi, HomMat2D)
*区域变换
affine_trans_region (ObjectsConcat, RegionAffineTrans, HomMat2D, 'nearest_neighbor')
****************************************************
*点的仿射变换,拿到最终结果
affine_trans_point_2d (HomMat2D, pRow, pColumn, Qx, Qy)
dev_set_color ('green')
gen_cross_contour_xld (pCross1, Qx, Qy, 26, Phi)
disp_message (WindowHandle1,'('+Qx+','+Qy+')', 'window', Qx, Qy, 'green', 'false')其中绿色十字即是变换前后测试的点
