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

JavaCV - Why IplImage.createFrom(image) doesn't exist anymore?

我目前正在使用 JavaCV,尝试一些简单的斑点检测。我正在使用 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 class instances for storing audio samples or video image data. Those frames can be later shared between various APIs thanks to FrameConverters。

查看更多:JavaCV Frame Converters

解决方法...

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

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

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