我真的很困惑在OpenCV中使用Mat和IplImage对象。我在这里阅读了很多问题和答案,但我仍然遇到这两种类型的问题。
很多时候,我需要将它们转换为彼此,这就是让我在这些转换中迷失的原因。我知道和使用的函数有时会使用IplImage对象,有时还会使用Mat对象。
例如,“cvThreshold”方法采用IplImages,“threshold”方法采用Mat对象,这里没问题,但“cvSmooth”方法仅适用于IplImages,我找不到Mat对象的专用方法(有吗?) ,然后我不情愿地将Mat转换为IplImage,然后在“cvSmooth”中使用,然后再转换为Mat。此时,如何将mat对象与cvSmooth一起使用?我确信这不是处理这个问题的正常方法,而且还有更好的方法。也许我在理解这些类型时遗漏了一些东西。
你能帮我解决这个问题吗?
答案 0 :(得分:2)
致电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" );
}
答案 1 :(得分:1)
坚持两个中的一个。 cv::Mat
是C ++的方式。该类具有引用计数机制并处理所有垃圾收集过程。每个cv*
函数在C ++中都有相应的cv::*
版本(主要是IMO)。
对于cvSmooth等效项,您可以使用cv::GaussianBlur(..)
或cv::medianBlur(..)
或cv::blur(..)
。有很多变化。最好一如既往地查阅文档。 cvSmooth(..)
只是分成了各种功能。