如果没有把dll扔到jdk会报错 

Exception in thread "AWT-EventQueue-0" java.lang.UnsatisfiedLinkError: no opencv_java401 in java.library.path
    at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1867)
    at java.lang.Runtime.loadLibrary0(Runtime.java:870)
    at java.lang.System.loadLibrary(System.java:1122)
    at com.hs.jframe.Jframe.jButton5ActionPerformed(Jframe.java:225)
    at com.hs.jframe.Jframe.access$000(Jframe.java:25)
    at com.hs.jframe.Jframe$1.actionPerformed(Jframe.java:107)
    at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:2022)
    at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2348)
    at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:402)
    at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:259)
    at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:252)
    at java.awt.Component.processMouseEvent(Component.java:6539)
    at javax.swing.JComponent.processMouseEvent(JComponent.java:3324)
    at java.awt.Component.processEvent(Component.java:6304)
    at java.awt.Container.processEvent(Container.java:2239)
    at java.awt.Component.dispatchEventImpl(Component.java:4889)
    at java.awt.Container.dispatchEventImpl(Container.java:2297)
    at java.awt.Component.dispatchEvent(Component.java:4711)
    at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4904)
    at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4535)
    at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4476)
    at java.awt.Container.dispatchEventImpl(Container.java:2283)
    at java.awt.Window.dispatchEventImpl(Window.java:2746)
    at java.awt.Component.dispatchEvent(Component.java:4711)
    at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:760)
    at java.awt.EventQueue.access$500(EventQueue.java:97)
    at java.awt.EventQueue$3.run(EventQueue.java:709)
    at java.awt.EventQueue$3.run(EventQueue.java:703)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:74)
    at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:84)
    at java.awt.EventQueue$4.run(EventQueue.java:733)
    at java.awt.EventQueue$4.run(EventQueue.java:731)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:74)
    at java.awt.EventQueue.dispatchEvent(EventQueue.java:730)
    at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:205)
    at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:116)
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:105)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:93)
    at java.awt.EventDispatchThread.run(EventDispatchThread.java:82)

 

首先引入依赖

    <!-- https://mvnrepository.com/artifact/org.bytedeco.javacpp-presets/opencv -->
<dependency>
    <groupId>org.bytedeco.javacpp-presets</groupId>
    <artifactId>opencv</artifactId>
    <version>4.0.1-1.4.4</version>
</dependency>

 

再去官网下载一些东东https://opencv.org/releases/

因为maven仓的版本 最高只有4.0.1所以,下载的时候,找到4.0.1下载

 java opencv 4.0.1安装配置

 

 

 

官网下载资源

然后运行,解压后会得到一些文件

java opencv 4.0.1安装配置

然后把dll扔到jdk的bin文件夹下

java opencv 4.0.1安装配置

 

这个路径具体看自己的实际情况

java opencv 4.0.1安装配置

然后构建一下,看到有这个jar包就行了,

java opencv 4.0.1安装配置

 

开始之前呢,需要先了解一下opencv的行列方向问题

java opencv 4.0.1安装配置

一般图片都需要进行灰度化然后二值化,

参考下图

java opencv 4.0.1安装配置java opencv 4.0.1安装配置java opencv 4.0.1安装配置

这样基本上也可以识别了,但是还是有一些噪点,最好还是去一下噪点

对于分辨率比较低的图片,噪点基本都是一两个像素

简单的办法就是计算黑色像素点周围的8个像素是不是全部白色,如果是那8个像素点的值加起来就是2040,就把这个点处理成白色,如果不是,那可能就不是噪点


java opencv 4.0.1安装配置

效果还凑合

java opencv 4.0.1安装配置

java opencv 4.0.1安装配置

java opencv 4.0.1安装配置

java opencv 4.0.1安装配置

 

代码如下

  //因为去了边框,所以,行列数,做减2处理,即不处理边框上的像素
         for(int x=1;x<col-1;x++){
             for(int y=1;y<row-1;y++){
                 double[] binDataList=target.get(y, x);
                 double binData=binDataList[0];
                 
                 if(binData==0){//黑色
                     double[] x1list=target.get(y-1, x-1);
                     double[] x2list=target.get(y-1, x);
                     double[] x3list=target.get(y-1, x+1);
                     
                     double[] x4list=target.get(y, x-1);                      
                     double[] x6list=target.get(y, x+1);
                     
                     double[] x7list=target.get(y+1, x-1);
                     double[] x8list=target.get(y+1, x);
                      double[] x9list=target.get(y+1, x+1);
                      double x1=x1list[0];
                      double x2=x2list[0];
                      double x3=x3list[0];
                      double x4=x4list[0];
                      double x6=x6list[0];
                      double x7=x7list[0];
                      double x8=x8list[0];
                      double x9=x9list[0];
                      if(x1+x2+x3+x4+x6+x7+x8+x9>=2040){
                          System.out.println("坐标xy:"+x+","+y+"此点是噪点,抹除处理");
                          target.put(y, x, 255);//画一个白点
                      }
                 }
                 else{
                     
                 }
             }
             
         }

 

稍微复杂一点的有连通域计算面积办法

https://blog.csdn.net/marooon/article/details/81332487

 

相关文章: