能够将 Mat 对象用作 IplImage 对象的最佳方法是什么,反之亦然



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

很多时候,我需要将它们相互转换,这就是让我迷失在这些转换中的原因。我知道和使用的功能有时采用 IplImage 对象,有时采用 Mat 对象。

例如,"cvThreshold"方法采用IplImages,"threshold"方法采用Mat对象,这里没有问题,但是"cvSmooth"方法

仅适用于IplImages,我找不到用于Mat对象的专用方法(有吗?),然后我不情愿地将Mat转换为IplImage然后在"cvSmooth"中使用,然后再次转换为Mat。此时,如何将 Mat 对象与 cvSmooth 一起使用?我相信这不是处理此问题的正常方法,并且有更好的方法。也许我在理解这些类型方面缺少一些东西。

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

调用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" );
}

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


对于 cvSmooth 等效项,您可以使用 cv::GaussianBlur(..)cv::medianBlur(..)cv::blur(..) 。有很多变化。最好像往常一样查阅文档。cvSmooth(..)只是分为各种功能。

相关内容

  • 没有找到相关文章

最新更新