2016-04-30 13 views
0

Я рисую круг с фиксированным входом. Теперь я действительно хочу, чтобы вектор всех точек в этом круге включал заполненную область внутри. Я попробовал код ниже, но он получил только границу. Я не могу использовать функцию Contours, потому что я использовал ее много раз, поэтому это было бы очень сложно. Пожалуйста, дайте мне совет, спасибо большоенайти все точки по кругу

vector<Point> allpoints; 
Point center = Point(370, 200); 

void getPoints() 
{ 
    Size axes(20, 20); 
    ellipse2Poly(center, axes, 0, 0, 360, 1, allpoints); 
} 

void draw(Mat &BGR_frame) 
{ 
    circle(BGR_frame, center, 20, Scalar(0, 255, 0),CV_FILLED ,2); 
    getPoints(); 
} 
+0

Некоторые изображения и лучшее объяснение/определение проблемы помогут. Проблема неясна. –

+1

Вы считали расчет эвклидовым расстоянием от выбранного вами центра? Если он меньше радиуса (20), вы можете push_back() точку в вашем векторе –

ответ

1

Простой подход, чтобы нарисовать круг на черном инициализированную маске, и извлекать без черных точек оттуда:

void draw(Mat &BGR_frame) 
{ 
    circle(BGR_frame, center, 20, Scalar(0, 255, 0),CV_FILLED ,2); 

    // Black initialized mask, same size as 'frame' 
    Mat1b mask(frame.rows, frame.cols, uchar(0)); 

    // Draw white circle on mask 
    circle(mask, center, 20, Scalar(255), CV_FILLED, 2); 

    // Find non zero points on mask, and put them in 'allpoints' 
    findNonZero(mask, allpoints); 
} 

В качестве альтернативы, вы можете сканировать все пиксели матрицы и сохранять точки, которые удовлетворяют уравнению внутренних точек окружности:

Point c(370, 200); 
int r = 20; 

void draw(Mat &BGR_frame) 
{   
    circle(BGR_frame, c, r, Scalar(0, 255, 0),CV_FILLED ,2); 

    for (int y = 0; y < mask.rows; ++y) { 
     for (int x = 0; x < mask.cols; ++x) { 

      // Check if this is an internal point 
      if ((x - c.x)*(x - c.x) + (y - c.y)*(y - c.y) <= (r*r)) { 
       allpoints.push_back(Point(x,y)); 
      } 
     } 
    } 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^