InputArrayはスマートにメモリ管理されていない

OpenCVを使っていて嵌ったのでメモ。
cv::Matはスマートなメモリ管理が実装されているので、
cv::InputArrayも同じかと思ってたら痛い目を見た。

cv::Matの例

スマートなメモリ管理のおかげで、
func1実行時にcv::Mat::eye(3,3,CV_64FC1)が期待通り出力されている。

std::function<void(void)>           func1;
std::function<void(const cv::Mat&)> func2 = (
    [&]( const cv::Mat& src ) {
        func1 = ([=](){ std::cout << src << std::endl; } );
    }
);

func2( cv::Mat::eye(3,3,CV_64FC1) );
func1();

出力結果

[1, 0, 0;
  0, 1, 0;
  0, 0, 1]

cv::InputArrayの例

上記「cv::Matの例」と同じ出力結果になることを期待したけど、
残念ながらそうはならなかった。

std::function<void(void)>           func1;
std::function<void(cv::InputArray)> func2 = (
    [&]( cv::InputArray src ) {
        func1 = ([=](){ std::cout << src.getMat() << std::endl; } );
    }
);

func2( cv::Mat::eye(3,3,CV_64FC1) );
func1();

出力結果

[]