Halcon实现实时骰子识别
输入形式:.avi
视频文件
视频内容:背景书上分批掷骰子
目标:锁定图书区域;完整的图像校正;确定每个骰子的点数,计算骰子的总数和总点数
效果:bilibili
1. 锁定书本区域
rgb图像的1通道对书本的颜色最敏感,在1通道内做阈值分割
按图书面积最大的特征选择图书
2. 完成图像矫正
目标是将窗口锁定到书的区域
- 使用 open 操作去除所选区域的毛刺
- 将选定区域转换为凸多边形
- 化为凸多边形化为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#部分非常简单,没有分享的必要
文章出处登录后可见!
已经登录?立即刷新