问题
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?
回答1:
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
回答2:
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
回答3:
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
回答4:
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.
回答5:
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.
回答6:
I think goodFeaturesToTrack()
is easier to use for Harris-Corner detection. CornerHarris()
needs to set outout image to be specific type.
来源:https://stackoverflow.com/questions/6134109/how-do-i-find-a-rectangle-in-a-photo-using-iphone