java中面向接口编程的好处

java中面向接口编程的好处

事情起因

刚开始学的时候还在想
弄什么接口,真麻烦
还有那个什么List 直接用ArrayList不行吗,非要再写个接口
虽然在学完ArrayList和LinkedList之后感觉的确是有一点点用途,但是感觉还是没有那么强烈
在这里插入图片描述

终于有一次!!!

在安卓平台做Opencv识别的时候,想调试,真的是太难了
这个时候就想,我直接在PC上的java环境调试不行吗

但是要怎么做呢???

而且安卓的Opencv加载是so库 PC上加载的dll库
难道调试的时候要忍住自己的性子任它慢吗???
我太难了!!!
在这里插入图片描述


灵感突现

突然!!!     想到了 接口 这个东西

反正写安卓也是java,写在PC也是java
我创建一个接口
安卓和PC都有这个接口就行了啊.


代码规划

这样我就写了这样的两个接口

OpenCv_Inter.java

主要解决图片识别过程
识别结束后可以获取一些信息
设置展示方式

import org.opencv.core.Mat;
import java.util.Map;

/**
 * OpenCv 实现接口
 * 方便在PC写安卓程序
 */
public interface OpenCv_Inter {

    //要进行识别的图片
    void start(Mat src);
    
    //识别完毕后 用来读取一些信息
    Map<String,Object> data();
    
	//设置展示方式
    void setShowHandler(OpenCv_ShowHandler show);
}

OpenCv_ShowHandler.java

为什么还要弄个展示方式的类?

在PC端 可以直接展示出一个窗口
而安卓不行,而且相对麻烦,最好的就是保存成图片一点点看

但是做图像识别的这样做你能忍???
所以直接在PC上调试

import org.opencv.core.Mat;
/**
 * 展示图片
 */
public interface OpenCv_ShowHandler {
    //用来展示图片
    void showMat(String name, Mat mat);
}

安卓和PC有一个共同的接口
在这里插入图片描述


写测试代码

这里我就直接拿PC写测试代码吧,反正接口一样,结果都一样

编写实现类代码

PC_MatShow : 用来在PC端展示图片

import org.opencv.core.Mat;
import org.opencv.highgui.HighGui;
//实现展示图片接口
public class PC_MatShow implements OpenCv_ShowHandler {
    @Override
    public void showMat(String name, Mat mat) {
        //Opencv的展示图片APi,只能在PC上使用
        HighGui.imshow(name,mat);
    }
}

Chepai_Opencv_Impl : 用来计算图像的实现类

import org.opencv.core.Mat;
import org.opencv.imgproc.Imgproc;

import java.util.HashMap;
import java.util.Map;

public class Chepai_Opencv_Impl implements OpenCv_Inter {
    OpenCv_ShowHandler show ;
    Map<String, Object> data = new HashMap<>();

    @Override
    public void start(Mat src) {
    	//展示Mat图像
        show.showMat("实现类原图",src);
        
        //保存灰度图像的对象
        Mat dst = new Mat();
        
        //将图片转换成灰度图像
        Imgproc.cvtColor(src,dst,Imgproc.COLOR_BGR2GRAY);

        //展示Mat图像
        show.showMat("实现类里面的dst",dst);

        //看需要,将结果保存成一个键值对
        data.put("dst",dst);

        //其他要传递的信息
        data.put("message","这里随便写点啥都行");


    }

    @Override
    public Map<String, Object> data() {
        return data;
    }

    @Override
    public void setShowHandler(OpenCv_ShowHandler show) {
        this.show = show;
    }
}

编写Main函数

public static void main(String[] args) {
	//加载库文件
	System.loadLibrary("opencv_java420");
	
	//读取图片
	Mat src = Imgcodecs.imread("C:\\test\\256_256_t1.png");
	
	//创建实现类
	OpenCv_Inter demo = new Chepai_Opencv_Impl();
	
	//设置PC电脑展示方式
	demo.setShowHandler(new PC_MatShow());
	
	//进行图像处理
	demo.start(src);
	
	//获取数据
	Map<String,Object> data = demo.data();//获取识别结果
	Mat dst = (Mat) data.get("dst");//从Map中读取
	HighGui.imshow("这里是我获取到的数据",dst);//Opencv中的展示API
	System.out.println(data.get("message"));//输出其他信息
	
	//Opencv中需要的保持窗口显示函数
	HighGui.waitKey();
}

展示结果

在这里插入图片描述
把识别过程实现类文件考入到安卓工程里一样正常不报错
在这里插入图片描述
这样的话写一次计算图像计算就行了,调试还方便,写完直接拷贝进安卓就行了

弄完之后… 感觉… 一个字 爽 !!!

调试方便了,妈妈再也不用担心我熬夜加班了

解决了安卓调试时间长
妈妈再也不给我买新电脑了 呜呜呜~~
在这里插入图片描述





发布了56 篇原创文章 · 获赞 52 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/qq_18604209/article/details/104300241