【问题标题】:What is the best way to be able to use Mat object as IplImage object and vice versa?能够将 Mat 对象用作 IplImage 对象的最佳方法是什么,反之亦然?
【发布时间】:2012-06-02 16:12:44
【问题描述】:

我对在 OpenCV 中使用 Mat 和 IplImage 对象感到非常困惑。我在这里阅读了很多问题和答案,但这两种类型我仍然遇到麻烦。

很多时候,我需要将它们相互转换,这让我在这些转换中迷失了方向。我知道和使用的函数有时会使用 IplImage 对象,有时会使用 Mat 对象。

例如,“cvThreshold”方法采用 IplImages,“threshold”方法采用 Mat 对象,这里没有问题,但“cvSmooth”方法仅适用于 IplImages,我找不到 Mat 对象的专用方法(有吗?) ,然后我不情愿地将Mat转换为IplImage,然后在“cvSmooth”中使用,然后再次转换为Mat。此时,如何将 Mat 对象与 cvSmooth 一起使用?我确信这不是处理此问题的正常方法,并且有更好的方法。也许我在理解这些类型时遗漏了一些东西。

你能帮我解决这个问题吗?

【问题讨论】:

    标签: opencv iplimage


    【解决方案1】:

    致电cvSmooth:

    void callCvSmooth(cv::Mat srcmtx, cv::Mat dstmtx, int smooth_type,
          int param1, int param2, double param3, double param4 )
    {
       IplImage src = srcmtx;
       IplImage dst = dstmtx;
       cvSmooth( &src, &dst, smooth_type, param1, param2, param3, param4 );
    }
    

    但是,如果您查看 cvSmooth 实现,您会很容易找到 C++ 类似物:

    CV_IMPL void
    cvSmooth( const void* srcarr, void* dstarr, int smooth_type,
              int param1, int param2, double param3, double param4 )
    {
        cv::Mat src = cv::cvarrToMat(srcarr), dst0 = cv::cvarrToMat(dstarr), dst = dst0;
    
        CV_Assert( dst.size() == src.size() &&
            (smooth_type == CV_BLUR_NO_SCALE || dst.type() == src.type()) );
    
        if( param2 <= 0 )
            param2 = param1;
    
        if( smooth_type == CV_BLUR || smooth_type == CV_BLUR_NO_SCALE )
            cv::boxFilter( src, dst, dst.depth(), cv::Size(param1, param2), cv::Point(-1,-1),
                smooth_type == CV_BLUR, cv::BORDER_REPLICATE );
        else if( smooth_type == CV_GAUSSIAN )
            cv::GaussianBlur( src, dst, cv::Size(param1, param2), param3, param4, cv::BORDER_REPLICATE );
        else if( smooth_type == CV_MEDIAN )
            cv::medianBlur( src, dst, param1 );
        else
            cv::bilateralFilter( src, dst, param1, param3, param4, cv::BORDER_REPLICATE );
    
        if( dst.data != dst0.data )
            CV_Error( CV_StsUnmatchedFormats, "The destination image does not have the proper type" );
    }
    

    【讨论】:

      【解决方案2】:

      坚持两者之一。 cv::Mat 是 C++ 的方式。该类具有引用计数机制并处理所有垃圾收集过程。每个 cv* 函数在 C++(主要是 IMO)中都有一个对应的 cv::* 版本。


      对于 cvSmooth 等效项,您可以使用 cv::GaussianBlur(..)cv::medianBlur(..)cv::blur(..)。有很多变化。最好一如既往地查阅文档。 cvSmooth(..) 只是分成了不同的功能。

      【讨论】:

        猜你喜欢
        • 2016-12-22
        • 1970-01-01
        • 1970-01-01
        • 2017-07-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多