前段时间我在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应用程序开发的新手,所以我可能会遗漏一些简单的东西。谢谢你的帮助!
答案 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++;
}
}