Я использую OpenCV4Android версии 2.4.11, и я обнаруживаю любые прямоугольные формы в кадрах, полученных камерой. Как показано на рисунке 1 ниже, я рисую контур черного цвета вокруг обнаруженного объекта, и то, что я пытаюсь сделать , состоит в том, чтобы получить все координаты нарисованного контура, который ТОЛЬКО нарисован черным. Я попытался, как показано в code_1 ниже, я получаю самый большой контур и индекс самого большого контура и сохраняю их в «mostContour» и «most_contour_index» соответственно. Затем я рисую контур с помощьюКак получить координаты контура
Imgproc.drawContours(mMatInputFrame, contours, largest_contour_index, new Scalar(0, 0, 0), 2, 8, hierachy, 0, new Point());
, а затем я перехожу точки наибольшего контура к классу FindCorners, потому что я хочу, чтобы найти конкретные координаты контура обращается в черный следующим образом:
this.mFindCorners = new FindCorners(largestContour.toArray());
double[] cords = this.mFindCorners.getCords();
следующая строка кода:
double[] cords = this.mFindCorners.getCords();
должен дает мне Smalle координаты х, наименьшее у-координаты, крупнейшие х-координаты и крупнейшие у-координаты. Но когда я рисую круг вокруг координат, которые я получил от «this.mFindCorners.getCords();» Я получил что-то вроде в image_2 ниже, что является лишь углами BoundingRect.
На самом деле я не хочу никаких координат из boundingRect я хочу, чтобы иметь доступ к координатам контура, который обращается вокруг обнаруженного объекта в Бальке
пожалуйста, дайте мне знать, как получить координаты контура сам?
code_1:
if (contours.size() > 0) {
for (int i = 0; i < contours.size(); i++) {
contour2f = new MatOfPoint2f(contours.get(i).toArray());
approxDistance = Imgproc.arcLength(contour2f, true) * .01;//.02
approxCurve = new MatOfPoint2f();
Imgproc.approxPolyDP(contour2f, approxCurve, approxDistance, true);
points = new MatOfPoint(approxCurve.toArray());
double area = Math.abs(Imgproc.contourArea(points, true));
if (points.total() >= 4 && area >= 40000 && area <= 200000) {
if (area > largest_area) {
largest_area = area;
largest_contour_index = i;
pointsOfLargestContour = points;
largestContour = contours.get(i);
}
}
}
if (largest_area > 0) {
Imgproc.drawContours(mMatInputFrame, contours, largest_contour_index, new Scalar(0, 0, 0), 2, 8, hierachy, 0, new Point());
this.mFindCorners = new FindCorners(largestContour.toArray());
double[] cords = this.mFindCorners.getCords();
Core.circle(mMatInputFrame, new Point(cords[0], cords[1]), 10, new Scalar(255, 0, 0));
Core.circle(mMatInputFrame, new Point(cords[2], cords[3]), 10, new Scalar(255, 255, 0));
}
FindCorners:
public class FindCorners {
private final static String TAG = FragOpenCVCam.class.getSimpleName();
private ArrayList<Double> mlistXCords = null;
private ArrayList<Double> mlistYCords = null;
private double mSmallestX;
private double mSmallestY;
private double mLargestX;
private double mLargestY;
private double[] mCords = null;
public FindCorners(Point[] points) {
this.mlistXCords = new ArrayList<>();
this.mlistYCords = new ArrayList<>();
this.mCords = new double[4];
Log.d(TAG, "points.length: " + points.length);
for (int i = 0; i < points.length; i++) {
this.mlistXCords.add(points[i].x);
this.mlistYCords.add(points[i].y);
}
//ascending
Collections.sort(this.mlistXCords);
Collections.sort(this.mlistYCords);
this.mSmallestX = this.mlistXCords.get(0);
this.mSmallestY = this.mlistYCords.get(0);
this.mLargestX = this.mlistXCords.get(this.mlistXCords.size() - 1);
this.mLargestY = this.mlistYCords.get(this.mlistYCords.size() - 1);
this.mCords[0] = this.mSmallestX;
this.mCords[1] = this.mSmallestY;
this.mCords[2] = this.mLargestX;
this.mCords[3] = this.mLargestY;
}
public double[] getCords() {
return this.mCords;
}
}
image_1:
IMAGE_2:
обновление я не хочу иметь координаты ограничивающего прямоугольника, то, что я хочу иметь это, точные координаты черного контура , как показано на рисунке_3, координаты, которые я получаю от своего кода, - это где красные и желтые круги ... но я ищу доступ к координатам черной линии «контур», поэтому я могу нарисовать на ней несколько кругов, как показано на рисунке image_3. зеленые пятна - это просто показать вам, где я хочу иметь координаты.
image_3:
_should дает мне Smalle координаты х, наименьшие у-координаты, самые большие координаты х и по величине у-coordinates._ Эти ** ** являются координаты ограничивающей коробка. Вероятно, вам нужно 4 угла после 'approxPolyDP' вместо – Miki
@Miki, как вы видите в моем коде, у меня есть следующая строка: Imgproc.approxPolyDP (contour2f, approxCurve, approxDistance, true); черный контур, содержащийся в "approxCurve" ?? – user2121
черный контур 'mostContour' – Miki