阅读 155

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

这篇文章主要给大家介绍了如何基于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.背景去除 简单案列,只适合背景单一的图像

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
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.边缘检测

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
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.人脸检测技术 (靠边缘的和侧脸检测不准确)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
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实现简单图形识别程序的文章就介绍到这了

原文链接:https://blog.csdn.net/xiaopy_0508/article/details/55044341


文章分类
代码人生
版权声明:本站是系统测试站点,无实际运营。本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 XXXXXXo@163.com 举报,一经查实,本站将立刻删除。
相关推荐