My failing code snippet is the following:
cv::normalize(cross_correlation_centered_, cross_correlation_centered_, 0,
1.0, cv::NORM_MINMAX);
// Circles experiment:
Timer timer;
timer.start();
vision::soft_threshold(cross_correlation_centered_,
cross_correlation_centered_, 0.6, 4.0);
cv::Mat gray;
cv::Rect roi(cv::Point(peak.x - 50, peak.y - 50),
cv::Point(peak.x + 50, peak.y + 50));
vision::convert_and_scale(cross_correlation_centered_(roi), gray, CV_8U);
cv::GaussianBlur(gray, gray, {3, 3}, 0.0, 0.0);
static int index = 0;
cv::imwrite("circles_input" + std::to_string(index++) + ".png", gray);
auto ed = cv::ximgproc::createEdgeDrawing();
ed->detectEdges(gray);
cv::Mat edges;
ed->getEdgeImage(edges);
cv::imshow("Edges", edges);
std::vector<cv::Vec6d> ellipses;
ed->detectEllipses(ellipses);
LOG(DEBUG) << "Found " << ellipses.size() << " ellipses";
for(const auto& e : ellipses) {
cv::ellipse(gray, {e[0], e[1]}, {e[2] + e[3], e[2] + e[4]}, e[5], 0,
360, {128}, 2, cv::LINE_AA);
}
LOG(DEBUG) << "Circles: " << timer.stop().elapsed_ms() << "ms";
cv::imshow("Circles", gray);
Removing unnecessary calls to cv::imshow
, getEdgeImage
, and cv::ellipse
, etc. makes no difference.