如何使用Android中的Opencv检测非静态背景中对象的存在?

问题描述 投票:1回答:1

我正在开发一个应用程序来处理帧,并使用Android中的Opencv实时进行分段和图像匹配。

主要的问题是,我只需要在相机框架中可用的处理对象并且背景是非静止的时候开始这个图像处理,这使我的任务更难。

我尝试了许多解决方案,比如使用absdiff进行运动检测,这就是代码

    imgSource = inputFrame.rgba().t();
    Core.transpose(imgSource, imgSource);

    //imgSource.convertTo(enhancedMat, imgSource.type(), 1.3);



    gray = imgSource;
    Imgproc.cvtColor(imgSource, gray, Imgproc.COLOR_BGR2GRAY);
    Imgproc.GaussianBlur(gray, gray, new Size(25, 25), 5);
    if (firstframe == null) {
        firstframe = gray;
    }
    Core.absdiff(firstframe, gray, frameDelta);
    Imgproc.threshold(frameDelta, frameDelta, 25, 255, Imgproc.THRESH_BINARY);
    for (int i =0 ; i <2 ; i++)
        Imgproc.dilate(frameDelta, frameDelta, Imgproc.getStructuringElement(Imgproc.THRESH_BINARY, new Size(3, 3)));

    Imgproc.findContours(frameDelta, abs_contours, abs_hierarchy, Imgproc.RETR_EXTERNAL, Imgproc.CHAIN_APPROX_SIMPLE);
    for (int idx = 0; idx < abs_contours.size(); idx++) {

        double a = Imgproc.contourArea(abs_contours.get(idx));  //Find the area of contour

        if (a < 10000) {

            continue;
        }

        Rect rect = Imgproc.boundingRect(abs_contours.get(idx));
        Imgproc.rectangle(imgSource, rect.tl(), rect.br(), new Scalar(0, 255, 0), 2);
    }

我还尝试使用这种Opencv方法qazxsw poi进行背景减法。

他们都没有工作,因为背景也在移动,所以那些逻辑根本不健全。

我必须遵循任何方法或解决这类问题吗?

我希望你们能引导我找到一个好的解决方案,并提前感谢你们。

java android image-processing computer-vision opencv4android
1个回答
1
投票

为了解决这个问题,我使用了光流。

您可以使用createBackgroundSubtractorMOG2计算每个帧上的光流。

然后,为图像的每个像素获得2个分量矩阵(x方向和y方向的渐变)。

我计算了每个点calcOpticalFlowFarneback并将其存储在atan2(flow_y,flow_x)中。

然后,使用k均值和2个标签进行聚类。 (将背景与序列中的前景移动对象区分开来)。

k的返回矩阵表示标签。

希望能帮助到你 !

编辑:

我一直在使用OpenCV C ++,但这是我的代码

vector<Point2f>
© www.soinside.com 2019 - 2024. All rights reserved.