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 verticesif 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.
精彩评论