【问题标题】:How do I find a rectangle in a photo using iphone?如何使用 iphone 在照片中找到矩形?
【发布时间】:2011-09-02 07:26:04
【问题描述】:

我需要从 iPhone 拍摄的照片中识别、旋转和裁剪一个矩形(名片)。我相信这可以通过使用 OpenCV 来完成,但我之前没有使用过。有人可以提供一些建议吗?

【问题讨论】:

    标签: iphone ipad image-processing opencv image-recognition


    【解决方案1】:

    iOS 8 开始,您现在可以使用返回 CIRectangleFeature 的新检测器 CIDetectorTypeRectangle。 您可以添加选项:

    • 准确度:低/高
    • 纵横比:例如,如果您只想找到正方形,则为 1.0

      CIImage *image = // your image
      NSDictionary *options = @{CIDetectorAccuracy: CIDetectorAccuracyHigh, CIDetectorAspectRatio: @(1.0)};
      CIDetector *rectangleDetector = [CIDetector detectorOfType:CIDetectorTypeRectangle context:nil options:options];
      
      NSArray *rectangleFeatures = [rectangleDetector featuresInImage:image];
      
      for (CIRectangleFeature *rectangleFeature in rectangleFeatures) {
          CGPoint topLeft = rectangleFeature.topLeft;
          CGPoint topRight = rectangleFeature.topRight;
          CGPoint bottomLeft = rectangleFeature.bottomLeft;
          CGPoint bottomRight = rectangleFeature.bottomRight;
      }
      

    更多信息在WWDC 2014 Advances in Core Image, Session 514.

    An example from shinobicontrols.com

    【讨论】:

      【解决方案2】:

      查看opencv示例代码OpenCV2.2\samples\cpp\squares.cpp。他们执行以下操作:

      • 使用 Canny 检测边缘

      • 通过findContours检索轮廓

      • 对于每个轮廓

        • 使用approxPolyDP 近似轮廓以减少顶点数

        • 如果轮廓有 4 个顶点,每个角度约为 90 度,则生成一个矩形

      【讨论】:

      • 我不明白的是,如果在某些地方背景可以接近前景色,在给定原始图像是矩形的信息的情况下,我怎么还能找到边缘。
      • 这是一个有趣的问题。似乎不存在普遍的解决方案。首先我想到的是:如果你有一些关于目标对象的先验信息(例如颜色直方图或纹理特征),那么你可以定位一个包含目标的图像区域具有很高的概率并将边界轮廓设置为初始猜测,然后应用 active改善结果的轮廓方法
      【解决方案3】:

      要开始使用,您应该查看 OpenCV 的 feature detection api。特别是

      • cv::Canny(用于边缘检测),
      • 也许是cv::cornerHarris(用于角点检测),
      • cv::HoughLines(用于在边缘图像中查找直线)。

      HTH

      【讨论】:

        【解决方案4】:

        根据不同的视角,卡片最终可能不是矩形,而是更多的梯形。您可以在OpenCV中使用HoughLines2来识别图像中的边缘,并尝试识别出最有可能是名片边缘的4条边缘。

        【讨论】:

        • 你是说除了旋转,我还需要倾斜照片?我正在考虑相机通常正对名片的情况
        【解决方案5】:

        如果您知道矩形的大致高度和宽度,那么您可以执行以下步骤:

        • 对象检测:使用轮廓跟踪进行组件标记。
        • 标记完所有对象后,通过计算矩形的周长过滤检测到的组件。 P=2*(H+W) 任何大小小于或大于 P 的组件都将被忽略,仅保留大小接近 P 的组件。
        • 从轮廓点找到矩形的角点。
        • 从原始图像中提取矩形。

        以上所有步骤都可以使用 OpenCV 或 Aforge.Net 完成,我个人使用 Aforge.Net 完成。

        【讨论】:

          【解决方案6】:

          我认为goodFeaturesToTrack() 更容易用于 Harris-Corner 检测。 CornerHarris()需要将图片设置为特定类型。

          【讨论】:

            猜你喜欢
            • 2021-06-05
            • 2012-03-04
            • 2018-09-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2013-12-15
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多