【问题标题】:Convert IplImage to Mat in javacv在 javacv 中将 IplImage 转换为 Mat
【发布时间】:2016-11-21 05:01:34
【问题描述】:

我需要帮助将我的 IplImage 转换为 Mat。我想为我的图像计算HOGDescriptor,然后用SVM对其进行分类,但“计算”需要Mat类型。

你能举一些例子说明如何在java中将IplImage转换成Mat吗?

【问题讨论】:

  • 将 IplImage 转换为 BufferedImage ,然后我认为 API 将允许您使用 Mat 制作图像

标签: java opencv javacv


【解决方案1】:

将 IplImage 转换为 Mat 很简单。

IplImage iplImage= cvLoadImage("image.png");

Mat matImage = new Mat(iplImage);

反之亦然

【讨论】:

    【解决方案2】:

    不要混淆official OpenCV Java binding 有文档的hereJavaCV 项目没有文档。

    如果您使用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);
    

    【讨论】:

      【解决方案3】:

      有一个方法:

      opencv_core.cvarrToMat(iplImage);
      

      【讨论】:

        猜你喜欢
        • 2017-05-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-06-07
        • 1970-01-01
        • 2015-05-13
        • 1970-01-01
        相关资源
        最近更新 更多