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

}

结果图

到此这篇关于Java OpenCV利用KNN算法实现图像背景移除的文章就介绍到这了,更多相关OpenCV图像背景移除内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • OpenCV Java实现人脸识别和裁剪功能

    本文实例为大家分享了OpenCV Java实现人脸识别和裁剪的具体代码,供大家参考,具体内容如下 安装及配置 1.首先安装OpenCV,地址 这里我下载的是Windows版的3.4.5 然后安装即可-- 2.Eclipse配置OpenCV Window->Preferences->Java->User Libraries New输入你的Libraries名 这里我的安装目录是D:\OpenCV,所以是: 然后引入dll,我是64位机子,所以是: Ok,下面创建Java项目做Java与Op

  • java使用OpenCV从视频文件中获取帧

    本文实例为大家分享了java使用OpenCV从视频文件中获取帧的具体代码,供大家参考,具体内容如下 实现功能:使用Java获取mp4.mov.avi等视频文件中的图像帧,每秒获取一帧图像,并保存 环境要求:需要安装Opencv,安装FFmpeg,下载javacv包 操作系统:本次实验使用的Ubuntu系统 实验代码 import com.googlecode.javacv.cpp.opencv_highgui; import org.opencv.core.Core; import org.op

  • Java+OpenCV实现人脸检测并自动拍照

    java+opencv实现人脸检测,调用笔记本摄像头实时抓拍,人脸会用红色边框标识出来,并且将抓拍的目录存放在src下,图片名称是时间戳. 环境配置:win7 64位,jdk1.8 CameraBasic.java package com.njupt.zhb.test; import java.awt.EventQueue; import javax.swing.ImageIcon; import javax.swing.JFrame; import javax.swing.JLabel; im

  • Java OpenCV实现图像镜像翻转效果

    本文实例为大家分享了Java OpenCV实现图像镜像翻转效果的具体代码,供大家参考,具体内容如下 主要使用OpenCV的flip()方法,可以实现图像的垂直.水平以及同时垂直镜像翻转. flip是Core的静态方法,用法为: public static void flip(Mat src, Mat dst, int flipCode) 参数说明: src:输入图像: dst:输出图像: flipCode: = 0 图像向下翻转 > 0 图像向右翻转 < 0 图像同时向下向右翻转 代码如下:

  • Java使用OpenCV3.2实现视频读取与播放

    Java使用OpenCV3.2实现视频读取与播放,供大家参考,具体内容如下 OpenCV从3.x版本开始其JAVA语言的SDK支持视频文件读写,这样就极大的方便了广大Java语言开发者学习与使用OpenCV,通过摄像头或者视频文件读取帧的内容与播放,完成视频内容分析与对象跟踪等各种应用开发任务.可以说OpenCV C++ SDK可以做到绝大多数事情,在OpenCV3.x版本上用Java都可以完成,这样就为很多Java开发者学习OpenCV打开了方便之门. 实现思路 首先用OpenCV相关API读

  • Java OpenCV实现人脸识别过程详解

    准备 : 下载openCV安装包 :  https://opencv.org/ 安装包安装之后支持多种语言环境,此处使用Java,在Eclipse中引入 openCV目录下的java/opencv-320.jar,同时配置openCV库路径. Eclipse配置openCV 代码实现 : package test; import org.opencv.core.Core; import org.opencv.core.Mat; import org.opencv.core.MatOfRect;

  • 基于opencv+java实现简单图形识别程序

    目录 前言 方法如下 总结 前言 OpenCV的 全称是:Open Source Computer Vision Library.OpenCV是一个基于BSD许可(开源)发行的跨平台计算机视觉库,可以运行在Linux.Windows.Android和Mac OS操作系统上.它轻量级而且高效——由一系列 C 函数和少量 C++ 类 构成,同时提供了Python.Ruby.MATLAB等语言的接口,实现了 图像处理和计算机视觉方面的很多通用算法. OpenCV用C++语言编写,它的主要接口也是C++

  • 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.Optional

  • Python-OpenCV实战:利用 KNN 算法识别手写数字

    目录 前言 手写数字数据集 MNIST 介绍 基准模型--利用 KNN 算法识别手写数字 改进模型1--参数 K 对识别手写数字精确度的影响 改进模型2--训练数据量对识别手写数字精确度的影响 改进模型3--预处理对识别手写数字精确度的影响 改进模型4--使用高级描述符作为图像特征提高 KNN 算法准确率 完整代码 相关链接 前言 K-最近邻 (k-nearest neighbours, KNN) 是监督学习中最简单的算法之一,KNN 可用于分类和回归问题,在博文<Python OpenCV实战

  • C++ opencv利用grabCut算法实现抠图示例

    目录 前言 一.grabCut函数 二.compare函数 三.代码 前言 grabCut算法利用了图像中的纹理(颜色)信息和边界(反差)信息,只用少量的用户交互操作,即可得到比较好的分割结果,和分水岭顺丰比较相似,但是计算速度比较慢,得到的结果比较精确 用法:输入一幅图片并对一些像素做属于背景或属于前景的标记,算法会根据这个局部标记计算出整个图像中前景和背景的分割线. 一.grabCut函数 void grabCut(InputArray img, InputOutputArray mask,

  • Java实现的KNN算法示例

    本文实例讲述了Java实现的KNN算法.分享给大家供大家参考,具体如下: 提起KNN算法大家应该都不会陌生,对于数据挖掘来说算是十大经典算法之一. 算法的思想是:对于训练数据集中已经归类的分组,来对于未知的数据进行分组归类.其中是根据该未知点与其训练数据中的点计算距离,求出距离最短的点,并将其归入该点的那一类. 看看算法的工程吧: 1. 准备数据,对数据进行预处理 2. 选用合适的数据结构存储训练数据和测试元组 3. 设定参数,如k 4.维护一个大小为k的的按距离由大到小的优先级队列,用于存储最

  • OpenCV利用python来实现图像的直方图均衡化

    1.直方图 直方图: (1) 图像中不同像素等级出现的次数 (2) 图像中具有不同等级的像素关于总像素数目的比值. 我们使用cv2.calcHist方法得到直方图 cv2.calcHist(images, channels, mask, histSize, ranges): -img: 图像 -channels: 选取图像的哪个通道 -histSize: 直方图大小 -ranges: 直方图范围 cv2.minMaxLoc: 返回直方图的最大最小值,以及他们的索引 import cv2 impo

  • Python利用 SVM 算法实现识别手写数字

    目录 前言 使用 SVM 进行手写数字识别 参数 C 和 γ 对识别手写数字精确度的影响 完整代码 前言 支持向量机 (Support Vector Machine, SVM) 是一种监督学习技术,它通过根据指定的类对训练数据进行最佳分离,从而在高维空间中构建一个或一组超平面.在博文<OpenCV-Python实战(13)--OpenCV与机器学习的碰撞>中,我们已经学习了如何在 OpenCV 中实现和训练 SVM 算法,同时通过简单的示例了解了如何使用 SVM 算法.在本文中,我们将学习如何

  • Python实现的knn算法示例

    本文实例讲述了Python实现的knn算法.分享给大家供大家参考,具体如下: 代码参考机器学习实战那本书: 机器学习实战 (Peter Harrington著) 中文版 机器学习实战 (Peter Harrington著) 英文原版[附源代码] 有兴趣你们可以去了解下 具体代码: # -*- coding:utf-8 -*- #! python2 ''''' @author:zhoumeixu createdate:2015年8月27日 ''' #np.zeros((4,2)) #np.zero

  • OpenCV利用背景建模检测运动物体

    本文实例为大家分享了OpenCV利用背景建模检测运动物体的具体代码,供大家参考,具体内容如下 #include <opencv\highgui.h> #include <stdio.h> int main( int argc, char** argv ){ IplImage* pFrame = NULL; IplImage* pFrImg = NULL; IplImage* pBkImg = NULL; CvMat* pFrameMat = NULL; CvMat* pFrMat

  • opencv利用视频的前n帧求平均图像

    本文实例为大家分享了opencv利用视频的前n帧求平均图像的具体代码,供大家参考,具体内容如下 自己写的哈,可以用该小程序对视频求解平均模型. //OpenCV中如何累加多幅图像并取平均值 #include "cv.h" #include "highgui.h" int main(int argc,char *argv[]) { int nframe = 50;//利用前nfram帧求解平均图 CvCapture *capture = cvCreateFileCap

  • Java利用AlphaComposite类合并图像

    package com.hdwang.test; import javax.swing.*; import javax.swing.event.ChangeEvent; import javax.swing.event.ChangeListener; import java.awt.*; import java.awt.event.*; import java.awt.image.BufferedImage; import java.util.HashMap; import java.util.

随机推荐