从Android中的OpenCV Mat获取圆圈矢量?

时间:2011-12-15 20:30:08

标签: java android opencv

我无法从Android中的OpenCV Mat获取圆矢量值。我想使用这个功能:

HoughCircles(Mat image, Mat circles, int method, double dp, double minDist)

然后我想展示找到的圈子。我遇到的问题是如何在此函数中使用circles参数。

所以,问题是:如何在Android中的Mat类型的OpenCV中获取向量中每个元素的3元素向量和值的数量?

3 个答案:

答案 0 :(得分:2)

圈子Mat

for (int i = 0; i < circles.cols(); i++)
{
    double vCircle[] = circles.get(0,i);
    double x = vCircle[0];
    double y = vCircle[1];
    double radius = vCircle[2];
}

答案 1 :(得分:1)

理想情况下,您可能希望使用vector<Vec3f>列表来处理这样的圈子:

vector<Vec3f> circles;

// do HoughCircles...

for(size_t i = 0; i < circles.size(); i++)
{
    Vec3f circle = circles[i];
    Point2f center(circle[0] /* x */, circle[1] /* y */);
    float radius = circle[2];

    // use the circle...
}

编辑:我使用Mat尝试了代码,并且圈子参数似乎存储为1xN矩阵,其中的元素类型为CV_32FC3其中N是检测到的圈数。因此,每列都包含您需要的(x, y, radius)向量。

以下是我用C ++编写的一个示例:

Mat circleImage = imread("circle.png", 0);
Mat circleDisp;

cvtColor(circleImage, circleDisp, CV_GRAY2RGB);

Mat circles;
HoughCircles(circleImage, circles, CV_HOUGH_GRADIENT, 2, circleImage.rows >> 2, 200, 100);

for( size_t i = 0; i < circles.cols; i++ )
{
    Vec3f vCircle = circles.at<Vec3f>(i);

    Point center(cvRound(vCircle[0]), cvRound(vCircle[1]));
    int radius = cvRound(vCircle[2]);
    // draw the circle center
    circle( circleDisp, center, 3, Scalar(0,255,0), -1, 8, 0 );
    // draw the circle outline
    circle( circleDisp, center, radius, Scalar(0,0,255), 3, 8, 0 );
}
namedWindow( "circles", 1 );
imshow( "circles", circleDisp );
waitKey();

希望有所帮助!

答案 2 :(得分:0)

将你的Mat转换为矢量:

HoughCircles(Mat image, Mat circles, int method, double dp, double minDist);

vector<Vec3f> myCircles = (vector<Vec3f>)circles;

或者,更简单

HoughCircles(Mat image, vector<Vec3f>& circles, 
          int method, double dp, double minDist);

注意

这仅适用于OpenCV 2.3.1。