2015-10-18 38 views
2

嗨,大家好我正在嘗試使用JavaCV,因爲我想了解它是如何工作的,以便將它的功能包含在我記住的項目中。我已經下載並設置OpenCV,就像指示說的那樣,我也下載了bytedeco這個JavaCV 1.0 jar包,我需要在我的項目中包含這些jar包。關於JavaCV示例的問題

我已經開始使用我在網上找到的一個示例程序,該程序基本上可以抓取並保存攝像頭中的圖像。我寫的代碼如下:

import org.bytedeco.javacpp.opencv_core.IplImage; 
import org.bytedeco.javacv.CanvasFrame; 
import org.bytedeco.javacv.Frame; 
import org.bytedeco.javacv.FrameGrabber; 
import org.bytedeco.javacv.VideoInputFrameGrabber; 

import org.bytedeco.javacv.*; 
import org.bytedeco.javacpp.*; 
import static org.bytedeco.javacpp.opencv_core.*; 
import static org.bytedeco.javacpp.opencv_imgproc.*; 
import static org.bytedeco.javacpp.opencv_imgcodecs.*; 

public class GrabberShow implements Runnable{ 

    IplImage image; 
    CanvasFrame canvas = new CanvasFrame("Web Cam"); 

    public GrabberShow(){ 
     canvas.setDefaultCloseOperation(javax.swing.JFrame.EXIT_ON_CLOSE); 
    } 

    public void run(){ 
     FrameGrabber grabber = new VideoInputFrameGrabber(0); 
     int i = 0; 
     try{ 
      grabber.start(); 
      IplImage img; 
      while(true){ 
       img = grabber.grab(); 
       if(img != null){ 
        cvFlip(img, img, 1); 
        cvSaveImage((i++) + "-aa.img", img); 
        canvas.showImage(img); 
       } 
      } 
     }catch(Exception e){ 
      e.printStackTrace(); 
     } 

    } 

    public static void main(String[] args){ 
     GrabberShow gs = new GrabberShow(); 
     Thread th = new Thread(gs); 
     th.start(); 
    } 
} 

這是一個非常直接和簡單的例子。我遇到的問題可在以下行中找到:

img = grabber.grab(); 

canvas.showImage(img); 

我所面臨的問題是一個類型不匹配「不能從幀轉換爲opencv_core.LplImage」。

我嘗試過在線搜索,但無法找到有關此問題的良好答案。我所發現的僅僅是同一個例子。有沒有人對此有任何想法?

需要強調的是,這是我第一次在Java中使用openCV。我過去曾經使用它來製作和實現對象跟蹤程序,但是這是通過原生openCV和使用Python完成的。

+0

你應該使用官方的[OpenCV的Java包裝(http://docs.opencv.org/doc/tutorials/introduction/desktop_java/java_dev_intro.html),不JavaCV。 – Miki

+0

我已經讀過使用JavaCV並不差,因爲本教程使用的是JavaCV,所以我決定採用這種方式。爲什麼我應該使用OpenCV呢? – Aris

+0

因爲它是官方的,因此保持良好。還有很多教程,例子等......但你的選擇:D – Miki

回答

0

你看起來像這樣的代碼可能適用於javacv版本0.10。對於1.0 FrameGrabber的返回Frame對象,然後需要使用OpenCVFrameConverter.ToIplImage轉換爲IplImage對象。

import org.bytedeco.javacpp.opencv_core.IplImage; 
import static org.bytedeco.javacpp.opencv_core.cvFlip; 
import static org.bytedeco.javacpp.opencv_imgcodecs.cvSaveImage; 
import org.bytedeco.javacv.CanvasFrame; 
import org.bytedeco.javacv.Frame; 
import org.bytedeco.javacv.FrameGrabber; 
import org.bytedeco.javacv.OpenCVFrameConverter; 
import org.bytedeco.javacv.VideoInputFrameGrabber; 

...

public class GrabberShow implements Runnable { 

    CanvasFrame canvas = new CanvasFrame("Web Cam"); 

    public GrabberShow() { 
     canvas.setDefaultCloseOperation(javax.swing.JFrame.EXIT_ON_CLOSE); 
    } 

    public void run() { 
     FrameGrabber grabber = new VideoInputFrameGrabber(0); 
     OpenCVFrameConverter.ToIplImage converter = new OpenCVFrameConverter.ToIplImage(); 

     int i = 0; 
     try { 
      grabber.start(); 
      IplImage img; 
      while (true) { 
       Frame frame = grabber.grab(); 
       img = converter.convert(frame); 
       if (img != null) { 
        cvFlip(img, img, 1); 
        cvSaveImage((i++) + "-aa.img", img); 
        canvas.showImage(frame); 
       } 
      } 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 

    public static void main(String[] args) { 
     GrabberShow gs = new GrabberShow(); 
     Thread th = new Thread(gs); 
     th.start(); 
    } 
}