【发布时间】:2014-03-06 17:43:57
【问题描述】:
复制cv::Mat 的行为让我很困惑。
我从文档中了解到Mat::copyTo() 是深拷贝,而赋值运算符不是。我的问题:
我应该怎么做才能从函数返回
cv::Mat,例如:cv::Mat func()?-
根据文档,如果我返回
cv::Mat,它将没有用处,因为在函数返回该函数中cv::Mat的本地副本后,该函数中的本地副本将被销毁,因此接受外部返回值的那个该函数应该指向一些随机地址。奇怪的是(大多数时候)它可以正常工作。例如,以下工作:cv::Mat CopyOneImage(const cv::Mat& orgImage) { cv::Mat image; orgImage.copyTo(image); return image; } int main() { std::string orgImgName("a.jpg"); cv::Mat orgImage; orgImage = cv::imread(orgImgName); cv::Mat aCopy; aCopy = CopyOneImage(orgImage); return 1; }
但是为什么呢?这不是深拷贝。
问题3。有时赋值运算符似乎也是深拷贝:
int main()
{
std::string orgImgName("a.jpg");
cv::Mat orgImage;
orgImage = cv::imread(orgImgName);
cv::Mat aCopy;
orgImage.copyTo(aCopy);
cv::Mat copyCopy1;
copyCopy1 = aCopy;
cv::namedWindow("smallTest", 1);
cv::imshow("smallTest", copyCopy1);
uchar key = (uchar)cv::waitKey();
cv::Mat orgImage2 = cv::imread("b.jpg");
orgImage2.copyTo(aCopy);
cv::imshow("smallTest", copyCopy1);
return 1;
}
然后两个显示器显示相同的图像,a.jpg。为什么?还有一些时候它不起作用。 (原代码太长但也可以简化为上述情况)。在那些时候,赋值运算符似乎实际上是“浅”的复制。为什么?
非常感谢!
【问题讨论】:
-
1.这取决于所需的语义。 2.不,
cv::Mat使用了某种引用计数,所以调用方收到的对象是有效的。 -
问题 3 说“有时”某事“似乎”会发生。我有限的大脑无法计算出这样的问题:-)