2015年1月27日 星期二

[Java] JavaCV初體驗筆記-Smooth

Java要使用OpenCV有二種方式: (1) 透過JNI去呼叫OpenCV的C。(2)使用JavaCV。



javaCV 的簡介 - 資料來源  (翻成繁中)


JavaCV是對各種常用電腦視覺函式庫的封裝後的一組JAR包,其中封裝了OpenCV、

libdc1394、OpenKinect、videoInput和ARToolKitPlus等電腦視覺程式設計人員常用函式

庫的接口,可以通過其中的utility類方便的在包括Android在內的Java平台上調用這些接口。

另外JavaCV還帶有硬件加速的全螢幕圖像顯示(CanvasFrame),易於在多核心中執行

並行代碼,用戶友好的幾何和色彩的相機和投影儀校准(GeometricCalibrator,

ProCamGeometricCalibrator,ProCamColorCalibrator ),檢測和特徵點

(ObjectFinder),一類是實現投影,攝像系統(直接圖像對齊設置匹配主要

GNImageAligner,ProjectiveTransformer,ProjectiveGainBiasTransformer,

ProCamTransformer和ReflectanceInitializer),以及在JavaCV類雜項功能。



JavaCV安裝

https://github.com/bytedeco/javacv

到這裡下載avaCV 0.10 binary archive javacv-0.10-bin.zip (136 MB)

網頁中有教各種IDE的使用方法,小弟我使用Netbeans 嘗試了Smooth範例,確認是可以執

行的。為了方便筆記Demo ,自己有小修改了一下。

裝JavaCV(0.10版本)之前,不必先安裝OpenCV 。


範例圖片在這裡

http://www.cs.cmu.edu/~chuck/lennapg/lena_std.tif


這個範例只需要引入一個openCV.jar 即可












程式碼如下


package javacv;

import  org.bytedeco.javacpp.opencv_core.IplImage;
import static org.bytedeco.javacpp.opencv_core.cvReleaseImage;
import static org.bytedeco.javacpp.opencv_highgui.cvLoadImage;
import static org.bytedeco.javacpp.opencv_highgui.cvSaveImage;
import static org.bytedeco.javacpp.opencv_highgui.cvShowImage;
import static org.bytedeco.javacpp.opencv_highgui.cvDestroyWindow;
import static org.bytedeco.javacpp.opencv_highgui.cvWaitKey;
import static org.bytedeco.javacpp.opencv_imgproc.cvSmooth;

public class Javacv {

     public  void smooth(String filename ,String savefilename) { 
        //讀取來源檔案
        IplImage image = cvLoadImage(filename);
        //覆製1個來源檔做為輸出
        IplImage image2=image.clone() ;
        if (image != null) {
            //對image做平滑處理,結果存到image2
            cvSmooth(image,image2);
            //顯示來源檔案
            cvShowImage("Source",image);
            //顯示平滑後的檔案
            cvShowImage("Smooth",image2);
            //等待20秒,不然一顯示完就關掉了。
            cvWaitKey(20000);
            //儲存結果
            cvSaveImage(savefilename, image2);
            //把視窗資源釋放
            cvDestroyWindow("Source");
            cvDestroyWindow("Smooth");
            
            //cvReleaseImage 有點怪,不能使用,原因還在查。
            //cvReleaseImage(image);
            //cvReleaseImage(image2);
        }
    }
     
    public static void main(String args[])
    {
        //來源路徑,結果儲存路徑
        new Javacv().smooth("/Users/flowercatswets/Downloads/lena_std.tif" ,"/Users/flowercatswets/Downloads/lena_smooth.tif" );
    }
    
}



值得注意一件事,程式碼中的import 前3行做個比較
import  org.bytedeco.javacpp.opencv_core.IplImage;
import static org.bytedeco.javacpp.opencv_core.cvReleaseImage;
import static org.bytedeco.javacpp.opencv_highgui.cvLoadImage;

你會發現第2及3行import 後面有多一個static,因為cvReleaseImage 以及 cvLoadImage 都是函式。



左邊是原始圖片,右邊是經過smooth圖片 ,可以明顯發現,左圖明顯較稅利。



沒有留言:

張貼留言