这个实验的目的是不用九点标定,让镜头中心移动对准视野内指的点上去。
本篇是对贴子《九点自动标定---如何让相机视野中心十字对准目标物?》的实验记录。
先写段halcon代码,配合xyz平台进行捕捉屏幕中心的像素坐标位置。
dev_close_window() dev_open_window(0, 0, 612, 512, 'black', WindowHandle) dev_set_draw('margin') open_framegrabber ('GigEVision2', 0, 0, 0, 0, 0, 0, 'progressive', -1, 'default', -1, 'false', 'default', '94aab8029638_Microvision_MVEM500M', 0, -1, AcqHandle) while(1) *这里循环拍图,画辅助线以配合xyz平台,方便观察当前机械坐标位置是不是正确。 grab_image (Image, AcqHandle) get_image_size(Image, Width, Height) dev_set_color('red') disp_line(WindowHandle, Height/2, 1, Height/2, Width) disp_line(WindowHandle, 0, Width/2, Height, Width/2) cy:=Height/2 cx:=Width/2 disp_circle(WindowHandle, cy, cx, 12) dev_update_off() gen_circle(Circle, cy, cx, 100.5) reduce_domain(Image, Circle, ImageReduced) threshold(ImageReduced, Region, 0, 55) connection(Region, ConnectedRegions) select_shape(ConnectedRegions, SelectedRegions, 'area', 'and', 2500, 20000) count_obj(SelectedRegions, Number) area_center(SelectedRegions, Area, Row, Column) dev_set_color('green') disp_cross(WindowHandle, Row, Column, 12, 0) dev_update_on() dev_disp_text(cy+','+cx, 'window', 20, 20, 'black', [], []) if(Number=1) dev_disp_text(Row+','+Column, 'window', 60, 20, 'black', [], []) endif dev_display(SelectedRegions) endwhile *这里是求t1,t2,t3三个圆心的像素坐标。可以手工把程序拖至这里运行。 gen_region_runs (ROI_0, [590,591,592,593,594,595,596,597,598,599,600,601,602,603,604,605,606,607,608,609,610,611,612,613,614,615,616,617,618,619,620,621,622,623,624,625,625,626,626,627,627,628,628,629,629,630,631,632,633,634,635,636,637,638,639,640,641,642,643,644,645,646,647,648,649,650,651,652,653,654,655,656,657,658,659,660,661,662,663,664,665,666,667,668,669,670,671,672,673,674,675,676,677,678,679,680,681,682,683,684,685,686,687,688,689,690,691,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716,717,718,719,720,721,722,723,724,725,726,727,728,729,730,731,732,733,734,735,736,737,738,739,740,741,742,743,744,745,746,747,748,749,750,751,752,753,754,755,756,757,758,759,760,761,762,763,764,765,766,767,768,769,770,771,772,773,774,775,776,777,778,779,780,781,782,783,784,785,786,787,788,789,790,791,792,793,794,795,796,797,798,799,800,801,802,803,804,805,806,807,808,809,810,811,812,813,814,815,816,817,818,819,820,821,822,823,824,825,826,827,828,829,830,831,832,833,834,835,836,837,838,839,840,841,842,843,844,845,846,847,848,849,850,851,852,853,854,855,856,857,858,859,860,861,862,863,864,865,866,867,868,869,870,871,872,873,874,875,876,877,878,879,880,881,882,883,884,885,886,887,888,889,890,891,892,893,894,895,896,897,898,899,900,901,902,903,904,905,906,907,908,909,910,911,912,913,914,915,916,917,918,919,920,921,922,923,924,925,926,927,928,929,930,931,932,933,934,935,936,937,938,939,940,941,942,943,944,945,946,947,948,949,950,951,952,953,954,955,956,957,958,959,960,961,962,963,964,965,966,967,968,969,970,971,972,973,974,975,976,977,978,979,980,981,982,983,984,985,986,987,988,989,990,991,992,993,994,995,996,997,998,999,1000,1001,1002,1003,1004,1005,1006,1007,1008,1009,1010,1011,1012,1013,1014,1015,1016,1017,1018,1019,1020,1021,1022,1023,1024,1025,1026,1027,1028,1029,1030,1031,1032,1033,1034,1035,1036,1037,1038,1039,1040,1041,1042,1043,1044,1045,1046,1047,1048,1049,1050,1051,1052,1053,1054,1055,1056,1057,1058,1059,1060,1061,1062,1063,1064,1065,1066,1067,1068,1069,1070,1071,1072,1073,1074,1075,1076,1077,1078,1079,1080,1081,1082,1083,1084,1085,1086,1087,1088,1089,1090,1091,1092,1093,1094,1095,1096], [1021,1020,1019,1012,1010,1008,1003,1003,1003,1002,1001,994,994,994,994,992,988,988,988,988,988,988,988,988,988,988,988,988,988,988,988,987,987,986,986,973,985,973,985,973,985,973,985,973,985,973,973,973,973,972,972,971,971,970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,969,969,968,968,967,967,967,967,967,967,967,967,967,967,967,967,967,967,966,966,965,965,964,964,963,963,962,962,961,961,961,961,961,961,961,961,961,961,961,961,961,961,961,961,961,961,961,961,961,961,961,961,961,961,961,961,961,961,961,961,961,961,961,961,961,961,961,961,961,961,961,961,961,961,961,961,961,961,961,961,960,960,960,959,959,958,958,958,958,958,958,958,958,958,958,958,958,958,958,958,958,958,958,958,958,958,958,958,958,958,958,958,958,958,958,958,958,958,958,958,958,958,958,958,958,958,958,958,958,958,958,958,958,958,958,958,958,958,958,958,958,958,958,959,959,960,960,960,961,961,962,964,964,964,964,965,965,966,966,967,970,970,970,970,970,970,971,973,974,975,976,977,978,979,980,982,986,988,990,992,994,998,999,1000,1007,1008,1009,1011,1012,1013,1015,1017,1019,1020,1021,1031,1033,1034,1035,1036,1049,1052,1069,1070,1071], [1083,1084,1085,1095,1097,1099,1102,1105,1122,1123,1123,1127,1127,1127,1130,1130,1130,1130,1130,1130,1131,1131,1132,1132,1133,1133,1133,1133,1133,1133,1133,1133,1133,1133,1133,974,1133,976,1133,978,1133,981,1133,983,1133,1133,1133,1133,1133,1133,1133,1133,1133,1133,1133,1133,1133,1133,1133,1133,1133,1133,1133,1133,1133,1133,1133,1133,1133,1133,1133,1133,1134,1135,1136,1136,1136,1136,1136,1136,1136,1136,1136,1136,1136,1136,1136,1136,1136,1136,1136,1136,1136,1136,1136,1136,1136,1136,1136,1137,1137,1138,1138,1139,1139,1139,1139,1139,1139,1140,1141,1142,1144,1145,1145,1145,1145,1145,1145,1145,1147,1148,1148,1148,1148,1148,1148,1148,1148,1151,1152,1152,1153,1153,1154,1155,1155,1156,1156,1157,1157,1159,1160,1160,1160,1160,1160,1160,1160,1160,1160,1161,1161,1162,1162,1163,1163,1165,1166,1166,1166,1166,1167,1167,1168,1168,1169,1169,1169,1172,1172,1172,1173,1174,1175,1176,1177,1178,1178,1178,1179,1180,1184,1184,1184,1184,1184,1187,1188,1189,1190,1190,1190,1191,1192,1193,1195,1197,1199,1201,1202,1203,1203,1204,1204,1205,1208,1209,1210,1210,1210,1213,1215,1216,1216,1216,1216,1217,1218,1222,1223,1223,1224,1224,1225,1226,1227,1230,1234,1237,1237,1237,1237,1239,1241,1243,1245,1246,1247,1247,1248,1248,1249,1251,1253,1258,1259,1260,1261,1263,1267,1267,1267,1270,1271,1272,1273,1275,1276,1278,1280,1285,1287,1289,1299,1301,1311,1311,1311,1324,1327,1332,1333,1334,1335,1336,1337,1347,1349,1350,1350,1350,1353,1354,1355,1363,1366,1374,1375,1376,1378,1380,1385,1385,1385,1385,1386,1387,1391,1391,1391,1391,1391,1391,1392,1393,1395,1398,1400,1400,1400,1400,1400,1400,1400,1400,1400,1401,1402,1403,1404,1404,1405,1405,1406,1407,1408,1409,1409,1409,1409,1409,1409,1409,1410,1410,1411,1411,1411,1412,1412,1412,1412,1412,1412,1412,1413,1414,1415,1415,1415,1415,1415,1415,1415,1415,1415,1415,1415,1415,1415,1415,1416,1417,1418,1418,1418,1419,1420,1421,1421,1421,1421,1421,1421,1421,1421,1421,1421,1421,1421,1421,1421,1421,1421,1421,1421,1421,1421,1421,1421,1421,1421,1421,1421,1421,1421,1421,1421,1421,1421,1421,1421,1421,1421,1421,1421,1421,1421,1420,1419,1418,1418,1418,1418,1417,1417,1416,1416,1415,1415,1415,1415,1414,1412,1412,1412,1412,1412,1412,1412,1412,1412,1412,1412,1412,1412,1412,1409,1408,1408,1407,1407,1406,1406,1406,1403,1403,1403,1402,1401,1400,1399,1399,1398,1397,1396,1395,1394,1390,1389,1388,1387,1386,1385,1383,1382,1381,1379,1377,1376,1375,1374,1372,1371,1364,1363,1362,1361,1360,1359,1359,1359,1348,1345,1342,1339,1336,1331,1329,1327,1325,1324,1323,1291,1287,1283,1280,1277,1266,1264,1262,1246,1242,1231,1226,1221,1216,1212,1194,1191,1188]) reduce_domain(Image, ROI_0, ImageReduced1) threshold(ImageReduced1, Region1, 0, 50) connection(Region1, ConnectedRegions1) select_shape(ConnectedRegions1, SelectedRegions1, 'area', 'and', 2500, 40000) area_center(SelectedRegions1, Area1, Row1, Column1) close_framegrabber (AcqHandle)
在上面程序中,屏幕中心画有线色辅助十字线。
如果移动机械坐标到达圆面积范围内, 圆会显示绿色外圈和十字圆心位置。
我们要做的就是移动机械位置让十字对准圆心位置。
屏幕左上角第一行显示的是屏幕中心的像素坐标, 第二行显示的是圆心的像素坐标。
我们把机械点t1, t2, t3 设定为几何形状构成一个直角三角形。
这是t2点:
这是t1点:
这是t3点:
用上面程序辅助,微调了一下机械坐标, 得到t1,t2,t3点的机械坐标如下:
这3个机械坐标位置刚好让视野中心对到圆心上。
然后我们要求出三个圆心的像素坐标,怎么求呢?
如果直接走t1,t2,t3点然后求圆心的像素坐标,那是错误的, 那个求得都会是相同的值,都是视野中心的像素坐标值。
勇哥手绘roi真接求出这个三个圆心像素坐标。
按上面的数据排列如下表:
像素坐标prow,pcol 机械坐标 mrow,mcol (t2) 717.809, 1056.37 -12.521, 1.108 (t1) 959.888, 1050.03 -0.731, 1.17 (t3) 965.689, 1293.25 -0.782, -11.03
按下面的公式计算出每像素多少毫米,有宽与高两个方向。
W=(t3.mcol-t1.mcol)/(t3.pcol-t1.pcol)
=(-11.03-1.17)/(1293.25-1050.03)
=0.050160349
H=(t1.mrow-t2.mrow)/(t1.prow-t2.prow)
=(-0.731-(-12.521))/(959.888-717.809)
=0.048703109
现在勇哥想把屏幕中心移动到字母A的顶点上去。
鼠标直接指向A的顶点, 得到像素坐标为:
row,col: 953, 652
已经当前屏幕中心坐标为: 972,1296
这个点距离屏幕中心的像素距离是:
dstRow=972-953=19
dstCol=1296-652=644
这个距离是像素坐标,我们再乘以像素毫米:
dsty=19*H=19*0.048703109=0.925359071
因为这个A顶点的行坐标小于中心点坐标,所以dsty=-0.925359071
dstx=880*W=644*0.050160349=32.30326476
让平台走到这个点, 结果如下。
经验证y坐标约有0.2mm的误差,X结果较好。
勇哥总结一下:
上述实验没有用九点标定, 仅仅靠三点之间的机械距离比上像素距离,求出每像素对应的机械坐标当量(mm)
然后就可以用视野内任意一点的x,y值乘以这个像素当量,求出机械位置。
这种做法相当于是做了一维标定,而九点标定做的是二维标定(一个面)。显然后者要更精确。
---------------------
作者:hackpig
来源:www.skcircle.com
版权声明:本文为博主原创文章,转载请附上博文链接!

