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();
}
展示结果
把识别过程实现类文件考入到安卓工程里一样正常不报错
这样的话写一次计算图像计算就行了,调试还方便,写完直接拷贝进安卓就行了
弄完之后… 感觉… 一个字 爽 !!!
调试方便了,妈妈再也不用担心我熬夜加班了
解决了安卓调试时间长
妈妈再也不给我买新电脑了 呜呜呜~~