概述

最近有一个项目需要用到OpenCV的库来做图像处理的工作,然后就自学了一些基础的OpenCV知识,由于项目用Java语言开发,所以为了方便在OpenCV的调用上也使用了Java版的API来操作.

环境配置

JDK

JDK去官方网站下载JDK并安装即可.

IDE

IDE使用的是IDEA开发

OpenCV的安装以及导入

安装

OpenCV官网下载OpenCV的安装包,我安装了最新的OpenCV版本3.2.0,平台是Windows64位,安装完成后会在指定安装的目录下有opencv的文件夹.

IDEA配置

在IDEA的Project Structure窗口中选择Libraries选项,添加opencv目录下的jar包即可.对应opencv目录下jar包的路径为:\opencv\build\java.
opencv文件路径
IDEA配置路径
成功之后会在Libraries中出现OpenCV的Jar包
成功

运行环境配置

在IDEA右上角的Run/Debug Configurations选项中的VM options中添加如下代码:-Djava.library.path=D:\opencv\opencv\build\java\x64;D:\opencv\opencv\build\x64\vc14\bin
图示

测试代码

在IDEA中创建_Test.java_文件,测试下述代码.

    import org.opencv.core.Core;
    import org.opencv.core.CvType;
    import org.opencv.core.Mat;
    import org.opencv.core.Scalar;
    
    public class Test {
    
        static{ System.loadLibrary(Core.NATIVE_LIBRARY_NAME); }
    
        public static void main(String[] args) {
            System.out.println("Welcome to OpenCV " + Core.VERSION);
            Mat m = new Mat(5, 10, CvType.CV_8UC1, new Scalar(0));
            System.out.println("OpenCV Mat: " + m);
            Mat mr1 = m.row(1);
            mr1.setTo(new Scalar(1));
            Mat mc5 = m.col(5);
            mc5.setTo(new Scalar(5));
            System.out.println("OpenCV Mat data:\n" + m.dump());
        }
    }

显示运行结果为:
运行结果
至此,OpenCV在Java环境下的配置就结束了.

参考文章

在IntelliJ IDEA 13中配置OpenCV的Java开发环境

简述

在OpenCV配置安装完成之后,先去看了一下官方的教程和例子,Introduction to Java Development,这是官方提供的一个面对Java开发者的快速的介绍,但是其中只有两个Demo,第一个就是配置时的测试代码.这里主要来看一下第二个例子.

开始

在官方的这个介绍中还介绍了Scala以及SBT的知识,这里我并没有按照他的方式来进行第二个人脸检测例子的测试.

  • 首先我们需要一个人脸识别的配置文件,官方是在构建时自动下载的,没有使用SBT的方式的话,可以直接在Github上来下载这个配置文件lbpcascade_frontalface.xml.
  • 然后我们需要一张图片,官方的识别图片是_lena.png_,在下方贴出来:
    准备好之后就是示例代码了.
import org.opencv.core.*;
import org.opencv.imgcodecs.Imgcodecs;
import org.opencv.imgproc.Imgproc;
import org.opencv.objdetect.CascadeClassifier;
/** 
* Created by MisakaTang on 2017/7/5. 
* 官方的HelloOpenCV案例,做了一个人脸边缘检测的例子 
*/
public class DetectFaceDemo {    
    static{System.loadLibrary(Core.NATIVE_LIBRARY_NAME);}    
    public static void main(String[] args) {        
        new DetectFaceDemo().run();    
    }    
    public void run(){        
        System.out.println("\nRunning DetectFaceDemo");        //从图片中创建一个面部检测        
        /*        
        * 官方文档使用的opencv为2.4版本,所以没有采用示例中读取图片时的方法        
        * 文件放在工程目录下无法正常读取 会报空指针异常        
        * 解决办法是将文件移出工程文件(放在了E:/根目录下)        
        * 在3.0以后的版本取消了Highgui类,对于图片的读取都使用了Imgcodes类来进行处理        
        * 
        */        
        CascadeClassifier faceDetector = new CascadeClassifier("E:/lbpcascade_frontalface.xml");        
        Mat image = Imgcodecs.imread("E:/lena.png");        
        /*        
        * 下方为官方教程中的代码        
        * 
        */
        //Create a face detector from the cascade file in the resources
        //directory.
        //CascadeClassifier faceDetector = new CascadeClassifier(getClass().getResource("/lbpcascade_frontalface.xml").getPath());
        //Mat image = Highgui.imread(getClass().getResource("/lena.png").getPath());        
        MatOfRect faceDetetions = new MatOfRect();        
        faceDetector.detectMultiScale(image,faceDetetions);        
        System.out.println(faceDetetions.toArray().length);        
        //画图        
        for (Rect rect : faceDetetions.toArray()){            
            Imgproc.rectangle(image,new Point(rect.x,rect.y),new Point(rect.x+rect.width,rect.y+rect.height),new Scalar(0,255,0));        
        }        
        String filenanme = "faceDetection.png";        
        System.out.println(String.format("Writing %s", filenanme));        
        Imgcodecs.imwrite(filenanme,image);     //这里也采用了Imgcodes类来处理    
    }
}

