如何传递和使用JavaCV HoughCircles方法

时间:2015-10-20 07:57:47

标签: java javacv mat hough-transform

我尝试使用HoughCircles方法的JavaCV实现,但我遇到了一些参数问题。 这是我的代码:

Mat currentImageGray = tgtFrag.getImage().clone();
Mat detectedCircles = new Mat();

HoughCircles(currentImageGray, detectedCircles, CV_HOUGH_GRADIENT, 1, 2, 254, 25, tgtFrag.getImage().rows() / 4, 0 );

if (detectedCircles != null && !detectedCircles.empty()) {
    // TO DO:
    // Print the center and the raidus of the detected circles.
}

首先,检测结果(HoughCircles的第二个段)以Mat(detectedCircles)给出。

我想处理detectedCircles Mat并以某种方式打印控制台上的圆心和半径。到目前为止,我的尝试失败了:我一直尝试使用detectedCircles来迭代FloatBufferIndexer,可能是正确的方向,但我还没有成功,任何人都可以提供帮助?< / p>

请注意以下事项:

  • 我使用的是JavaCV,而不是openCV。
  • 我使用的是JavaCV HoughCircles,而不是cvHoughCircles(使用cvHoughCircles的解决方案也可以。)
  • 我使用的是最新版本的JavaCV,即1.0(2015年7月)。

1 个答案:

答案 0 :(得分:1)

我只能使用JavaCV cvHoughCircles方法,但不知道如何使用HoughCircles方法。这是我对你的代码的改编。

// Get the source Mat.
Mat myImage = tgtFrag.getImage();
IplImage currentImageGray = new IplImage(myImage);
CvMemStorage mStorage = CvMemStorage.create();

CvSeq detectedCircles = cvHoughCircles(currentImageGray, mStorage, CV_HOUGH_GRADIENT, 1, 2, 254, 25, tgtFrag.getImage().rows() / 4, 0);

if (detectedCircles != null && detectedCircles.total() > 0) {

    for (int i = 0; i < detectedCircles.total(); i++) {
        CvPoint3D32f curCircle = new CvPoint3D32f(cvGetSeqElem(detectedCircles, i));

        int curRadius = Math.round(curCircle.z());
        Point curCenter = new Point(Math.round(curCircle.x()), Math.round(curCircle.y()));

        System.out.println(curCenter);
        System.out.println(curRadius);      
    }

}

即使这不能直接解决您的问题,但我希望这可能有所帮助。