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

目录
  • 前言
  • 方法如下
  • 总结

前言

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

OpenCV用C++语言编写,它的主要接口也是C++语言,但是依然保留了大量的C语言接口。该库也有大量的Python, Java and MATLAB/OCTAVE (版本2.5)的接口。这些语言的API接口函数可以通过在线文档获得。如今也提供对于C#,Ch, Ruby的支持。

本文着重讲述opencv+java的实现程序,关于opencv的如何引入dll库等操作以及c的实现就不在这里概述了

方法如下

直接开始,首先下载opencv,引入opencv-246.jar包以及对应dll库

1.背景去除 简单案列,只适合背景单一的图像

import java.util.ArrayList;
import java.util.List;

import org.opencv.core.Core;
import org.opencv.core.CvType;
import org.opencv.core.Mat;
import org.opencv.core.Point;
import org.opencv.core.Scalar;
import org.opencv.core.Size;
import org.opencv.highgui.Highgui;
import org.opencv.imgproc.Imgproc;

/**
 * @Description 背景去除 简单案列,只适合背景单一的图像
 * @author XPY
 * @date 2016年8月30日下午4:14:32
 */
public class demo1 {
	public static void main(String[] args) {
		System.loadLibrary("opencv_java246");
		Mat img = Highgui.imread("E:\\opencv_img\\source\\1.jpg");//读图像
		Mat new_img = doBackgroundRemoval(img);
		Highgui.imwrite("E:\\opencv_img\\target\\1.jpg",new_img);//写图像
	}

	private static Mat doBackgroundRemoval(Mat frame) {
		// init
		Mat hsvImg = new Mat();
		List<Mat> hsvPlanes = new ArrayList<>();
		Mat thresholdImg = new Mat();

		int thresh_type = Imgproc.THRESH_BINARY_INV;

		// threshold the image with the average hue value
		hsvImg.create(frame.size(), CvType.CV_8U);
		Imgproc.cvtColor(frame, hsvImg, Imgproc.COLOR_BGR2HSV);
		Core.split(hsvImg, hsvPlanes);

		// get the average hue value of the image

		Scalar average = Core.mean(hsvPlanes.get(0));
		double threshValue = average.val[0];
		Imgproc.threshold(hsvPlanes.get(0), thresholdImg, threshValue, 179.0,
				thresh_type);

		Imgproc.blur(thresholdImg, thresholdImg, new Size(5, 5));

		// dilate to fill gaps, erode to smooth edges
		Imgproc.dilate(thresholdImg, thresholdImg, new Mat(),
				new Point(-1, -1), 1);
		Imgproc.erode(thresholdImg, thresholdImg, new Mat(), new Point(-1, -1),
				3);

		Imgproc.threshold(thresholdImg, thresholdImg, threshValue, 179.0,
				Imgproc.THRESH_BINARY);

		// create the new image
		Mat foreground = new Mat(frame.size(), CvType.CV_8UC3, new Scalar(255,
				255, 255));
		thresholdImg.convertTo(thresholdImg, CvType.CV_8U);
		frame.copyTo(foreground, thresholdImg);// 掩膜图像复制
		return foreground;
	}
}

2.边缘检测

import org.opencv.core.Core;
import org.opencv.core.Mat;
import org.opencv.core.Size;
import org.opencv.highgui.Highgui;
import org.opencv.imgproc.Imgproc;

/**
 * @Description 边缘检测
 * @author XPY
 * @date 2016年8月30日下午5:01:01
 */
public class demo2 {
	public static void main(String[] args) {
		System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
		Mat img = Highgui.imread("E:\\face7.jpg");//读图像
		Mat new_img = doCanny(img);
		Highgui.imwrite("E:\\opencv_img\\target\\2.jpg",new_img);//写图像
	}

	private static Mat doCanny(Mat frame)
	{
	    // init
	    Mat grayImage = new Mat();
	    Mat detectedEdges = new Mat();
	    double threshold = 10;
	    // convert to grayscale
	    Imgproc.cvtColor(frame, grayImage, Imgproc.COLOR_BGR2GRAY);
	   // reduce noise with a 3x3 kernel
	    Imgproc.blur(grayImage, detectedEdges, new Size(3, 3));
	    // canny detector, with ratio of lower:upper threshold of 3:1
	    Imgproc.Canny(detectedEdges, detectedEdges, threshold, threshold * 3);
	    // using Canny's output as a mask, display the result
	    Mat dest = new Mat();
	    frame.copyTo(dest, detectedEdges);
	    return dest;
	}
}

