Skip to content

Commit

Permalink
* Include new createIndexer() method in CvMat, IplImage, Mat
Browse files Browse the repository at this point in the history
…, etc. for easy and efficient multidimensional access of data ([issue #317](http://code.google.com/p/javacv/issues/detail?id=317))

 * Deprecate `get*Buffer()` methods in favor of a better named and generic `createBuffer()` method
  • Loading branch information
saudet committed Oct 19, 2014
1 parent 8e66bb0 commit ab8bde3
Show file tree
Hide file tree
Showing 2 changed files with 140 additions and 23 deletions.
2 changes: 2 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@

* Include new `createIndexer()` method in `CvMat`, `IplImage`, `Mat`, etc. for easy and efficient multidimensional access of data ([issue #317](http://code.google.com/p/javacv/issues/detail?id=317))
* Deprecate `get*Buffer()` methods in favor of a better named and generic `createBuffer()` method
* Fix `java.lang.UnsatisfiedLinkError` when allocating `opencv_core.Mat`, among others ([issue javacv:9](https://github.com/bytedeco/javacv/issues/9) and [issue javacv:28](https://github.com/bytedeco/javacv/issues/28))
* Force OpenCV to build with GCC 4.6, as newer versions are known to hang on Android 2.2 ([issue android:43819](https://code.google.com/p/android/issues/detail?id=43819))
* Upgrade presets for FFmpeg 2.4.2, LLVM 3.5.0, videoInput, where the latest code got merged into the master branch
Expand Down
161 changes: 138 additions & 23 deletions opencv/src/main/java/org/bytedeco/javacpp/helper/opencv_core.java
Original file line number Diff line number Diff line change
Expand Up @@ -20,18 +20,6 @@

package org.bytedeco.javacpp.helper;

import org.bytedeco.javacpp.BytePointer;
import org.bytedeco.javacpp.DoublePointer;
import org.bytedeco.javacpp.FloatPointer;
import org.bytedeco.javacpp.IntPointer;
import org.bytedeco.javacpp.Loader;
import org.bytedeco.javacpp.LongPointer;
import org.bytedeco.javacpp.Pointer;
import org.bytedeco.javacpp.PointerPointer;
import org.bytedeco.javacpp.ShortPointer;
import org.bytedeco.javacpp.annotation.Name;
import org.bytedeco.javacpp.annotation.Opaque;
import org.bytedeco.javacpp.annotation.ValueGetter;
import java.awt.Rectangle;
import java.awt.Transparency;
import java.awt.color.ColorSpace;
Expand All @@ -51,11 +39,36 @@
import java.awt.image.SampleModel;
import java.awt.image.SinglePixelPackedSampleModel;
import java.awt.image.WritableRaster;
import java.nio.Buffer;
import java.nio.ByteBuffer;
import java.nio.DoubleBuffer;
import java.nio.FloatBuffer;
import java.nio.IntBuffer;
import java.nio.ShortBuffer;
import org.bytedeco.javacpp.BytePointer;
import org.bytedeco.javacpp.DoublePointer;
import org.bytedeco.javacpp.FloatPointer;
import org.bytedeco.javacpp.IntPointer;
import org.bytedeco.javacpp.Loader;
import org.bytedeco.javacpp.LongPointer;
import org.bytedeco.javacpp.Pointer;
import org.bytedeco.javacpp.PointerPointer;
import org.bytedeco.javacpp.ShortPointer;
import org.bytedeco.javacpp.annotation.Name;
import org.bytedeco.javacpp.annotation.Opaque;
import org.bytedeco.javacpp.annotation.ValueGetter;
import org.bytedeco.javacpp.indexer.ByteArrayIndexer;
import org.bytedeco.javacpp.indexer.ByteBufferIndexer;
import org.bytedeco.javacpp.indexer.DoubleArrayIndexer;
import org.bytedeco.javacpp.indexer.DoubleBufferIndexer;
import org.bytedeco.javacpp.indexer.FloatArrayIndexer;
import org.bytedeco.javacpp.indexer.FloatBufferIndexer;
import org.bytedeco.javacpp.indexer.Indexable;
import org.bytedeco.javacpp.indexer.Indexer;
import org.bytedeco.javacpp.indexer.IntArrayIndexer;
import org.bytedeco.javacpp.indexer.IntBufferIndexer;
import org.bytedeco.javacpp.indexer.ShortArrayIndexer;
import org.bytedeco.javacpp.indexer.ShortBufferIndexer;

// required by javac to resolve circular dependencies
import org.bytedeco.javacpp.opencv_core.*;
Expand Down Expand Up @@ -114,7 +127,7 @@

public class opencv_core extends org.bytedeco.javacpp.presets.opencv_core {

public static abstract class AbstractArray extends Pointer {
public static abstract class AbstractArray extends Pointer implements Indexable {
static { Loader.load(); }
public AbstractArray() { }
public AbstractArray(Pointer p) { super(p); }
Expand All @@ -130,6 +143,108 @@ public AbstractArray() { }
public abstract BytePointer arrayData();
public abstract int arrayStep();

/** @return {@code createBuffer(0)} */
public <B extends Buffer> B createBuffer() {
return createBuffer(0);
}
/** @return {@link #arrayData()} wrapped in a {@link Buffer} of appropriate type starting at given index */
public <B extends Buffer> B createBuffer(int index) {
BytePointer ptr = arrayData();
int size = arraySize();
switch (arrayDepth()) {
case IPL_DEPTH_8U:
case IPL_DEPTH_8S: return (B)ptr.position(index).capacity(size).asBuffer();
case IPL_DEPTH_16U:
case IPL_DEPTH_16S: return (B)new ShortPointer(ptr).position(index).capacity(size/2).asBuffer();
case IPL_DEPTH_32S: return (B)new IntPointer(ptr).position(index).capacity(size/4).asBuffer();
case IPL_DEPTH_32F: return (B)new FloatPointer(ptr).position(index).capacity(size/4).asBuffer();
case IPL_DEPTH_64F: return (B)new DoublePointer(ptr).position(index).capacity(size/8).asBuffer();
case IPL_DEPTH_1U:
default: assert false;
}
return null;
}

/** @return {@code createIndexer(true)} */
public <I extends Indexer> I createIndexer() {
return createIndexer(true);
}
@Override public <I extends Indexer> I createIndexer(boolean direct) {
int[] sizes = { arrayHeight(), arrayWidth(), arrayChannels() };
int[] strides = { arrayStep(), arrayChannels(), 1 };
switch (arrayDepth()) {
case IPL_DEPTH_8U:
case IPL_DEPTH_8S:
if (direct) {
return (I)new ByteBufferIndexer((ByteBuffer)createBuffer(), sizes, strides);
} else {
byte[] array = new byte[arraySize()];
final BytePointer ptr = arrayData().get(array);
return (I)new ByteArrayIndexer(array, sizes, strides) {
@Override public void release() {
ptr.put(array);
}
};
}
case IPL_DEPTH_16U:
case IPL_DEPTH_16S:
strides[0] /= 2;
if (direct) {
return (I)new ShortBufferIndexer((ShortBuffer)createBuffer(), sizes, strides);
} else {
short[] array = new short[arraySize()];
final ShortPointer ptr = new ShortPointer(arrayData()).get(array);
return (I)new ShortArrayIndexer(array, sizes, strides) {
@Override public void release() {
ptr.put(array);
}
};
}
case IPL_DEPTH_32S:
strides[0] /= 4;
if (direct) {
return (I)new IntBufferIndexer((IntBuffer)createBuffer(), sizes, strides);
} else {
int[] array = new int[arraySize()];
final IntPointer ptr = new IntPointer(arrayData()).get(array);
return (I)new IntArrayIndexer(array, sizes, strides) {
@Override public void release() {
ptr.put(array);
}
};
}
case IPL_DEPTH_32F:
strides[0] /= 4;
if (direct) {
return (I)new FloatBufferIndexer((FloatBuffer)createBuffer(), sizes, strides);
} else {
float[] array = new float[arraySize()];
final FloatPointer ptr = new FloatPointer(arrayData()).get(array);
return (I)new FloatArrayIndexer(array, sizes, strides) {
@Override public void release() {
ptr.put(array);
}
};
}
case IPL_DEPTH_64F:
strides[0] /= 8;
if (direct) {
return (I)new DoubleBufferIndexer((DoubleBuffer)createBuffer(), sizes, strides);
} else {
double[] array = new double[arraySize()];
final DoublePointer ptr = new DoublePointer(arrayData()).get(array);
return (I)new DoubleArrayIndexer(array, sizes, strides) {
@Override public void release() {
ptr.put(array);
}
};
}
case IPL_DEPTH_1U:
default: assert false;
}
return null;
}

protected BufferedImage cloneBufferedImage() {
if (bufferedImage == null) {
return null;
Expand Down Expand Up @@ -162,16 +277,16 @@ public double highValue() {

public CvSize cvSize() { return org.bytedeco.javacpp.opencv_core.cvSize(arrayWidth(), arrayHeight()); }

public ByteBuffer getByteBuffer (int index) { return arrayData().position(index).capacity(arraySize()).asByteBuffer(); }
public ShortBuffer getShortBuffer (int index) { return getByteBuffer(index*2).asShortBuffer(); }
public IntBuffer getIntBuffer (int index) { return getByteBuffer(index*4).asIntBuffer(); }
public FloatBuffer getFloatBuffer (int index) { return getByteBuffer(index*4).asFloatBuffer(); }
public DoubleBuffer getDoubleBuffer(int index) { return getByteBuffer(index*8).asDoubleBuffer(); }
public ByteBuffer getByteBuffer() { return getByteBuffer (0); }
public ShortBuffer getShortBuffer() { return getShortBuffer (0); }
public IntBuffer getIntBuffer() { return getIntBuffer (0); }
public FloatBuffer getFloatBuffer() { return getFloatBuffer (0); }
public DoubleBuffer getDoubleBuffer() { return getDoubleBuffer(0); }
@Deprecated public ByteBuffer getByteBuffer (int index) { return arrayData().position(index).capacity(arraySize()).asByteBuffer(); }
@Deprecated public ShortBuffer getShortBuffer (int index) { return getByteBuffer(index*2).asShortBuffer(); }
@Deprecated public IntBuffer getIntBuffer (int index) { return getByteBuffer(index*4).asIntBuffer(); }
@Deprecated public FloatBuffer getFloatBuffer (int index) { return getByteBuffer(index*4).asFloatBuffer(); }
@Deprecated public DoubleBuffer getDoubleBuffer(int index) { return getByteBuffer(index*8).asDoubleBuffer(); }
@Deprecated public ByteBuffer getByteBuffer() { return getByteBuffer (0); }
@Deprecated public ShortBuffer getShortBuffer() { return getShortBuffer (0); }
@Deprecated public IntBuffer getIntBuffer() { return getIntBuffer (0); }
@Deprecated public FloatBuffer getFloatBuffer() { return getFloatBuffer (0); }
@Deprecated public DoubleBuffer getDoubleBuffer() { return getDoubleBuffer(0); }

public static final byte[]
gamma22 = new byte[256],
Expand Down

0 comments on commit ab8bde3

Please sign in to comment.