我目前正在使用JavaCV,尝试一些简单的blob检测。我正在使用maven并从他们的存储库获得JavaCV 0.11(更具体的org.bytedeco.javacv)。一切都编译没有错误并且工作正常,但是从BufferedImage创建IplImage的方法似乎并不存在。 Eclipse说
The method createFrom(BufferedImage) is undefined for the type opencv_core.IplImage
我不知道问题是什么,因为除了这一种方法,一切正常。
答案 0 :(得分:3)
JavaCV 0.11引入了FrameConverter
。
目标是不要在使用JavaCV的应用程序和另一个API(FFmpeg,Java 2D ......)之间创建不必要的耦合。
相反,JavaCV使用Frame
类实例来存储音频样本或视频图像数据。由于FrameConverter
s。
始终可以将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;
}