我的项目需要从细化的汉字图像中提取轮廓,再从轮廓中得到汉字的笔画结构信息。但是我对OpenCV描述轮廓的方式有点疑惑。
我使用findContours方法,得到List后,进行了ApproxPolyDP轮廓近似,然后使用drawContours绘制轮廓,再把MatOfPoint转换成ArrayList自己按顺序逐点绘制轮廓的数据点。
然后我发现轮廓的绘制竟然不是完全按点的顺序绘制的,如下图。轮廓没有直接连接到下一个点,而是回到了之前的一个点,再连接到下一个点。这是为什么?
我怀疑有一些点有分支的意义,因此可以被重复连接,但是我没有在OpenCV的文档里找到,这让我很困惑,而理解OpenCV的轮廓的储存方式对我从中提取信息很重要
![](https://profile-avatar.csdnimg.cn/default.jpg!4)
OpenCV Java 的轮廓分支点问题
- 写回答
- 好问题 0 提建议
- 追加酬金
- 关注问题
- 邀请回答
-
2条回答 默认 最新
- Kwan的解忧杂货铺@新空间代码工作室 2024-03-12 18:35关注
ZBTBL 晚上好🌙🌙🌙
本答案参考ChatGPT-3.5在OpenCV中,轮廓的绘制方式确实是将轮廓的每个点按照顺序连接起来的。但是由于图像中可能存在分支点或连接不连续的情况,所以在绘制轮廓时,可能会出现折返的情况。这是正常现象,绘制的连接线应该是正确的。
对于你的项目,从细化的汉字图像中提取轮廓是一个复杂的任务。你可以尝试以下方法来解决问题:
1. 根据图像的特点进行预处理
- 先进行二值化操作,将图像转换为黑白形式。
- 然后进行细化操作,使得图像中的线条更加细化。
2. 使用findContours方法提取轮廓
- 使用
findContours
方法提取轮廓并存储在List中。 - 注意,
findContours
方法返回的轮廓是有序的,可以根据需要进行排序。
3. 使用ApproxPolyDP进行轮廓近似
- 使用
ApproxPolyDP
方法对提取的轮廓进行近似,以减少点的数量。 - 这样可以提高后续处理的效率,并从轮廓中得到更精确的笔画结构信息。
4. 使用drawContours方法绘制轮廓
- 使用
drawContours
方法绘制近似后的轮廓。 - 绘制完成后,得到一个存储图像轮廓的Mat。
5. 提取笔画结构信息
- 使用
MatOfPoint
转换为ArrayList
。 - 按照你的需要,按顺序逐点绘制轮廓的数据点。
- 可以根据需要,将轮廓的点连接成线条,以便更好地理解笔画结构信息。
至于分支点的处理,OpenCV并没有直接提供相关函数,需要自己进行处理。你可以根据轮廓点的连续性来判断是否有分支点,然后根据需要进行分支点的重复连接。
希望以上解决方案对你有帮助。
解决 无用评论 打赏 举报
悬赏问题
- ¥15 openFOAM DPMFoam
- ¥15 将查询到的值,赋值到table指定行中
- ¥50 docker容器内部启动shell脚本多命令
- ¥15 请问python的selenium怎么设置referer
- ¥15 请教下, VS QT 环境下, QTOPCUA 的源文件报错,这种情况咋查呢 ?
- ¥20 UNITY webgl关于文档的上传和下载问题
- ¥15 安霸cv22 + rtl8211f 千兆,udp传输丢包
- ¥15 关于区块链和边缘环境搭建的相关问题
- ¥15 windows远程桌面断卡重连软件卡顿问题
- ¥30 Unity 实现扫描效果