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

use*_*883 6 java bufferedimage iplimage javacv

我现在正在使用JavaCV,尝试一些简单的blob检测.我正在使用maven并从他们的存储库获得JavaCV 0.11(更具体的org.bytedeco.javacv).一切都编译没有错误,工作正常,但从BufferedImage创建IplImage的方法似乎不存在.Eclipse说

The method createFrom(BufferedImage) is undefined for the type opencv_core.IplImage
Run Code Online (Sandbox Code Playgroud)

我不知道问题是什么,因为除了这个方法到目前为止一切正常.

Ste*_*han 2

原因...

JavaCV 0.11 引入了FrameConverter.

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

相反,JavaCV 使用Frame类实例来存储音频样本或视频图像数据。借助 s,这些框架稍后可以在各种 API 之间共享FrameConverter

查看更多:JavaCV 帧转换器

解决方法...

始终可以将该方法的代码复制并粘贴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;
}
Run Code Online (Sandbox Code Playgroud)

参考:opencv_core.java

  • IplImage 中的 copyFrom() 方法不存在。 (4认同)