有人可以验证/回答我的理解/问题吗?
在OpenCV中,假设
Mat A; // Suppose A has some values in it
Mat 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));
cross
函数)将很快消失(?)(当退出当前本地范围时),对吗?答案 0 :(得分:6)
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
被指定为函数参数有或没有引用&
时,该类使用 smart内部指针指向原始数据而不是复制它。
证明:
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。这是一个品味问题。我更喜欢
const Mat& 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;