gpt4 book ai didi

c++ - opencv:矩阵分配困惑

转载 作者:太空狗 更新时间:2023-10-29 20:03:46 25 4
gpt4 key购买 nike

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

在 OpenCV 中,假设

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

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

  1. 在你调用“a_function(A)”之后,A 也会受到影响,对吧?

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

  3. 如果不想让A被函数调用影响,哪个习惯更好?

    • 通过 a_function(A.clone()) 调用?
    • 通过 a_function(A) 调用并使用 const Mat &argument 声明函数并将责任留给函数?

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

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

最佳答案

1. Yes.

证明:

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. Yes.

证明:

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. When a Mat is specified as a function parameter with or without the reference &, the class uses smart pointers internally to point to the original data instead of copying it.

证明:

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;

由于在这种情况下使用 & 没有什么不同,正如您所指出的,我相信使用 它可以提高可读性:不知道的人Mat 的内部工作机制可能会担心如果在没有 & 的情况下指定参数,则会生成拷贝。

4. It's a matter of taste. I prefer const Mat& img because I think its cleaner and more obvious to C/C++ programmers.

然后回答最后一个问题:

5. Yes.

证明:

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;

关于c++ - opencv:矩阵分配困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26029073/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com