【问题标题】:JavaCV - Why IplImage.createFrom(image) doesn't exist anymore?JavaCV - 为什么 IplImage.createFrom(image) 不再存在?
【发布时间】:2015-08-12 19:17:51
【问题描述】:

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

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

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

【问题讨论】:

    标签: java bufferedimage javacv iplimage


    【解决方案1】:

    原因……

    JavaCV 0.11 引入了FrameConverter 的概念。

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

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

    查看更多: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

    【讨论】:

    • IplImage中的copyFrom()方法不存在。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-08-02
    • 1970-01-01
    • 2018-08-30
    • 2015-07-12
    • 2015-04-25
    • 1970-01-01
    • 2012-07-17
    相关资源
    最近更新 更多