图形识别-基于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(55));  
        // 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,  
                255255));  
        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文件,运行需自行引入opencv的dll文件.

文章来自xiaopy_0508的CSDN博客,如有侵权请联系代码狗站长删除。

原创文章,作者:奋斗,如若转载,请注明出处:https://blog.ytso.com/242079.html

(0)
上一篇 2022年4月7日 16:45
下一篇 2022年4月7日 16:55

相关推荐

发表回复

登录后才能评论