由于我下载的OpenCV版本是3.0以上的版本,而这个Demo的版本是2.4的,所以对于图像读取的类也发生了变化,要注意开发环境的OpenCV版本.

注意:

将xml配置文件和图片放在工程目录下会报错,StackOverFlow上的解决办法是不要将这两个文件放在工程目录下,我将其放在的E:\的根目录下问题就解决了.

运行结果

在人脸的图片上显示了识别到的面部信息并用矩形标识了出来.

总结

You’re done! Now you have a sample Java application working with OpenCV, so you can start the work on your own. We wish you good luck and many years of joyful life!


这是官方示例的结尾,拿来借用一下.主要的问题出在Opencv版本导致的类的使用方式变化以及文件不能放在工程目录下这两个问题.

刚刚进入暑假,就尝试在GithubPages上搭建了自己的博客,在暑假的自学期间尝试把自己的学习体会记录下来。所以就不可避免的要学习一下Markdown来写博客,在写建站记录之前先把学习Markdown的东西先记录一下。

Markdown简介

Markdown是一种极简的语言,用来写博客再合适不过,这里也只是学习了一下最基本的语法和功能,在以后若是还有其他的东西再做补充。

语法

标题

标题便是最先遇到的语法了,非常的简单,只要在标题前面加上#就可以了,二级标题三级标题只要往下继续增加#便可。
例如:

# 一级标题
## 二级标题
### 三级标题

注: 在Markdown书写时要注意标签和文字之间要添加空格!!这点非常重要。


列表

列表的使用只需要在文字之前加上- 或者数字+. 就可以 前者为无序列表而后者为有序列表。如:

有序列表:
1. 列表1
2. 列表2  

无序列表:
- 文字1
- 文字2  

强调

在Markdown中的强调使用,需要使用星号或者下划线来将文字包围,一颗星号的效果 两颗星号的效果 一条下环线的效果 两条下划线的效果 所以*与_起到的效果是一样的,一个为下环线而两个为加粗。

引用

引用只需要在需要引用的文字前加上>即可

现在是被引用的文字

链接和图片

链接和图片的使用方式相类似,因为图片就是一种链接形式嘛。
链接的语法是[文字](括号里面写链接)
图片的语法是![](图片的链接)

代码的引用

代码的引用只需要在要引用的代码前后加上就可以,如果是多行的代码引用则需在引用的代码前后加上三个,在开头可以指定代码的语言类型。如:

1
2
3
4
5
#include<stdio.h>
int main(){
printf("hello,world");
return 0;
}

用这种方式就可以在文本中添加代码了,而且还是有高亮的(如果不指定语言的话是不会有高亮的)。
或者是在代码前加上一个tab或者4个空格,这样也可以来引用。

#include<stdio.h>
    int main(){
        printf("hello,world");
        return 0;
    }

注释

注释使用html的注释方式<!— —>
(在!号前加了转义符号强行显示注释)

转义符号

转义符号和其他的语言没有太大的差别,转义符为\。
\\ 反斜杠
\` 反引号
\* 星号
\_ 下划线
\{\} 大括号
\[] 中括号
\() 小括号
\# 井号
\+ 加号
\- 减号
\. 英文句号
\! 感叹号

回车

这里把回车拿出来讲一下是因为在写这篇文档的时候就遇到了这个问题,在Markdown里如果需要手动换行的话是需要在文末加上两个空格的!!

总结

关于Markdown的语法学习还是很快的,其他的遇到的问题之后有的话也会继续补充,这也算是用Markdown写的第一篇博客了,这种方式来学习新的知识确实很不错,希望自己可以坚持下去吧。

参考文章

markdown简明语法
献给写作者的 Markdown 新手指南

0%