使用顶点检测从对象中查找顶点

时间:2014-10-25 09:59:16

标签: algorithm opencv javacv edge-detection vertex

我想找到黑色物体的所有顶点(例如返回x,y位置)。 我将使用Java和JavaCV来实现。是否有任何API或算法可以提供帮助?

抱歉没有足够的声誉来发布图片。我在这里发布链接。

原始图像如下:

http://i.stack.imgur.com/geubs.png

预期结果如下:

http://i.stack.imgur.com/MA7uq.png

2 个答案:

答案 0 :(得分:0)

OpenCV允许您拍摄二进制图像并执行轮廓分析。

http://docs.opencv.org/doc/tutorials/imgproc/shapedescriptors/find_contours/find_contours.html

您可以使用findContours查找所有轮廓(所有边缘点),然后简单地平均它们或选择适合您目的的轮廓。

这是JavaCV的一个很好的例子..

opencv/javacv: How to iterate over contours for shape identification?

答案 1 :(得分:0)

以下是您应该做的事情(有关解释,请参阅代码注释),

<强> CODE

System.loadLibrary(Core.NATIVE_LIBRARY_NAME);

// Load the image
String path = "/home/bikz05/Desktop/geubs.png";
Mat original = Highgui.imread(path);
Mat image = new Mat();
Imgproc.cvtColor(original, image, Imgproc.COLOR_BGR2GRAY);

// Threshold the image
Mat threshold = new Mat();
Imgproc.threshold(image, threshold, 127, 255, 1);

// Find the contours
List<MatOfPoint> contours = new ArrayList<MatOfPoint>();
Imgproc.findContours(threshold, contours, new Mat(), Imgproc.RETR_LIST, Imgproc.CHAIN_APPROX_SIMPLE);

// Get contour index with largest area
double max_area = -1;
int index = 0;
for(int i=0; i< contours.size();i++) {
    if (Imgproc.contourArea(contours.get(i)) > max_area) {
        max_area = Imgproc.contourArea(contours.get(i));
        index = i;
    }   
}

// Approximate the largest contour
MatOfPoint2f approxCurve = new MatOfPoint2f();
MatOfPoint2f oriCurve = new MatOfPoint2f( contours.get(index).toArray() );
Imgproc.approxPolyDP(oriCurve, approxCurve, 6.0, true);

// Draw contour points on the original image
Point [] array = approxCurve.toArray();
for(int i=0; i < array.length;i++) {
    Core.circle(original, array[i], 2, new Scalar(0, 0 ,255), 2);
}

INPUT IMAGE
enter image description here

输出图片

enter image description here