Как получить X и Y обнаруженных кругов? - PullRequest
0 голосов
/ 24 мая 2019

Я хочу извлечь круги и изображение, поэтому я извлекаю их с кодом ниже:

Mat circles = new Mat();
Imgproc.HoughCircles(adaptiveThresh, circles, Imgproc.HOUGH_GRADIENT, 1.0, (double) adaptiveThresh.rows() / 40, 100.0, 30.0, 20, 30);

И затем я перебираю их с кодом ниже:

for (int x = 0; x < circles.cols(); x++) {
    double[] c = circles.get(0, x);
    Point center = new Point(Math.round(c[0]), Math.round(c[1]));
    int radius = (int) Math.round(c[2]);
    Imgproc.circle(source, center, radius, new Scalar(0, 0, 255), 3);
}

Но яхочу отсортировать их от верхнего до нижнего правого, и проблема в том, что я не могу получить доступ к x и y из circles!
Как я могу отсортировать их по строке сверху вниз слева направо?

Ответы [ 2 ]

0 голосов
/ 24 мая 2019

Вот что вам нужно сделать:

  1. Сначала объявите класс Circle (для инкапсуляции свойств окружности в целях сортировки)
class Circle {
    int cX;
    int cY;
    int radius;
    double distance;
}
Теперь переберите результат HoughCircles, создайте экземпляр Circle и добавьте его в список
List<Circle> circleList = new ArrayList<>();
//start point, it is used to calculate the distance
Point p1 = new Point(0, 0);
for (int x = 0; x < circles.cols(); x++) {
    double[] c = circles.get(0, x);
    Point center = new Point(Math.round(c[0]), Math.round(c[1]));
    int radius = (int) Math.round(c[2]);
    Imgproc.circle(source, center, radius, new Scalar(0, 0, 255), 3);

    // here create the Circle instance
    Circle circle = new Circle();
    cricle.cX = center.x;
    circle.cY = center.y;
    circle.radius= radius;

    double D = Math.sqrt(Math.pow(abs(p1.x - circles.x), 2) + Math.pow(abs(p1.y - circles.y), 2));
    circle.distance = D;

    // add the circle instance to the list
    circleList.add(circle);
}
Теперь сортируйте кружки в списке, используйте расстояние от маленького к большему
circleList.sort(new Comparator<File>() {
    @Override
    public int compare(Circle c1, Circle c2) {
        return Double.compare(c1.distance, c2.distance);
    }
});

Теперь вы можете делать то, что вы хотите с помощью списка кружков.

надеюсь, это поможет !!

0 голосов
/ 24 мая 2019

Ваш вопрос может сбить с толку. Как это может быть (1) сортировать расстояние до круга в левом верхнем углу изображения. (2) отсортировать расстояние от левого верхнего края каждого кружка до левого верхнего угла изображения?

Я предполагаю, что вы хотите найти круг, который наиболее близок к верхнему левому регистру (1).

Вот мой ответ.

Из примера C ++ (я полагаю, вы используете Android, не очень знакомый). Вы можете конвертировать, используя мой пример кода ниже.

   for( size_t i = 0; i < circles.size(); i++ )
      {
          Point center(cvRound(circles[i][0]), cvRound(circles[i][1]));
          int radius = cvRound(circles[i][2]);
          // circle center
          circle( src, center, 3, Scalar(0,255,0), -1, 8, 0 );
          // circle outline
          circle( src, center, radius, Scalar(0,0,255), 3, 8, 0 );
       }

центр должен быть точкой, которую вы хотите.

Чтобы отсортировать их слева направо, используя расстояние от городских кварталов, вам нужно просто набрать

void sort_points (std::vector<Vec3f> &array)
{
    std::cout<<"Elements in the array: "<<array.size()<<std::endl;

    //comparisons will be done n times
    for (int i = 0; i < array.size(); i++)
    {
        //compare elemet to the next element, and swap if condition is true
        for(int j = 0; j < array.size() - 1; j++)
        {   
            if ((array[j][0]+array[j][1]) > (array[j+1][0]+ array[j+1][1])
                Swap(&array[j], &array[j+1]);
        }
    }
}



int main(argc,argv)
// ...................//do your stuff

    vector<Vec3f> circles; //detected circle

   // ... //do the detection 

    sort_points(circles);
    //circles here is fully sorted from city block distance
    std::cout<<circles<<std::endl; // print out all sorted circile

// ...................//do your stuff

}

если это 2-й случай, просто измените, если на

if ((array[j][0]+array[j][1]-2*array[j][2]) > (array[j+1][0]+ array[j+1][1]-2*array[j+1][2])
...