0

私はOpenCVでMat​​オブジェクトとIplImageオブジェクトを使用することで本当に混乱しています。ここでたくさんの質問と回答を読みましたが、まだこの2つのタイプに問題があります。

多くの場合、私はそれらを互いに変換する必要があり、それが私をそれらの変換で失ってしまうものです。私が知っていて使用している関数は、IplImageオブジェクトを使用することもあれば、Matオブジェクトを使用することもあります。

たとえば、「cvThreshold」メソッドはIplImagesを取り、「threshold」メソッドはMatオブジェクトを取ります。ここでは問題ありませんが、「cvSmooth」メソッドはIplImages専用であり、Matオブジェクト専用のメソッドが見つかりませんでした(ありますか?)。不本意ながらMatをIplImageに変換してから、「cvSmooth」で使用してから、もう一度Matに変換します。この時点で、cvSmoothでMatオブジェクトを使用するにはどうすればよいですか?これはこの問題を処理する通常の方法ではなく、より良い方法があると確信しています。たぶん私はこれらのタイプを理解する上で何かが欠けています。

この問題を取り除くために私を助けてくれませんか?

4

2 に答える 2

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" );
}
于 2012-06-02T16:26:01.293 に答える
1

2つのうちの1つに固執します。cv::Mat物事のC++の方法です。このクラスには参照カウントメカニズムがあり、すべてのガベージコレクションプロセスを処理します。すべてcv*の関数には、cv::*C ++(ほとんどの場合IMO)で対応するバージョンがあります。


cvSmoothと同等の場合は、cv::GaussianBlur(..)またはを使用できcv::medianBlur(..)ますcv::blur(..)。多くのバリエーションがあります。いつものようにドキュメントを参照するのが最善です。はcvSmooth(..)さまざまな機能に分割されています。

于 2012-06-02T16:33:52.267 に答える