1、深度拷貝的問題
我對整張圖像通過裁剪分別進行識別,出現識別結果與期望不同的問題,經過大量排查是OpenCV深度拷貝問題,我原來有問題的寫法
cv::Mat matCrop = matZoom(roi);
cv::Mat matCrop1= matCrop(roi1);
cv::Mat matCrop2= matCrop(roi2);
InferOnnx(matCropR1);
InferOnnx(matCropR2);
經過深度拷貝沒有問題的寫法
cv::Mat matCrop = matZoom(roi);
cv::Mat matCrop1= matCrop(roi1);
cv::Mat matCrop2= matCrop(roi2);
cv::Mat matCropClone1=matCrop1.clone();
cv::Mat matCropClone2=matCrop2.clone();
InferOnnx1(matCropClone1);
InferOnnx1(matCropClone2);
問題分析:
在需要獨立操作數據時,務必使用深拷貝(`clone()`或`copyTo()`),以避免意外的修改。- 淺拷貝效率高,因為不復制數據,但需要注意共享數據帶來的副作用。- `copyTo()`方法還可以配合掩碼使用,例如:`A.copyTo(B, mask);` 其中`mask`是一個二值圖像,指定要復制的區域。
在 OpenCV 的 C++ 接口中,cv::Mat
?是核心數據結構,用于存儲圖像和矩陣數據。復制?Mat
?對象時需注意淺拷貝(共享數據)和深拷貝(獨立數據)的區別。
淺拷貝 (Shallow Copy)
僅復制矩陣頭(尺寸、類型等元數據),共享底層數據,修改副本會影響原矩陣
cv::Mat src = imread("image.jpg"); // 原始矩陣
cv::Mat shallowCopy1 = src; // 賦值操作(淺拷貝)
cv::Mat shallowCopy2(src); // 構造函數(淺拷貝)
深拷貝 (Deep Copy)
復制矩陣頭?并創建獨立的數據副本,修改副本不影響原矩陣
cv::Mat deepCopy1 = src.clone(); // 推薦方式
或者
cv::Mat deepCopy2;
src.copyTo(deepCopy2); // 復制到目標矩陣