使用OpenCV4Android查找对象的中心

时间:2017-06-19 01:14:56

标签: java android opencv4android

前段时间我在Python中使用OpenCV编写了一个代码来查找对象的中心:

x= np.zeros(4)
y = np.zeros(4)
i = 0
for cnt in contour:
    area = cv2.contourArea(cnt)
    if area>=100 and area<=5000:
        hull = cv2.convexHull(cnt)
        x[i] = hull[:,:,0].mean()
        y[i] = hull[:,:,1].mean()
        i = i + 1

由于OpenCV也有Java接口,我想在Android应用程序中实现此代码。我写了一些类似的代码,但我没有得到我想要的东西。 mopOut只是提供一些我不需要的随机内容:

for(int i=0; i< contours.size();i++) {
        if (Imgproc.contourArea(contours.get(i)) > 1000 && Imgproc.contourArea(contours.get(i)) < 10000 ) {
            Imgproc.convexHull(contours.get(i),hull);
            MatOfPoint mopOut = new MatOfPoint();
            mopOut.create((int)hull.size().height,1, CvType.CV_32SC2);
            for(int j = 0; j < hull.size().height ; j++)
            {
                int index = (int)hull.get(j, 0)[0];
                double[] point = new double[] {
                        contours.get(i).get(index, 0)[0], contours.get(i).get(index, 0)[1]
                };
                mopOut.put(i, 0, point);
            }
        }
    }

有人可以告诉我正确的方法吗?或者其他任何更好的替代方式来寻找中心?

我是Java和Android应用程序开发的新手,所以我可能会遗漏一些简单的东西。谢谢你的帮助!

1 个答案:

答案 0 :(得分:0)

所以最后我设法在Java中编写了类似的代码:

int k = 0;
for(int i=0; i< contours.size();i++) {
   if (Imgproc.contourArea(contours.get(i)) > 1000 && Imgproc.contourArea(contours.get(i)) < 10000 ) {
       Scalar colour = new Scalar(90,255,255);
       Imgproc.drawContours(image,contours,i,colour,-1);
       Imgproc.convexHull(contours.get(i),hull);
       List<Point> l = new ArrayList<Point>();
       l.clear();
       double sum_x = 0;
       double sum_y = 0;
       int j;
       for (j = 0; j < hull.size().height; j++) {
           l.add(contours.get(i).toList().get(hull.toList().get(j)));
           sum_x += l.get(j).x;
           sum_y += l.get(j).y;
       }
       x[0][k] = sum_x / j;
       x[1][k] = sum_y / j;
       k++;
   }
}