【问题标题】:Questions about JavaCV example关于 JavaCV 示例的问题
【发布时间】:2016-01-17 00:05:30
【问题描述】:

大家好,我正在尝试使用 JavaCV,因为我想了解它是如何工作的,以便将它的功能包含在我想到的项目中。我已经按照说明下载并设置了 OpenCV,并且还从 bytedeco 下载了需要包含在项目中的 JavaCV 1.0 jar。

我从网上找到的一个示例程序开始,它基本上从网络摄像头抓取和保存图像。我写的代码如下:

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);

我面临的问题是类型不匹配“无法从 Frame 转换为 opencv_core.LplImage”。

我已尝试在线搜索此内容,但无法找到有关此内容的好答案。我发现的只是同一个例子。有人对此有任何想法吗?

需要强调的是,这是我第一次在 Java 中使用 openCV。我过去曾用它来制作和对象跟踪程序,但这是使用本机 openCV 和 Python 完成的。

【问题讨论】:

  • 你应该使用官方的OpenCV Java wrapper,而不是JavaCV。
  • 我读到使用 JavaCV 一点也不差,因为本教程使用的是 JavaCV,所以我决定采用这种方式。为什么要改用 OpenCV?
  • 因为它是官方的,因此维护得很好。还有很多教程,示例等...但是您的选择:D

标签: java opencv video webcam javacv


【解决方案1】:

您的代码看起来可能适用于 javacv 0.10 版。对于 1.0 FrameGrabber 的 returnFrame 对象,然后需要使用 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();
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-01-15
    • 2011-10-12
    • 2020-08-03
    • 1970-01-01
    • 1970-01-01
    • 2022-10-01
    • 1970-01-01
    相关资源
    最近更新 更多