在OpenCV中定位和提取图像中的(未知)书籍

3 投票
1 回答
714 浏览
提问于 2025-04-17 21:16

我正在尝试在一张图片中找到一本书(可能因为透视原因看起来有些变形),并把它提取出来,让它看起来是“正的”和“正面”的(也就是修正透视)。

这本书的具体样子我并不知道——没有可以用来对比的查询图像(也就是说,不能通过某种特征匹配的方式来找)。换句话说,我是在这张图片里寻找一堆像是属于“书”这个类别的像素,而不是某一本特定的书。

这本书可能会有些旋转或者其他透视变形。不过,我假设这种变形在合理的范围内:拍照的人是和我一起合作的。这也意味着这本书在图片中应该占据比较显眼的位置——大概占到总图像面积的30%到90%(而不是在一堆杂物中随便找)。

网上有一些资源可以解决(表面上)类似的问题。例如,这个写得很好的教程讲解了如何自动修正扑克牌的透视:https://opencv-code.com/tutorials/automatic-perspective-correction-for-quadrilateral-objects/

目前,我的系统遵循了这个教程的一个大致相似的过程,并做了一些补充。总体的技术步骤是:

  1. 预处理
  2. 使用Canny边缘检测找到边缘
  3. 使用霍夫变换找到看起来像直线的边缘
  4. 找到直线之间的交点,希望能找到书的角落
  5. 根据简单的几何特性过滤掉不合理的直线和交点
  6. 取交点的凸包
  7. 对凸包进行多边形近似,并用它来获取四个角
  8. 应用透视/单应性变换

输出的点(用于计算透视变换)是已知的,因为我们假设书的长宽比是已知的(也就是书的尺寸)。

在一些背景比较单一的图片中,这个方法是有效的(大约1/3到1/2的“好”图片)。在尝试了比较简单的凸包方法和更复杂的四边形枚举方法后,我得出结论,仅靠几何/空间信息可能无法解决这个问题——可能还需要结合颜色/纹理信息(考虑到180度旋转或倒置的书,这一点就很明显)。

显而易见的挑战是,书的封面种类几乎是无限的,背景的种类也是几乎无限的。因此,解决一般情况几乎是不可能的,或者至少非常困难。我在开始这个任务时就知道这一点。但我希望这会是一个有时能找到解决方案的问题。

我考虑过的其他方法包括识别书名/文字来判断方向或大致位置。另一个可能有用的方法是某种基于学习的分类器。

我正在进行的一个相关子任务是实现同样的目标,但在网络摄像头的视频流中。这肯定更简单,因为我可以利用时间信息(也就是在不同帧中的位置)。我昨天刚开始这个任务,但在一些初步进展后遇到了瓶颈。人手持书会产生背景运动噪声,这会干扰像帧差分/背景减除这样的简单方法。不过,与静态图像的问题相比,我觉得这个任务更可行。

抱歉说得有点长。我想确保我尽量清楚地表达出问题。大家觉得怎么样?有没有人对这些问题的解决方法有什么想法?

1 个回答

0

用4条线来计算单应性,而不是用4个点,这样做会有帮助吗?你可能知道,如果点之间的关系是p2=Hp1,那么线之间的关系就是l2=H-1l1。书的边缘上的线应该很明显,特别是当变形不大的时候。你主要的问题是选择正确的线吗?(你并没有具体说出你的问题是什么)也许某种霍夫变换的矩形可以帮助找到这些线?

总之,选择线作为单应性输入还有一个额外的好处,那就是使用RANSAC算法进行单应性计算时,如果对长宽比有约束,可能会把正确的线保留下来,即使背景中有很多干扰点。而如果这些干扰点混进来,它们可能看起来像是另一本书。

撰写回答