OpenCV4Android圆形目标跟踪

OpenCV4Android圆形目标跟踪,android,opencv,geometry,Android,Opencv,Geometry,我对OpenCV还不熟悉,并尝试在Android上使用3.1.0查找轮廓来跟踪圆形对象。我正在按照示例颜色斑点检测器编写代码,但是运行应用程序时,drawcours()函数从未绘制任何内容。下面是执行所有处理的onCameraFrame()函数。你能告诉我我做错了什么吗 编辑:代码的新版本:仍无法按预期工作。drawContours()围绕任何黑色对象绘制,该函数会产生非常嘈杂的结果。这就是现在的样子 public Mat onCameraFrame(CvCameraViewFrame inpu

我对
OpenCV
还不熟悉,并尝试在Android上使用3.1.0查找轮廓来跟踪圆形对象。我正在按照示例颜色斑点检测器编写代码,但是运行应用程序时,
drawcours()
函数从未绘制任何内容。下面是执行所有处理的
onCameraFrame()
函数。你能告诉我我做错了什么吗

编辑:代码的新版本:仍无法按预期工作。drawContours()围绕任何黑色对象绘制,该函数会产生非常嘈杂的结果。这就是现在的样子

public Mat onCameraFrame(CvCameraViewFrame inputFrame) {
    Mat rgba = inputFrame.rgba();
    Mat grayMat = new Mat();
    Imgproc.cvtColor(rgba, grayMat, Imgproc.COLOR_RGBA2GRAY);
    Mat processedMat = new Mat(); 
    Imgproc.threshold(grayMat, processedMat, 0, 255, Imgproc.THRESH_BINARY);

    List<MatOfPoint> contours = new ArrayList<MatOfPoint>();
    List<MatOfPoint> matchedContours = new ArrayList<MatOfPoint>();
    Mat hierarchy = new Mat(); 
    Imgproc.findContours(processedMat, contours, hierarchy, Imgproc.RETR_LIST, Imgproc.CHAIN_APPROX_SIMPLE);
    for(MatOfPoint contour : contours){
        double actualArea = Imgproc.contourArea(contour);
        double width = contour.width();
        double radius = width/2; 
        double calculatedArea = Math.PI * Math.pow(radius, 2);

        if((actualArea - calculatedArea) < 10000) { //chose some arbitrary threshold because I am not sure what to make this
            matchedContours.add(contour);
        }
    }
    Imgproc.drawContours(rgba, matchedContours, -1, new Scalar(0,255,0));
    return rgba; 
}
public Mat onCameraFrame(CvCameraViewFrame inputFrame){
Mat rgba=inputFrame.rgba();
Mat grayMat=新Mat();
Imgproc.cvtColor(rgba、grayMat、Imgproc.COLOR_RGBA2GRAY);
Mat PROCESSED Mat=新Mat();
Imgproc.threshold(grayMat,processedMat,0,255,Imgproc.THRESH_二进制);
列表等高线=新的ArrayList();
List matchedContours=新建ArrayList();
Mat层次结构=新Mat();
Imgproc.findContours(处理数据、轮廓、层次、Imgproc.RETR\u列表、Imgproc.CHAIN\u近似值\u简单值);
用于(点轮廓:轮廓){
双实际面积=Imgproc.轮廓面积(轮廓);
双宽度=轮廓。宽度();
双半径=宽度/2;
双重计算面积=Math.PI*Math.pow(半径,2);
如果((actualArea-calculatedArea)<10000){//选择了一些任意的阈值,因为我不确定该怎么做
匹配轮廓。添加(轮廓);
}
}
绘制等高线(rgba,匹配等高线,-1,新标量(0255,0));
返回rgba;
}

findContours可用于二进制图像。例如,在findContoursI更新我的代码(如上)之前,使用边缘检测或阈值,现在确实如此。绿色像素是drawContours()的结果。出于某种原因,这只适用于摄影机提要中的黑色对象,程序也尝试围绕非圆形对象绘制,这是我不想要的。这就是我想要追踪的。你能告诉我我做错了什么吗?