JavaCV - 为什么 IplImage.createFrom(image) 不再存在?

标签 java bufferedimage javacv iplimage

我目前正在使用 JavaCV,尝试一些简单的 Blob 检测。我正在使用 Maven 并从他们的存储库中获取 JavaCV 0.11(更具体的 org.bytedeco.javacv)。一切都没有错误地编译并且工作正常,但是从 BufferedImage 创建 IplImage 的方法似乎不存在。 eclipse 说

The method createFrom(BufferedImage) is undefined for the type opencv_core.IplImage

我不知道问题出在哪里,因为到目前为止除了这一种方法外一切正常。

最佳答案

原因...

JavaCV 0.11引入了FrameConverter的概念。

目标是不要在使用 JavaCV 的应用程序和另一个 API(FFmpeg、Java 2D...)之间创建不必要的耦合。

相反,JavaCV 使用 Frame用于存储音频样本或视频图像数据的类实例。由于 FrameConverter,这些帧稍后可以在各种 API 之间共享

查看更多:JavaCV Frame Converters

解决方法...

总是可以将 createFrom 方法的代码复制并粘贴到您自己的代码中,或者使用 FrameConverter 重构它。

以下是从源存储库中获取的方法的(未编译)代码:

public static IplImage createFrom(BufferedImage image) {
    return createFrom(image, 1.0);
}

public static IplImage createFrom(BufferedImage image, double gamma) {
    return createFrom(image, gamma, false);
}

public static IplImage createFrom(BufferedImage image, double gamma, boolean flipChannels) {
    if (image == null) {
        return null;
    }
    SampleModel sm = image.getSampleModel();
    int depth = 0, numChannels = sm.getNumBands();
    switch (image.getType()) {
        case BufferedImage.TYPE_INT_RGB:
        case BufferedImage.TYPE_INT_ARGB:
        case BufferedImage.TYPE_INT_ARGB_PRE:
        case BufferedImage.TYPE_INT_BGR:
            depth = IPL_DEPTH_8U;
            numChannels = 4;
            break;
    }
    if (depth == 0 || numChannels == 0) {
        switch (sm.getDataType()) {
            case DataBuffer.TYPE_BYTE:   depth = IPL_DEPTH_8U;  break;
            case DataBuffer.TYPE_USHORT: depth = IPL_DEPTH_16U; break;
            case DataBuffer.TYPE_SHORT:  depth = IPL_DEPTH_16S; break;
            case DataBuffer.TYPE_INT:    depth = IPL_DEPTH_32S; break;
            case DataBuffer.TYPE_FLOAT:  depth = IPL_DEPTH_32F; break;
            case DataBuffer.TYPE_DOUBLE: depth = IPL_DEPTH_64F; break;
            default: assert false;
        }
    }
    IplImage i = create(image.getWidth(), image.getHeight(), depth, numChannels);
    i.copyFrom(image, gamma, flipChannels);
    return i;
}

引用:opencv_core.java

关于JavaCV - 为什么 IplImage.createFrom(image) 不再存在?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30537777/

相关文章:

java - 如何在不从Java中的类创建对象的情况下获取MySQL数据

image - 如何在JavaCV中将2张图片相乘

image - 如何在 JavaCV 中实现 PSNR?

java - REST Tomcat 根 URL web.xml @Path

java - e4:依赖注入(inject)和处理小部件

java - 对 BufferedImage 使用 IntBuffer

java - 我在 JPanel 上显示 BufferedImage 和文本字段时遇到问题

android - FFmpegFrameRecorder 在录制时添加文本/图像

java - 如何在java和python之间来回发送数据数组?

java - 将灰度位图转换为二维数组