C ++ OpenCV(バージョン3.4.1)でコピーせずにデータ割り当てで立ち往生しています。
次のサンプルコードをご覧ください。
std::cout << "test cv::Mat" << std::endl;
cv::Mat a(2, 2, CV_32FC1, cv::Scalar(1.));
cv::Mat b(2, 2, CV_32FC1, cv::Scalar(5.));
std::cout << "a:" << std::endl << a << std::endl;
std::cout << "b:" << std::endl << b << std::endl;
a.col(0) = b.col(0);
std::cout << "a:" << std::endl << a << std::endl;
std::cout << "b:" << std::endl << b << std::endl;
a.col(0) = b.row(0).t();
std::cout << "a:" << std::endl << a << std::endl;
std::cout << "b:" << std::endl << b << std::endl;
std::cout << "test cv::UMat" << std::endl;
cv::UMat c(2, 2, CV_32FC1, cv::Scalar(1.));
cv::UMat d(2, 2, CV_32FC1, cv::Scalar(5.));
std::cout << "c:" << std::endl << c << std::endl;
std::cout << "d:" << std::endl << d << std::endl;
c.col(0) = d.col(0);
std::cout << "c:" << std::endl << c << std::endl;
std::cout << "d:" << std::endl << d << std::endl;
c.col(0) = d.row(0).t();
std::cout << "c:" << std::endl << c << std::endl;
std::cout << "d:" << std::endl << d << std::endl;
これにより、次の出力が得られます。
test cv::Mat
a:
[1, 1;
1, 1]
b:
[5, 5;
5, 5]
a:
[1, 1;
1, 1]
b:
[5, 5;
5, 5]
a:
[5, 1;
5, 1]
b:
[5, 5;
5, 5]
test cv::UMat
[ INFO:0] Initialize OpenCL runtime...
c:
[1, 1;
1, 1]
d:
[5, 5;
5, 5]
c:
[1, 1;
1, 1]
d:
[5, 5;
5, 5]
c:
[1, 1;
1, 1]
d:
[5, 5;
5, 5]
cv :: Matの場合、なぜ割り当てが機能しa.col(0) = b.col(0);
ないのですか?
なぜアサインメントは機能しa.col(0) = b.row(0).t();
ているのですか?
cv :: UMatの場合はなぜ違うのですか?
このすべての背後にある目標は、データをコピーせずに、他の複数のOpenCVマトリックスからcv :: Mat(またはより適切なcv :: UMat)を連結することです(データの量のためにコストがかかる可能性があります)。
これは可能ですか?
いいえ、データをコピーせずに複数のOpenCVマトリックスを単一のマトリックスに連結することはできません。
このクラスcv::Mat
は、データへの単一のポインタのみを保持しているため、複数のメモリ領域を処理することはできません。
そこポインターもありdatastart
、dataend
そしてdatalimit
中にcv::Mat
、これらは関心領域のサポートのためだけのヘルパーです。これらは、データをコピーせずに、大きくはなく、小さい行列を処理するのに役立ちます。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加