开发者

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

开发者 https://www.devze.com 2023-03-08 16:49 出处:网络
I will need to identify, rotate and crop a rectangle(business card) from a photo to开发者_如何学运维ok from an iphone. I believe this can be done by using OpenCV, but I have not used it before. Could

I will need to identify, rotate and crop a rectangle(business card) from a photo to开发者_如何学运维ok 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?


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


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


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


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.


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.


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

0

精彩评论

暂无评论...
验证码 换一张
取 消