Halcon实现实时骰子识别
效果:bilibili
输入形式:.avi
视频文件
视频内容:以一本书为背景,在其上面分批次掷骰子
目标:锁定书本区域;完成图像矫正;识别每个骰子的点数,计算总骰子数和总点数
1. 锁定书本区域
rgb图像的1通道对书本的颜色最敏感,在1通道内做阈值分割
通过书本面积最大的特征选定书本
2. 完成图像矫正
目标是将窗口锁定在书本的区域
-
使用开运算去一下选定区域毛刺
-
将选定区域化为凸多边形
-
化为凸多边形化为xld格式
-
使用
segment_contours_xld
算子分割xld为多条直线,并选择分割依据为直线,这样得到了四个xld部分
-
根据点的横纵坐标大小判断获取四个角点,从左上角开始按照顺时针排序存入数组
-
将四个角点所构成的四边形做投射变换为一个水平的矩形,并且裁剪出四边形的区域
3. 识别骰子
3.1 锁定ROI
确定方法:
使用灰度选定骰子的区域,效果不太理想:
1.背景中也有偏白色的部分,加上书本和骰子有时反光,很难完全隔开
2.骰子部分和背景部分的白色重叠起来时很难分开这两部分
利用骰子里面圆点的圆度特征,也不理想:有很多部位也比较接近圆点的形状大小、
结合上面两者:
首先利用灰度选出包含骰子的范围,然后利用骰子的形状特征来进一步选定ROI
-
增加对比度,灰度阈值分割
-
利用面积和空洞数量选择区域
-
填充,做膨胀运算,防止边界上有部分筛子区域被过滤没了
-
确定大的ROI区域
-
用边缘来找圆点
-
骨架
-
筛选圆
['width','height','anisometry','holes_num','roundness']
发现还是有一小部分没能筛出去,之后再筛
-
圆核做膨胀,选定ROI
-
再次做阈值分割,根据特征筛选,划定最终ROI
3.2 划分每一个骰子
核心:解决相邻骰子之间的粘连问题,解决骰子与背景的黏连问题
方法:利用分水岭算法放大各区域的分离程度
-
做距离分布图
distance_transform
-
分水岭算法
watersheds_threshold
-
将盆地图与原区域图做交集运算,筛选一下特征
intersection
3.3 对每个个筛子计数
-
选定单个区域
-
计数
-
循环每个区域
参考文章:https://blog.csdn.net/m0_47472749/article/details/120185047
若想参考halcon代码:https://download.csdn.net/download/weixin_42691563/85006520
C#部分非常简单,没有分享的必要