3.人脸检测技术 (靠边缘的和侧脸检测不准确)

import org.opencv.core.Core;
import org.opencv.core.Mat;
import org.opencv.core.MatOfRect;
import org.opencv.core.Point;
import org.opencv.core.Rect;
import org.opencv.core.Scalar;
import org.opencv.highgui.Highgui;
import org.opencv.objdetect.CascadeClassifier;  

/**
 *
 * @Description 人脸检测技术 (靠边缘的和侧脸检测不准确)
 * @author XPY
 * @date 2016年9月1日下午4:47:33
 */
public class demo3 {  

	 public static void main(String[] args) {
		    System.out.println("Hello, OpenCV");
		    // Load the native library.
		    System.loadLibrary("opencv_java246");
		    new demo3().run();
		  }  

  public void run() {
    System.out.println("\nRunning DetectFaceDemo");
    System.out.println(getClass().getResource("/haarcascade_frontalface_alt2.xml").getPath());
    // Create a face detector from the cascade file in the resources
    // directory.
    //CascadeClassifier faceDetector = new CascadeClassifier(getClass().getResource("haarcascade_frontalface_alt2.xml").getPath());
    //Mat image = Highgui.imread(getClass().getResource("lena.png").getPath());
    //注意:源程序的路径会多打印一个‘/',因此总是出现如下错误
        /*
         * Detected 0 faces Writing faceDetection.png libpng warning: Image
         * width is zero in IHDR libpng warning: Image height is zero in IHDR
         * libpng error: Invalid IHDR data
         */
    //因此,我们将第一个字符去掉
    String xmlfilePath=getClass().getResource("/haarcascade_frontalface_alt2.xml").getPath().substring(1);
    CascadeClassifier faceDetector = new CascadeClassifier(xmlfilePath);
    Mat image = Highgui.imread("E:\\face2.jpg");
    // Detect faces in the image.
    // MatOfRect is a special container class for Rect.
    MatOfRect faceDetections = new MatOfRect();
    faceDetector.detectMultiScale(image, faceDetections);  

    System.out.println(String.format("Detected %s faces", faceDetections.toArray().length));  

    // Draw a bounding box around each face.
    for (Rect rect : faceDetections.toArray()) {
        Core.rectangle(image, new Point(rect.x, rect.y), new Point(rect.x + rect.width, rect.y + rect.height), new Scalar(0, 255, 0));
    }  

    // Save the visualized detection.
    String filename = "E:\\faceDetection.png";
    System.out.println(String.format("Writing %s", filename));
    System.out.println(filename);
    Highgui.imwrite(filename, image);
  }  

}

人脸检测需要自行下载haarcascade_frontalface_alt2.xml文件

附上demo下载地址:点击这里,运行需自行引入opencv的dll文件

总结

