复制cv::Mat
的行为令我困惑。OpenCV cv深层副本::垫
我从文档中了解到,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'使用某种引用计数,所以在呼叫方收到的对象将是有效的。 – juanchopanza
问题3说“有时”某些事情“似乎”发生。我有限的大脑不能计算这样的问题:-) – juanchopanza