Reputation: 8639
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
Reputation: 218
From iOS 8, you can now use the new detector CIDetectorTypeRectangle that returns CIRectangleFeature. You can add options :
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
Reputation: 21
If you know the approximate height and width of the rectangle then you can do the following steps:
All of the above steps can be done using either OpenCV or Aforge.Net, I have personally done it using Aforge.Net.
Upvotes: 2
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
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
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
Reputation: 3852
To get you started, you should look at the feature detection api of OpenCV. Especially
cv::Canny
(for edge detection), cv::cornerHarris
(for corner detection), cv::HoughLines
(for finding straight lines in the edge image).HTH
Upvotes: 2