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

时间:2015-05-29 19:38:25

标签: 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

我不知道问题是什么,因为除了这一种方法,一切正常。

1 个答案:

答案 0 :(得分:3)

原因......

JavaCV 0.11引入了FrameConverter

的概念

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

相反,JavaCV使用Frame类实例来存储音频样本或视频图像数据。由于FrameConverter s。

,以后可以在各种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