我目前正在使用 JavaCV,尝试一些简单的 Blob 检测。我正在使用 Maven 并从他们的存储库中获取 JavaCV 0.11(更具体的 org.bytedeco.javacv)。一切都没有错误地编译并且工作正常,但是从 BufferedImage 创建 IplImage 的方法似乎不存在。 eclipse 说
The method createFrom(BufferedImage) is undefined for the type opencv_core.IplImage
我不知道问题出在哪里,因为到目前为止除了这一种方法外一切正常。
最佳答案
原因...
JavaCV 0.11引入了FrameConverter
的概念。
目标是不要在使用 JavaCV 的应用程序和另一个 API(FFmpeg、Java 2D...)之间创建不必要的耦合。
相反,JavaCV 使用 Frame
用于存储音频样本或视频图像数据的类实例。由于 FrameConverter
,这些帧稍后可以在各种 API 之间共享
解决方法...
总是可以将 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;
}
关于JavaCV - 为什么 IplImage.createFrom(image) 不再存在?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30537777/