【发布时间】:2016-11-21 05:01:34
【问题描述】:
我需要帮助将我的 IplImage 转换为 Mat。我想为我的图像计算HOGDescriptor,然后用SVM对其进行分类,但“计算”需要Mat类型。
你能举一些例子说明如何在java中将IplImage转换成Mat吗?
【问题讨论】:
-
将 IplImage 转换为 BufferedImage ,然后我认为 API 将允许您使用 Mat 制作图像
我需要帮助将我的 IplImage 转换为 Mat。我想为我的图像计算HOGDescriptor,然后用SVM对其进行分类,但“计算”需要Mat类型。
你能举一些例子说明如何在java中将IplImage转换成Mat吗?
【问题讨论】:
将 IplImage 转换为 Mat 很简单。
IplImage iplImage= cvLoadImage("image.png");
Mat matImage = new Mat(iplImage);
反之亦然
【讨论】:
不要混淆official OpenCV Java binding 有文档的here 和JavaCV 项目没有文档。
如果您使用JavaCV,则无需转换IplImage 即可使用HOGDescriptor,正如您在JavaCV source 中看到的那样,HOGDescriptor 对象包装器操作@ 987654331@对象:
// javacv/cpp/opencv_objdetect.java:527
public static class HOGDescriptor extends Pointer {
public HOGDescriptor();
...
public native void setSVMDetector(CvArr _svmdetector);
...
public native void compute(CvArr img, FloatPointer descriptors, CvSize winStride, CvSize padding, CvPoint locations);
public native void detect(CvArr img, CvPoint foundLocations, DoublePointer weights, double hitThreshold, CvSize winStride, CvSize padding, CvPoint searchLocations);
public native void detect(CvArr img, CvPoint foundLocations, double hitThreshold, CvSize winStride, CvSize padding, CvPoint searchLocations);
public native void detectMultiScale(CvArr img, CvRect foundLocations, double hitThreshold, CvSize winStride, CvSize padding, double scale, int groupThreshold);
public native void detectMultiScale(CvArr img, CvRect foundLocations, DoublePointer foundWeights, double hitThreshold, CvSize winStride, CvSize padding, double scale, double finalThreshold, boolean useMeanshiftGrouping);
public native void detectMultiScale(CvArr img, CvRect foundLocations, double hitThreshold, CvSize winStride, CvSize padding, double scale, double finalThreshold, boolean useMeanshiftGrouping);
...
};
现在,正如您在 opencv_core.java 中看到的那样,IplImage 包装器对象扩展了 CvArr:
// javacv/cpp/opencv_core.java:410
public static class IplImage extends CvArr {
...
};
因此您不必进行任何转换。
这里是一个使用HOGDescriptor.detectMultiScale的例子:
IplImage img = cvLoadImage("image.jpg");
CvRect foundRects = new CvRect(null);
HOGDescriptor hog = new HOGDescriptor();
FloatPointer svm = HOGDescriptor.getDefaultPeopleDetector();
hog.setSVMDetector(svm);
hog.detectMultiScale(img, foundRects, 0, cvSize(8,8), cvSize(32,32), 1.05, 2);
【讨论】:
有一个方法:
opencv_core.cvarrToMat(iplImage);
【讨论】: