Извините за код C ++, но он работает для вашего случая:
cv::Mat gray = cv::imread("Sq01a.png", cv::IMREAD_GRAYSCALE);
gray = 255 - gray;
cv::Mat bin;
cv::threshold(gray, bin, 1, 255, cv::THRESH_BINARY);
cv::Mat bigBin(2 * bin.rows, 2 * bin.cols, CV_8UC1, cv::Scalar(0));
bin.copyTo(cv::Mat(bigBin, cv::Rect(bin.cols / 2, bin.rows / 2, bin.cols, bin.rows)));
std::vector<std::vector<cv::Point> > contours;
cv::findContours(bigBin, contours, cv::RETR_EXTERNAL, cv::CHAIN_APPROX_NONE);
if (contours.size() > 0)
{
std::vector<cv::Point> tmp = contours[0];
const cv::Point* elementPoints[1] = { &tmp[0] };
int numberOfPoints = (int)tmp.size();
cv::fillPoly(bigBin, elementPoints, &numberOfPoints, 1, cv::Scalar(255, 255, 255), 8);
}
int maxCorners = 20;
double qualityLevel = 0.01;
double minDistance = bigBin.cols / 8;
int blockSize = 5;
bool useHarrisDetector = true;
double k = 0.04;
std::vector<cv::Point2f> corners;
cv::goodFeaturesToTrack(bigBin, corners, maxCorners, qualityLevel, minDistance, cv::noArray(), blockSize, useHarrisDetector, k);
std::vector<cv::Point2f> resCorners;
std::vector<cv::Point2f> imgCorners = { cv::Point2f(0, 0), cv::Point2f(bigBin.cols, 0), cv::Point2f(bigBin.cols, bigBin.rows), cv::Point2f(0, bigBin.rows) };
for (auto imgCorn : imgCorners)
{
size_t best_i = corners.size();
float min_dist = bigBin.cols * bigBin.rows;
for (size_t i = 0; i < corners.size(); ++i)
{
float dist = cv::norm(imgCorn - corners[i]);
if (dist < min_dist)
{
best_i = i;
min_dist = dist;
}
}
if (best_i != corners.size())
{
resCorners.push_back(corners[best_i]);
}
}
cv::Mat bigColor;
cv::cvtColor(bigBin, bigColor, cv::COLOR_GRAY2BGR);
for (auto corner : corners)
{
cv::circle(bigColor, corner, 10, cv::Scalar(0, 0, 255.), 1);
}
for (auto corner : resCorners)
{
cv::circle(bigColor, corner, 5, cv::Scalar(0, 255, 0), 2);
}
cv::imshow("gray", gray);
cv::imshow("bigColor", bigColor);
cv::waitKey(0);
Здесь красные круги - углы от Харриса и зеленые - самые близкие к углам изображения.Это нормально?
![Result:](https://i.stack.imgur.com/BGYh5.png)