2015-10-18 35 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(); 
    } 
}