一、准備工作
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