复制 cv::Mat
的行为使我感到困惑。
据文档介绍,Mat::copyTo()
是深层复制,而赋值运算符不是。我的问题是:
如果我想从一个函数中返回一个
cv::Mat
,例如:cv::Mat func()
,该怎么办?根据文档,如果我返回一个
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。为什么?有时候又不起作用。(原始代码太长,但可以简化为上述情况)。在这些情况下,赋值运算符似乎实际上是“浅”复制。为什么?
非常感谢!
cv::Mat
使用某种引用计数,因此调用方收到的对象将是有效的。