如何使用 iPhone 在照片中找到一个矩形?

6

我需要从iPhone拍摄的照片中识别、旋转和裁剪一个矩形(名片)。我相信可以使用OpenCV来完成,但我以前没有使用过。有人能给些关于此方面的提示吗?

6个回答

14
iOS 8 开始,现在可以使用新的检测器 CIDetectorTypeRectangle,它返回 CIRectangleFeature。 您可以添加以下选项:
  • 准确性: 低/高
  • 宽高比: 如果你只想找到正方形,就设为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。

shinobicontrols.com的示例


8

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

  • 使用Canny检测边缘

  • 通过findContours检索轮廓

  • 对于每个轮廓

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

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


我不理解的是,如果在某些地方背景色可以接近前景色,那么在已知原始图像为矩形的情况下,我如何仍然找到边缘。 - TiansHUo
这是一个有趣的问题。似乎没有通用解决方案。我首先想到的是:如果您对目标对象有一些先验信息(例如颜色直方图或纹理特征),那么您可以定位包含目标的图像区域,并将边界轮廓设置为初始猜测,然后应用主动轮廓方法来改善结果。 - Andrey Sboev

2
为了帮助您入门,建议您查看OpenCV的特征检测API,尤其是以下内容:
  • cv::Canny(用于边缘检测)
  • 可能还有cv::cornerHarris(用于角点检测)
  • 以及cv::HoughLines(用于在边缘图像中找到直线)
希望对您有所帮助。

2

根据不同的角度,名片可能会变成梯形而非矩形。您可以使用OpenCV中的HoughLines2来识别图像中的边缘,并尝试识别最有可能是名片边缘的四条边。


你是说除了旋转之外,我还需要对照片进行倾斜处理吗?我正在考虑相机通常面向名片的情况。 - TiansHUo

2
如果您知道矩形的大致高度和宽度,则可以执行以下步骤:
  • 对象检测:使用轮廓跟踪进行组件标记。
  • 在所有对象都已标记后,通过计算矩形的周长来过滤检测到的组件。P=2*(H+W)。忽略大小小于或大于P的任何组件,只保留尺寸接近P的组件。
  • 从轮廓点找到矩形的角点。
  • 从原始图像中提取矩形。
以上所有步骤都可以使用OpenCV或Aforge.Net完成,我个人使用Aforge.Net完成了这些步骤。

1

我认为使用goodFeaturesToTrack()更容易进行Harris-Corner检测。CornerHarris()需要设置输出图像的特定类型。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接