搜索
aardio官方社区 门户 查看主题

[求助]扫描的图片内找网格交叉点坐标,熟悉找图的达人帮个忙

发布者: cnhope | 发布时间: 2016-12-2 10:00| 查看数: 1054| 评论数: 5|帖子模式

我想做个工作辅助类工具,就是在扫描仪(我的扫描仪上贴有透明的细线绘成的1x1cm的网格胶片)扫出来的图片中寻找网格线交叉点的坐标,然后控制软件自动校正,现在的难点就是怎么精确寻找这些交叉点的坐标,找图的达人帮我想个思路,有代码参考最好,谢谢了。

最新评论

rbpy 发表于 2016-12-2 10:31:02
论坛里搜索 soImage
cnhope 发表于 2016-12-2 10:47:39
rbpy 发表于 2016-12-2 10:31
论坛里搜索 soImage

soimage是找图的,我的需求是找线,用soimage的话,我的“模板图”改怎么做,是做一个只包含“十字架”的透明图吗?我试了一下,没找到,不知道是不是我的理解错了。能否再给点更细的指导,谢谢!
alajia 发表于 2016-12-4 19:41:44
根据你的图形,选择电路板外的区域容易定位,分别找出其横竖坐标,交叉定位。你的网格粗细不一,所以结果如果按照相邻合并才会是6个。如果有变形,可以多选几个点计算斜率后定位。
  1. import win.ui;
  2. /*DSG{{*/
  3. var winform = win.form(text="定位演示";right=850;bottom=644;parent=...)
  4. winform.add(
  5. button={cls="button";text="定位";left=236;top=602;right=607;bottom=636;db=1;z=1};
  6. picGray={cls="plus";left=12;top=22;right=840;bottom=578;aw=1;db=1;dr=1;dt=1;edge=1;repeat="scale";z=2}
  7. )
  8. /*}}*/

  9. var calGray = function(num){   
  10.     var b,g,r = gdi.getRgb(num);
  11.     return (77 * r + 151 * g + 28 * b) >> 8;  
  12. }

  13. import console;
  14. import gdip;
  15. import inet.http;
  16. winform.button.oncommand = function(id,event){  

  17.     var bmp = gdip.bitmap(inet.http().get("http://www.smtstencil.cn/pictures/2016/12/MsIPaH.png") ,"*.png");  
  18.     var bmpdata = bmp.lockData32();
  19.    
  20.     tab_v = {};
  21.     tab_h = {};
  22.    
  23.     var bits = bmpdata.bits;
  24.     for(h=1;bmp.height){
  25.             var row = bits.rows[h];
  26.         for(w=1;bmp.width){  
  27.                 var gray = calGray(row.pixels[w]);
  28.                 if(gray<120 and (h==5 or h==30)){
  29.                             tab_v[w]=1;
  30.                     }
  31.                 if(gray<120 and (w==10 or w=50)){
  32.                             tab_h[h]=1;
  33.                     }               
  34.         }
  35.     }
  36.    
  37.     for(h=1;bmp.height){
  38.             var row = bits.rows[h];
  39.         for(w=1;bmp.width){  
  40.                 if(tab_v[w] or tab_h[h]){
  41.                             row.pixels[w] = 0xffffffff;
  42.                     }
  43.         }
  44.     }

  45.         for(m,n in tab_v){
  46.                 for(k,v in tab_h){
  47.                         console.log("交叉点:",m,k);
  48.                 }       
  49.         }
  50.    
  51.     bmp.unlockData(bmpdata);
  52.    
  53.     winform.picGray.setBackground( bmp )
  54. }

  55. winform.show()
  56. win.loopMessage();
复制代码
alajia 发表于 2016-12-4 20:14:57
或者调节阈值,如上面代码中 gray<120 修改为 gray<75,得到6个交叉点。
cnhope 发表于 2016-12-10 21:14:37
alajia 发表于 2016-12-4 19:41
根据你的图形,选择电路板外的区域容易定位,分别找出其横竖坐标,交叉定位。你的网格粗细不一,所以结果如 ...

非常感谢!!

手机版|未经许可严禁引用或转载本站文章|站长邮箱|aardio.com|aardio官方社区 ( 皖ICP备09012014号 )

GMT+8, 2017-9-22 07:00 , Processed in 0.062500 second(s), 21 queries , Wincache On.

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表