0

I am trying to port this response to c++ but I am not able to get past this cryptic exception (see image below). Not sure what is the limiting factor. I imagine it is the image color format or the corners parameter but nothing seems to be working. If it is related to converting color format please provide a small code snippet.

The python code provided by Anubhav Singh is working great however I would like to develop in c++. Any help would be greatly appreciated.

I am using OpenCV04.2.0

enter image description here

void CornerDetection(){
std::string image_path = samples::findFile("../wing.png");
Mat img = imread(image_path);

Mat greyMat;
Mat dst;

cv::cvtColor(img, greyMat, COLOR_BGR2GRAY);
threshold(greyMat, greyMat, 0, 255, THRESH_BINARY | THRESH_OTSU);

cornerHarris(greyMat, dst, 9, 5, 0.04);
dilate(dst, dst,NULL);

Mat img_thresh;
threshold(dst, img_thresh, 0.32 * 255, 255, 0);
img_thresh.convertTo(img_thresh, CV_8UC1);

Mat labels = Mat();
Mat stats = Mat();
Mat centroids = Mat();
cv::connectedComponentsWithStats(img_thresh, labels, stats, centroids, 8, CV_32S);
TermCriteria criteria = TermCriteria(TermCriteria::EPS + TermCriteria::MAX_ITER, 30, 0.001);

std::vector<Point2f> corners = std::vector<Point2f>();

Size winSize = Size(5, 5);
Size zeroZone = Size(-1, -1);
cornerSubPix(greyMat, corners, winSize, zeroZone, criteria);

for (int i = 0; i < corners.size(); i++)
{
    circle(img, Point(corners[i].x, corners[i].y), 5, Scalar(0, 255, 0), 2);
}

imshow("img", img);
waitKey();
destroyAllWindows();

}

enter image description here

JCoder
  • 75
  • 5

1 Answers1

0

The solution was to iterate over the centroids to build the corners vector before passing the corners variable to the cornerSubPix(...) function.

std::vector<Point2f> corners = std::vector<Point2f>();

for (int i = 0; i < centroids.rows; i++)
{
    double x = centroids.at<double>(i, 0);
    double y = centroids.at<double>(i, 1);
    corners.push_back(Point2f(x, y));
}

The output of the solution is still not exactly what the python output is, regardless it fixed this question in case anyone else ran across this issue.

JCoder
  • 75
  • 5