一、准备工作
1、在java工程文件夹(此处即desDesign)下新建lib文件夹,用于存放需引用的jar包:
说明:
因为是matlab打包的jar包,需要依赖matlab中的相关函数,所以要将javabuilder.jar包带上,路径:D:\Program_software\MATLAB_R2014a\toolbox\javabuilder\jar\javabuilder.jar
二、实际使用
1、java工程中导入jar包:
工程文件夹右键——>Build Path——>Config Build Path——>Libraries——>Add Externel JARs——选择jar包所在路径——>确定
2、在java文件中import JAR包并创建其中的类:
(1)、java文件导入包:import 包名.*; 此处即:import BIQILibrary.*;
(2)、创建包中的类,如上图。注意:
matlab生成的jar包中的类在创建时会可能出错,会抛出MWException异常,即matlab工作异常,所以创建类时必须用try catch。
3、使用包中的类的对象的方法:
(1)、如图。发现每个方法都有对应3个同名方法,每个方法的输入输出参数类型不是与对应的m文件中的function一一对应的,所以不能像matlab中那样直接使用。
(2)、查看对应java文件,此处以返回Object[]的getNoiseGrayImg方法为例。打开matlab生成jar包时的fortesting文件夹下的包名文件夹下的对应java文件。如:
(3)、用eclipse查看java文件中将使用的方法(此处即返回Objec[] 类型的getNoiseGrayImg)的说明:
先看下对应函数的m文件:
对应生成的java文件中的函数:
解读:
参数nargout:将返回的参数个数,m文件中返回了一个参数(noiseImg),所以调用时应该写1;
参数rhs:给Matlab函数的输入参数,m文件中定义为4个(srcImg、type、m、v);
函数返回值:一个包含nargout个返回参数的数组,注意为Object类型的数组;
MWException:调用该函数发生错误时的异常。
(4)、具体调用:
几点说明:
第1、格式与java文件中说明一致,即返回类型为Object类型数组,里面存了该函数的返回结果;其次,参数列表为:返回值个数(因为matlab函数是可以同时返回多个结果的)、以逗号分隔的输入参数列表;
第2、输入参数必须要是matlab中具有的类型,如:uint8、uint16、double、int16、single。例如我开始使用的rgbImgData数组中的类型为int类型(32bit),运行时便提示了如下错误:
将数组rgbImgData声明为short[][][]后,问题解决。short为2字节,相当于matlab中int16。
4、对应返回类型为void,但实际函数有返回值的方法,如上面第3步第(1)条图中的第3个同名方法:void getNoiseGrayImg(Object[] arg0,Object[] arg1),其中参数arg0中存放了接受返回值的变量,arg1中存放了函数的输入参数,如使用此方法可这样调用达到与上面同样的结果:
Object[] outputObj=new Object[1];//此函数只返回一个数据,所以返回列表数组outputObj中只有一个元素
outputObj[0]= outputImg;//outputImg为一个二维int或short型数组,用于实际接受返回图片数据
Object[] inputObj=new Object[4];//函数有四个输入参数
inputObj[0]=rgbImgData;//即第3步中第(4)小步的rgbImgData
inputObj[1]="salt & pepper";
inputObj[2]=0;
inputObj[3]=0.05;
//调用
AlgoBIQI.getNoiseGrayImg(outputObj,inputObj);
//调用后outputObj中的元素将接收到返回值
三、遇到的问题及解决方法
1、问题一:java工程中调用matlab生成的函数时,输入类型必须是matlab中具有的类型
分析:使用了int类型(32bit)变量作为输入参数,所以提示此错误
解决方法:
改为short类型(16bit,相当于matlab中int16)或double等。
2、问题二:调用matlab中的rgb2gray函数出现错误
分析:因为函数要输入rgb图像的数据,应该对应的是一个3维数组,但我一开始犯了错,直接用了一个存储了灰度值的二维数组作为输入,所以出错
解决方法:
使用三维数组,如:short[][][] rgbImgData=new short[][][3];每一像素点顺序存储R、G、B值。
3、问题三:不是内部或外部命令,也不是可运行的程序或批处理文件
分析:首先,svm-scale与svm-predict为exe文件。此提示中包含两个子问题:
子问题一:不是内外部命令,也不是可运行的程序或批处理文件。
分析:jdk配置错误时,cmd输入java回车也会出现此提示,所以认定为需要将svm-scale.exe与svm-predict.exe所在目录配置进环境变量。但实际配置好后,cmd虽然能输入svm-scale与svm-predict回车便提示相关正确信息,但运行工程时还是出现同样错误。
最终解决方法:
将svm-scale.exe与svm-predict.exe等工程需要调用的程序,直接放在工程根目录下,此处即dspDesign文件夹下。(注:开始是放在自己建的lib文件夹下的)
子问题二:错误使用load 无法读取文件‘output_blur’:没有此类文件或目录
分析:与上一问题相同,都是放置在lib目录下的,所以程序无法直接读取
解决方法:
移到工程根目录下即可。
参考:http://www.ilovematlab.com/archiver/tid-37633.html