到此这篇关于基于opencv+java实现简单图形识别程序的文章就介绍到这了,更多相关opencv+java图形识别内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • opencv3.0识别并提取图形中的矩形的方法

    利用opencv来识别图片中的矩形. 其中遇到的问题主要是识别轮廓时矩形内部的形状导致轮廓不闭合. 1. 对输入灰度图片进行高斯滤波  2. 做灰度直方图,提取阈值,做二值化处理  3. 提取图片轮廓  4. 识别图片中的矩形  5. 提取图片中的矩形 1.对输入灰度图片进行高斯滤波 cv::Mat src = cv::imread("F:\\t13.bmp",CV_BGR2GRAY); cv::Mat hsv; GaussianBlur(src,hsv,cv::Size(5,5),0

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

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

  • Python基于Socket实现的简单聊天程序示例

    本文实例讲述了Python基于Socket实现的简单聊天程序.分享给大家供大家参考,具体如下: 需求:SCIENCE 和MOOD两个人软件专业出身,厌倦了大众化的聊天软件,想着自己开发一款简易的聊天软件,满足他们的个性化需求,又不失"专业水准",Talk is easy, try to code it. 技术:socket,详细可参考前文:Python Socket实现简单TCP Server/client功能 语言:python 尽管socket区分服务器和客户端,但是在聊天程序中两

  • Python基于opencv实现的简单画板功能示例

    本文实例讲述了Python基于opencv实现的简单画板功能.分享给大家供大家参考,具体如下: import cv2 import numpy as np drawing = False # true if mouse is pressed ix,iy = -1,-1 def nothing(x): pass # mouse callback function def draw_circle(event,x,y,flags,param): global ix,iy,drawing g = par

  • Java实现简单扫雷程序

    用Java实现简单扫雷程序,供大家参考,具体内容如下 页面设置:框架是borderlayout,在上中下加入外面要加入的组件(左边和右边不加).扫雷用的布局是gridlayout即网格布局,与扫雷界面天然契合. 组件:使用panel,button,frame,label等组件,最后集中到frame中形成整体.并对其加入适当的监听,监听算法的实现如下. 扫雷算法:一共要考虑三种情况,第一种是点到雷的情况,第二种是点到空的格的情况,第三种是点到有数字的情况.下面我们对这些情况一一进行考虑,完成算法的

  • 基于Opencv实现双目摄像头拍照程序

    本文实例为大家分享了Opencv实现双目摄像头拍照程序的具体代码,供大家参考,具体内容如下 我用的双目摄像头是一根usb线接入电脑.运行环境是vc2015,opencv3.0.将左右两个摄像头拍到的图片分别保存起来. 贴出代码(C++) #include"stdafx.h" #include<iostream> #include<string> #include<sstream> #include<opencv2/core.hpp> #i

  • Java实战之基于TCP实现简单聊天程序

    目录 一.如何实现TCP通信 二.编写C/S架构聊天程序 1.编写服务器端程序 - Server.java 2.编写客户端程序 - Client.java 3.测试服务器端与客户端能否通信 4.程序优化思路 - 服务器端采用多线程 一.如何实现TCP通信 要实现TCP通信需要创建一个服务器端程序和一个客户端程序,为了保证数据传输的安全性,首先需要实现服务器端程序,然后在编写客户端程序. 在本机运行服务器端程序,在远程机运行客户端程序 本机的IP地址:192.168.129.222 远程机的IP地

  • Java基于Scanner对象的简单输入计算功能示例

    本文实例讲述了Java基于Scanner对象的简单输入计算功能.分享给大家供大家参考,具体如下: 问题及代码: /* *Copyright (c)2015,西南大学计信院 *All rights reserved. *文件名称:Computearea.java *作 者:高硕 *完成日期:2015年10月14日 *版 本 号:v1.0 *问题描述:输入半径求面积. *程序输入:半径. *程序输出:面积. */ package practice_01; import java.util.Scann

  • java基于C/S模式实现聊天程序(客户端)

    经过这几天对java的学习,用java做了这个计算机网络的课程设计,基于C/S模式的简单聊天程序,此篇文章介绍一些客户端的一些东西. 先讲一讲此聊天程序的基本原理,客户端发送消息至服务器,服务器收到消息之后将其转发给连接服务器的所有客户端,来自客户端的消息中包含发件人的名字. 客户端的主要功能是发送消息和接收消息,客户端设置好了端口和服务器地址,并创立客户端自己的套接字,用作和服务器通信的一个标识.布局就不多说了,主要说说监视器和两个重要的线程:发送和接收. 监视器中,登录按钮触发的功能是设置用

  • Java中基于Shiro,JWT实现微信小程序登录完整例子及实现过程

    小程序官方流程图如下,官方地址 : https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/login.html : 本文是对接微信小程序自定义登录的一个完整例子实现 ,技术栈为 : SpringBoot+Shiro+JWT+JPA+Redis. 如果对该例子比较感兴趣或者觉得言语表达比较啰嗦,可查看完整的项目地址 : https://github.com/EalenXie/shiro-jwt-applet

  • java基于netty NIO的简单聊天室的实现

    一.为何要使用netty开发 由于之前已经用Java中的socket写过一版简单的聊天室,这里就不再对聊天室的具体架构进行细致的介绍了,主要关注于使用netty框架重构后带来的改变.对聊天室不了解的同学可以先看下我的博客(<JAVA简单聊天室的实现>) 本篇博客所使用的netty版本为4.1.36,完整工程已上传到Github(https://github.com/Alexlingl/Chatroom),其中lib文件夹下有相应的netty jar包和source包,自行导入即可. 1.为何要

随机推荐