JavaCV - Почему IplImage.createFrom(image) больше не существует?

В данный момент я работаю с JavaCV, чтобы попробовать простое обнаружение больших двоичных объектов. Я использую maven и получил JavaCV 0.11 (более конкретный org.bytedeco.javacv) из своих репозиториев. Все компилируется без ошибок и работает нормально, но метода создания IplImage из BufferedImage, похоже, не существует. Затмение говорит

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

Я понятия не имею, в чем проблема, потому что пока все работает нормально, кроме этого одного метода.


person user3262883    schedule 29.05.2015    source источник


Ответы (1)


Причина...

JavaCV 0.11 представила концепцию FrameConverter.

Цель состоит в том, чтобы не создавать ненужной связи между приложением, использующим JavaCV, и другим API (FFmpeg, Java 2D...).

Вместо этого JavaCV использует экземпляры класса Frame для хранения аудиосэмплов или данные видеоизображения. Позже эти кадры можно будет использовать между различными 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;
}

Ссылка: opencv_core.java

person Stephan    schedule 23.06.2015
comment
Метода copyFrom() в IplImage не существует. - person Duncan Calvert; 06.09.2016