Ответ 1
Возьмите для справки мой исходный код, который просто обнаруживает квадраты на изображении.
Это означает, что в основном методе приложения вы должны написать что-то вроде следующего псевдокода для вызова find_squares()
:
Mat image = imread("test.jpg", 1);
// Detect all regions in the image that are similar to a rectangle
vector<vector<Point> > squares;
find_squares(image, squares);
// The largest of them probably represents the paper
vector<Point> largest_square;
find_largest_square(squares, largest_square);
// Print the x,y coordinates of the square
cout << "Point 1: " << largest_square[0] << endl;
cout << "Point 2: " << largest_square[1] << endl;
cout << "Point 3: " << largest_square[2] << endl;
cout << "Point 4: " << largest_square[3] << endl;
Трюк опирается на find_largest_square()
, представленный ниже:
void find_largest_square(const vector<vector<Point> >& squares, vector<Point>& biggest_square)
{
if (!squares.size())
{
// no squares detected
return;
}
int max_width = 0;
int max_height = 0;
int max_square_idx = 0;
const int n_points = 4;
for (size_t i = 0; i < squares.size(); i++)
{
// Convert a set of 4 unordered Points into a meaningful cv::Rect structure.
Rect rectangle = boundingRect(Mat(squares[i]));
// cout << "find_largest_square: #" << i << " rectangle x:" << rectangle.x << " y:" << rectangle.y << " " << rectangle.width << "x" << rectangle.height << endl;
// Store the index position of the biggest square found
if ((rectangle.width >= max_width) && (rectangle.height >= max_height))
{
max_width = rectangle.width;
max_height = rectangle.height;
max_square_idx = i;
}
}
biggest_square = squares[max_square_idx];
}