opencv:矩阵分配混淆

Posted

技术标签:

【中文标题】opencv:矩阵分配混淆【英文标题】:opencv: matrix assignment confusion 【发布时间】:2014-09-25 01:29:18 【问题描述】:

谁能验证/回答我的理解/问题?

在 OpenCV 中,假设

Mat A; // Suppose A has some values in it
Mat B=A;
    如果我更新 B,A 也会受到影响。对?它似乎基本上是通过引用分配的。

假设一个函数“void a_function(Mat argument) ..//change argument..”。

    调用“a_function(A)”后,A也会受到影响吧?

    那么,如果“void a_function(Mat &argument)”已经通过引用调用,为什么(或在哪种情况下)我们需要它? &在这里能有特殊含义吗?

    如果你不想让A受到函数调用的影响,那哪个习惯更好?

    打电话给a_function(A.clone())? 由a_function(A) 调用并使用const Mat &argument 声明函数并将责任留给函数?

假设您需要像这样计算逐行叉积

L.row(i) = A.row(i).cross(B.row(i));
    在这种情况下,我可以在没有 'clone()' 的情况下安全地使用这个赋值的原因是中间结果矩阵(来自cross 函数)将很快消失/消失(?)(退出当前本地时)范围),对吧?

【问题讨论】:

【参考方案1】:

1. 是的。

证明:

cv::Mat A = (cv::Mat_<double>(2,2) << 1.0, 2.0, 3.0, 4.0);
std::cout << "Original A:\n" << A << std::endl;

cv::Mat B = A;
B.at<double>(0, 1) = 2.5;
std::cout << "A:\n" << A << std::endl;
std::cout << "B:\n" << B << std::endl;

2. 是的。

证明:

void a_function(cv::Mat C)

    C.at<double>(1, 0) = 3.5;


cv::Mat A = (cv::Mat_<double>(2,2) << 1.0, 2.0, 3.0, 4.0);
std::cout << "Original A:\n" << A << std::endl;
a_function(A);
std::cout << "A:\n" << A << std::endl;

3.Mat被指定为函数参数有或没有引用&amp;时,类使用智能指针 在内部指向原始数据而不是复制它。

证明:

void some_function(cv::Mat C)

    C.at<double>(1, 0) = 3.5;


void another_function(cv::Mat& C)

    C.at<double>(1, 0) = 3.6;


cv::Mat A = (cv::Mat_<double>(2,2) << 1.0, 2.0, 3.0, 4.0);
std::cout << "Original A:\n" << A << std::endl;
a_function(A);
std::cout << "A:\n" << A << std::endl;

cv::Mat B = (cv::Mat_<double>(2,2) << 1.0, 2.0, 3.0, 4.0);
std::cout << "Original B:\n" << B << std::endl;
a_function(B);
std::cout << "B:\n" << B << std::endl;

由于在这种情况下使用 &amp; 并没有什么不同,正如您所指出的,我确实相信使用 它可以提高可读性:不了解内部工作原理的人如果在没有&amp; 的情况下指定参数,Mat 可能会担心正在制作副本。

4. 这是一个品味问题。我更喜欢const Mat&amp; img,因为我认为它对 C/C++ 程序员来说更清晰、更明显。

回答最后一个问题:

5. 是的。

证明:

cv::Mat L = (cv::Mat_<double>(1,3) << 0.0, 0.0, 0.0);
cv::Mat E = (cv::Mat_<double>(1,3) << 1.0, 2.0, 3.0);
cv::Mat F = (cv::Mat_<double>(1,3) << 4.0, 5.0, 6.0);
L = E.row(0).cross(F.row(0));

std::cout << "E:\n" << E << std::endl;
std::cout << "F:\n" << F << std::endl;
std::cout << "L:\n" << L << std::endl;

【讨论】:

您的特定问题似乎已经有了一些答案。只需使用页面上的搜索框。这是一个可能的答案:***.com/q/63930667/176769 谢谢,我问的问题。

以上是关于opencv:矩阵分配混淆的主要内容,如果未能解决你的问题,请参考以下文章

如何在没有额外分配的情况下从 OpenCV 矩阵中获取图像数据?

OpenCV

OpenCV中二维坐标顺序

从 OpenCV 中的矩阵访问值

Opencv C++读取分配给特征向量的opencv Mat

在 OpenCV 中分配矩阵元素