複製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