Java OpenCV利用KNN算法实现图像背景移除

网友投稿 383 2022-08-31


Java OpenCV利用KNN算法实现图像背景移除

目录实现步骤示例代码结果图

实现步骤

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.OopaHicNwqptional;

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 = HighGuiopaHicNwq.waitKey(100);

if (index == 27) {

capture.release();

break;

}

}

}

}

结果图


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:Django(part10)--POST请求(django request.post.get)
下一篇:Django(part8)--响应及HttpResponse对象
相关文章

 发表评论

暂时没有评论,来抢沙发吧~