8

マットを別の関数に渡し、呼び出された関数内で変更しています。より複雑なタイプであるため、呼び出し元の関数でマトリックスが変更されるように、参照によって自動的に渡されると予想していましたが、そうではありません。関数から変更されたマットを正しく返す方法の説明を誰かに教えてもらえますか?

コードスニペットは次のとおりです。

void callingFunction(Mat img)
{
  Mat tst(100,500,CV_8UC3, Scalar(0,255,0));
  saveImg(tst, "Original image", true);
  testImg(tst);
  saveImg(tst, "Want it to be same as inside testImg but is same as Original", true);
}

void testImg(Mat img)
{
  int rs = 50; // rows
  int cs = 100; // columns
  img = Mat(rs, cs, CV_8UC3, Scalar(255,0,0));
  Mat roi(img, Rect(0, 0, cs, rs/2));
  roi = Scalar(0,0,255); // change a subsection to a different color

  saveImg(img, "inside testImg", true);
}

ありがとう!

4

3 に答える 3

9

パラメータ参照(&)Matとして定義する必要があります。編集されたコードは次のとおりです。

void callingFunction(Mat& img)
{
  Mat tst(100,500,CV_8UC3, Scalar(0,255,0));
  saveImg(tst, "Original image", true);
  testImg(tst);
  saveImg(tst, "Want it to be same as inside testImg but is same as Original", true);
}

void testImg(Mat& img)
{
  int rs = 50; // rows
  int cs = 100; // columns
  img = Mat(rs, cs, CV_8UC3, Scalar(255,0,0));
  Mat roi(img, Rect(0, 0, cs, rs/2));
  roi = Scalar(0,0,255); // change a subsection to a different color

  saveImg(img, "inside testImg", true);
}
于 2012-06-27T21:59:06.800 に答える
2

同じ質問を自分で考えたので、@ ArtemStorozhuk(正解)の答えをさらに明確にしたいと思います。

OpenCVのドキュメントは、マトリックスを値で渡しているように見えるため、ここでは誤解を招く可能性がありますが、実際には、cv::OutputArrayのコンストラクターは次のように定義されています。

_OutputArray::_OutputArray(Mat& m)

したがって、参照によってマトリックスを取得します。

cv :: Mat :: createのような操作は新しい行列を作成するため、操作は参照を解放し、クーターを1に設定します。したがって、呼び出し元の関数で結果を保持するには、参照によって行列を渡す必要があります。

于 2014-01-09T12:08:42.667 に答える
-3

明示的に参照を渡す必要があるというのが本当なら、すべてのOpenCV関数はどのように機能しますか?それらのどれも参照によって値を渡しません、それでも彼らはどういうわけか渡されたマットにうまく書き込むようです。たとえば、imgproc.hppのSobel関数の宣言は次のとおりです。

//! applies generalized Sobel operator to the image
CV_EXPORTS_W void Sobel( InputArray src, OutputArray dst, int ddepth,
                         int dx, int dy, int ksize=3,
                         double scale=1, double delta=0,
                         int borderType=BORDER_DEFAULT );

ご覧のとおり、&なしでsrcとdstを渡します。それでも、空のdstでSobelを呼び出した後、それはいっぱいになることを知っています。'&'は含まれません。

于 2012-12-21T12:24:20.650 に答える