より大きなマトリックスから取得した新しい (サブ) マトリックスを作成するときに問題が発生し、誰かが私に手を貸してくれることを望んでいました。
問題を次の小さなコード スニペットに絞り込みました。
cv::Mat* rightBestX;
rightBestX = new cv::Mat(4, 4, CV_16UC1); // short matrix
// fill rightBestX matrix with values
const cv::Rect r2(0, 0, 2, 2);
cv::Mat x = rightBestX->operator()(r2);
cv::Mat_<short> leftBestXRegion = x; // x is not equal to cv::Mat_<short>, according template<typename _Tp> inline Mat_<_Tp>& Mat_<_Tp>::operator = (const Mat& m)
//cv::Mat_<short> leftBestXRegion = results.leftBestX->operator()(r2);
上記は float 型の行列では機能するようですが、short を使用する場合は機能しません。
アイデアは、データをコピーするのではなく、rightBestX からのデータ参照を使用することです。x に正常にコピーされました。ただし、コードの最後の行を実行すると、失われます (x の行とは異なります)。また、refcount は x では 2 ですが、leftBestXRegion では 1 です...
繰り返しますが、これはフロートで機能します。ここで何が間違っているのか誰にも分かりますか?