aardio 官方社区

 找回密码
 注册会员

QQ登录

只需一步,快速开始

搜索
查看: 9707|回复: 5

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

[复制链接]

5

主题

67

回帖

468

积分

二级会员

积分
468
发表于 2016-12-2 10:00:46 | 显示全部楼层 |阅读模式
我想做个工作辅助类工具,就是在扫描仪(我的扫描仪上贴有透明的细线绘成的1x1cm的网格胶片)扫出来的图片中寻找网格线交叉点的坐标,然后控制软件自动校正,现在的难点就是怎么精确寻找这些交叉点的坐标,找图的达人帮我想个思路,有代码参考最好,谢谢了。

9

主题

37

回帖

293

积分

二级会员

积分
293
发表于 2016-12-2 10:31:02 | 显示全部楼层
论坛里搜索 soImage

5

主题

67

回帖

468

积分

二级会员

积分
468
 楼主| 发表于 2016-12-2 10:47:39 | 显示全部楼层
rbpy 发表于 2016-12-2 10:31
论坛里搜索 soImage

soimage是找图的,我的需求是找线,用soimage的话,我的“模板图”改怎么做,是做一个只包含“十字架”的透明图吗?我试了一下,没找到,不知道是不是我的理解错了。能否再给点更细的指导,谢谢!

10

主题

66

回帖

654

积分

三级会员

积分
654
发表于 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();
复制代码

10

主题

66

回帖

654

积分

三级会员

积分
654
发表于 2016-12-4 20:14:57 | 显示全部楼层
或者调节阈值,如上面代码中 gray<120 修改为 gray<75,得到6个交叉点。

5

主题

67

回帖

468

积分

二级会员

积分
468
 楼主| 发表于 2016-12-10 21:14:37 | 显示全部楼层
alajia 发表于 2016-12-4 19:41
根据你的图形,选择电路板外的区域容易定位,分别找出其横竖坐标,交叉定位。你的网格粗细不一,所以结果如 ...

非常感谢!!
您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

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

GMT+8, 2025-2-13 08:12 , Processed in 0.056971 second(s), 22 queries .

Powered by Discuz! X3.5

Copyright © 2001-2024 Tencent Cloud.

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