前言
在微信看到了用opencv对二维码进行区域提取的文章,于是想用visionpro复刻一遍走一下大体的流程,主要是为了学习写脚本与方法思路。。
原文:opencv提取二维码区域
效果
步骤
拉取工具部分
最终图像会显示在这个仿射变换工具上,实际上这个工具并没有进行什么操作只是显示而已。。
使用彩色分割工具来进行二值化处理,因为最开始输入的图像是24位彩色图像所以使用的这个工具。如果是8位灰度图像的话应该使用斑点blob也可以。
目的是将二维码的所在区域找出来,多找一些颜色点和区域应该也可以
原文是白底黑点的图片所以用的腐蚀,这里是黑底白点所以我用了三次膨胀操作和一次闭运算。文中建议的是选用内核小进行多次膨胀,但我感觉用大内核一次膨胀最终的效果好像差不多。多次小内核膨胀的细节会逐渐丢失而大内核会一次性失去,膨胀的效果过强区域会变得很大
最后用模板匹配来找到中心坐标
脚本部分
代码如下(示例):
public CogRectangle oi;//声名一个绘制四边形的类
public CogPMAlignTool toolPM ;//PMA模板匹配的工具类
List<CogRectangle> myRect = new List<CogRectangle>();
//多个四边形用列表存储
toolPM = mToolBlock.Tools["CogPMAlignTool1"] as CogPMAlignTool;//pma模板实例化[]中是模版名
foreach(CogPMAlignResult item in toolPM.Results)//遍历PMA中的Results属性
{
oi = new CogRectangle();//实例化四边形
//oi.X = item.GetPose().TranslationX;
//oi.Y = item.GetPose().TranslationY;
//oi.Width = 67;
//oi.Height = 67;
oi.SetXYWidthHeight(item.GetPose().TranslationX-33.5, item.GetPose().TranslationY-33.5, 67, 67);//也可以用上面方法赋值
//注意获取的是中心坐标,而四边形的绘制如果从中心坐标开始那就是左上角
//所以减去四边形一半的大小也就是33.5
//oi.Color = CogColorConstants.Red;//颜色
oi.LineWidthInScreenPixels = 7; //线的宽度
myRect.Add(oi);//将一个四边形添加到列表中
}
public override void ModifyLastRunRecord(Cognex.VisionPro.ICogRecord lastRecord)
{
foreach(CogRectangle x in myRect)
{
mToolBlock.AddGraphicToRunRecord(x, lastRecord, "START.InputImage", "");//遍历列表在指定的图上显示
}
}
总结
二维码区域的提取能用在什么项目上呢?在识别二维码时对图像进行切割来缩小识别的区域加快识别速度?进行这么多操作可能最后还不如直接在整张图片上识别二维码速度快。。
不过在对图像进行检测前是不是可以进行预处理,比如这些膨胀、腐蚀的操作,但是处理过度会丢失图像的细节,应该是对于不同的图像处理适合不同方法。