亲宝软件园·资讯

展开

OpenCV图像背景移除

深色风信子 人气:0

实现步骤

1 获取视频

2 设置形态学结构

3 创建 Video.createBackgroundSubtractorKNN()

4 提取模型 BS

5 进行形态学变换

6 膨胀

7 二值化

8 展示结果

示例代码

package com.xu.opencv;

import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
import java.util.Optional;
import java.util.stream.Collectors;

import org.opencv.core.Core;
import org.opencv.core.Mat;
import org.opencv.core.MatOfPoint;
import org.opencv.core.Point;
import org.opencv.core.Rect;
import org.opencv.core.Size;
import org.opencv.highgui.HighGui;
import org.opencv.imgproc.Imgproc;
import org.opencv.video.BackgroundSubtractorKNN;
import org.opencv.video.Video;
import org.opencv.videoio.VideoCapture;

/**
 * @Title: BSM.java
 * @Package com.xu.opencv
 * @Description: OpenCV-4.1.0 背景消除
 * @author: hyacinth
 * @date: 2019年7月19日 下午22:10:14
 * @version: V-1.0
 * @Copyright: 2019 hyacinth
 */
public class BSM {

    static {
        System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
    }

    public static void main(String[] args) {
        BSM_KNN();
    }

    /**
     * OpenCV-4.1.0 视频分析和对象跟踪 背景消除 KNN
     *
     * @return: void
     * @date: 2019年7月19日 下午22:10:14
     */
    public static void BSM_KNN() {
        // 1 创建 VideoCapture 对象
        VideoCapture capture = new VideoCapture(0);
        // 2 使用 VideoCapture 对象读取本地视频
        capture.open("D:\\BaiduNetdiskDownload\\video_003.avi");
        // 4 使用 Mat video 保存视频中的图像帧 针对每一帧 做处理
        Mat video = new Mat();
        // 3 设置结构元素
        Mat kernel1 = Imgproc.getStructuringElement(Imgproc.MORPH_RECT, new Size(1, 1), new Point(-1, -1));
        Mat kernel2 = Imgproc.getStructuringElement(Imgproc.MORPH_RECT, new Size(3, 3), new Point(-1, -1));
        // 4 KNN 背景消除
        BackgroundSubtractorKNN knn = Video.createBackgroundSubtractorKNN();
        Mat bitmask = new Mat();
        while (capture.read(video)) {
            // 5 提取模型 BSM
            knn.apply(video, bitmask, -1);
            // 6 形态学变换(闭操作)
            Imgproc.morphologyEx(bitmask, bitmask, Imgproc.MORPH_CLOSE, kernel1, new Point(-1, -1));
            // 7 膨胀
            Imgproc.dilate(bitmask, bitmask, kernel2, new Point(-1, -1), 1);
            // 8 二值化
            Imgproc.threshold(bitmask, bitmask, 20, 255, Imgproc.THRESH_BINARY | Imgproc.THRESH_TRIANGLE);
            // 9 将原图中的背景设置为 Scalar(255, 255, 255)
            for (int i = 0, r = bitmask.rows(); i < r; i++) {
                for (int j = 0, c = bitmask.cols(); j < c; j++) {
                    if (bitmask.get(i, j)[0] <= 150) {
                        video.put(i, j, 255, 255, 255);
                    }
                }
            }
            // 10 显示
            HighGui.imshow("KNN 背景移除", video);
            int index = HighGui.waitKey(100);
            if (index == 27) {
                capture.release();
                break;
            }
        }
    }

}

结果图

加载全部内容

相关教程
猜你喜欢
用户评论