массивы — график центроида определенного BLOB-объекта в C ++ OpenCV

Я пытаюсь построить центроид определенного шарика, обнаруженного с использованием контуров. Я не хочу перебирать все капли, обнаруженные на изображении — я только хочу построить центроид одного (то есть контур [2]). В идеале я хотел бы сделать это, используя самый эффективный / быстрый метод.

Вот мой код:

#include "opencv2/highgui/highgui.hpp"#include "opencv2/opencv.hpp"#include <iostream>
#define _USE_MATH_DEFINES
#include <math.h>

using namespace cv;
using namespace std;

int main(int argc, const char** argv)
{
cv::Mat src = cv::imread("frame-1.jpg");
if (src.empty())
return -1;

cv::Mat gray;
cv::cvtColor(~src, gray, CV_BGR2GRAY);

cv::threshold(gray, gray, 160, 255, cv::THRESH_BINARY);

// Find all contours
std::vector<std::vector<cv::Point> > contours;
cv::findContours(gray.clone(), contours, CV_RETR_EXTERNAL, CV_CHAIN_APPROX_NONE);

// Fill holes in each contour
cv::drawContours(gray, contours, -1, CV_RGB(255, 255, 255), -1);

cout << contours.size();

double avg_x(0), avg_y(0); // average of contour points
for (int j = 0; j < contours[2].size(); ++j)
{
avg_x += contours[2][j].x;
avg_y += contours[2][j].y;
}

avg_x /= contours[2].size();
avg_y /= contours[2].size();
cout << avg_x << " " << avg_y << endl;

cv::circle(gray, {avg_x, avg_y}, 5, CV_RGB(5, 100, 100), 5);

namedWindow("MyWindow", CV_WINDOW_AUTOSIZE);
imshow("MyWindow", gray);

waitKey(0);

destroyWindow("MyWindow");

return 0;
}

Однако построение круга с использованием координат (avg_x, avg_y) приводит к отсутствию экземпляра конструктора cv :: Point_<Tp> :: Точка[with_Tp = int] «соответствует списку аргументов — типы аргументов: (double, double) ‘error.

0

Решение

Используйте мин, окружающий круг

float radius ;
Point2f center ;
minEnclosingCircle ( contours[i] , center , radius ) ;cv::circle(gray, center, 5, CV_RGB(5, 100, 100), 5);
0

Другие решения