TiansHUo
TiansHUo

Reputation: 8639

How do I find a rectangle in a photo using iphone?

I will need to identify, rotate and crop a rectangle(business card) from a photo took from an iphone. I believe this can be done by using OpenCV, but I have not used it before. Could anyone give some tips on this?

Upvotes: 6

Views: 7698

Answers (6)

Ded77
Ded77

Reputation: 218

From iOS 8, you can now use the new detector CIDetectorTypeRectangle that returns CIRectangleFeature. You can add options :

  • Accuracy : low/hight
  • Aspect ratio : 1.0 if you want to find only squares for example

    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;
    }
    

More information in WWDC 2014 Advances in Core Image, Session 514.

An example from shinobicontrols.com

Upvotes: 14

Zindarod
Zindarod

Reputation: 21

If you know the approximate height and width of the rectangle then you can do the following steps:

  • Object detection: component labeling using contour tracing.
  • After all the objects have been labeled then filter the detected components by calculating the perimeter of the rectangle. P=2*(H+W) Any component having the size of less than or greater than P is ignored, only the components closer to P in size is retained.
  • Find corner points of the rectangle from the contour points.
  • Extract the rectangle from the original image.

All of the above steps can be done using either OpenCV or Aforge.Net, I have personally done it using Aforge.Net.

Upvotes: 2

Nauhc
Nauhc

Reputation: 185

I think goodFeaturesToTrack() is easier to use for Harris-Corner detection. CornerHarris() needs to set outout image to be specific type.

Upvotes: 1

Andrey Sboev
Andrey Sboev

Reputation: 7682

See opencv sample code OpenCV2.2\samples\cpp\squares.cpp. They do the following:

  • Detect edges using Canny

  • Retrieve contours by findContours

  • For each contour

    • approximate contour using approxPolyDP to decrease number of vertices

    • if contour has 4 vertices and each angle is ~90 degrees then yield a rectangle

Upvotes: 8

M456
M456

Reputation: 5797

Depending on the viewpoint, the card may end up not being a rectangle but more of a trapezoid. You can use HoughLines2 in OpenCV to identify the edges in the image and try to identify the 4 edges that are most likely to be the edges of the business card.

Upvotes: 2

bjoernz
bjoernz

Reputation: 3852

To get you started, you should look at the feature detection api of OpenCV. Especially

  • cv::Canny (for edge detection),
  • maybe cv::cornerHarris (for corner detection),
  • and cv::HoughLines (for finding straight lines in the edge image).

HTH

Upvotes: 2

Related Questions