ZBTBL 2024-03-12 18:34 采纳率: 0%
浏览 4

OpenCV Java 的轮廓分支点问题

我的项目需要从细化的汉字图像中提取轮廓,再从轮廓中得到汉字的笔画结构信息。但是我对OpenCV描述轮廓的方式有点疑惑。
我使用findContours方法,得到List后,进行了ApproxPolyDP轮廓近似,然后使用drawContours绘制轮廓,再把MatOfPoint转换成ArrayList自己按顺序逐点绘制轮廓的数据点。
然后我发现轮廓的绘制竟然不是完全按点的顺序绘制的,如下图。轮廓没有直接连接到下一个点,而是回到了之前的一个点,再连接到下一个点。这是为什么?
我怀疑有一些点有分支的意义,因此可以被重复连接,但是我没有在OpenCV的文档里找到,这让我很困惑,而理解OpenCV的轮廓的储存方式对我从中提取信息很重要

img

img

  • 写回答

2条回答 默认 最新

  • 关注

    ZBTBL 晚上好🌙🌙🌙
    本答案参考ChatGPT-3.5

    在OpenCV中,轮廓的绘制方式确实是将轮廓的每个点按照顺序连接起来的。但是由于图像中可能存在分支点或连接不连续的情况,所以在绘制轮廓时,可能会出现折返的情况。这是正常现象,绘制的连接线应该是正确的。

    对于你的项目,从细化的汉字图像中提取轮廓是一个复杂的任务。你可以尝试以下方法来解决问题:

    1. 根据图像的特点进行预处理

    • 先进行二值化操作,将图像转换为黑白形式。
    • 然后进行细化操作,使得图像中的线条更加细化。

    2. 使用findContours方法提取轮廓

    • 使用findContours方法提取轮廓并存储在List中。
    • 注意,findContours方法返回的轮廓是有序的,可以根据需要进行排序。

    3. 使用ApproxPolyDP进行轮廓近似

    • 使用ApproxPolyDP方法对提取的轮廓进行近似,以减少点的数量。
    • 这样可以提高后续处理的效率,并从轮廓中得到更精确的笔画结构信息。

    4. 使用drawContours方法绘制轮廓

    • 使用drawContours方法绘制近似后的轮廓。
    • 绘制完成后,得到一个存储图像轮廓的Mat。

    5. 提取笔画结构信息

    • 使用MatOfPoint转换为ArrayList
    • 按照你的需要,按顺序逐点绘制轮廓的数据点。
    • 可以根据需要,将轮廓的点连接成线条,以便更好地理解笔画结构信息。

    至于分支点的处理,OpenCV并没有直接提供相关函数,需要自己进行处理。你可以根据轮廓点的连续性来判断是否有分支点,然后根据需要进行分支点的重复连接。

    希望以上解决方案对你有帮助。

    评论

报告相同问题?

问题事件

  • 创建了问题 3月12日

悬赏问题

  • ¥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 实现扫描效果