OpenCV 圖像復制和圖像區域讀寫
圖像復制
- 共享數據, 使用 new Mat(srcMat, ...) 和 newMat=srcMat 生成新的Mat都和原Mat共享數據, 也就是說如果修改某一Mat,其他Mat也會隨之改變
- 復制全新的Mat, 使用CopyTo() 和 Clone() 方法將生成一個全新的Mat, 新Mat和原Mat不共享數據.
圖像區域和點的讀寫
- 區域讀取: 通過srcMat[Rect] 讀取指定區域, 讀取的結果也是一個Mat
- 區域寫入: 可以將一個新的Mat賦值到srcMat[Rect]
- 點的讀寫: 點的讀寫有很多種方法, 比如指針、GetIndexer、At、Get/Set和LUT等, 如果性能要求不高的話, 推薦使用 At<>() 泛型方法, 代碼簡單已讀. 可參考 https://blog.csdn.net/TyroneKing/article/details/129108838
- 點的讀取: 可以通過 srcMat.At<>() 方法獲取指定點的顏色值.
- 點的寫入: 可以直接給 srcMat.At<>()的結果賦值
圖像共享數據的測試
private void copyMats()
{
string pngFile = @"D:\my_workspace\opencv\images\draw.png";
var mat = Cv2.ImRead(pngFile, ImreadModes.Color);
//通過指定Rect方式截取圖像,新的Mat和原Mat共享數據
var partRef1 = new Mat(mat, new Rect(0, 0, mat.Width, mat.Height));
//通過指定rowRange和colRange方式截圖圖像,新的Mat和原Mat共享數據
var partRef2 = new Mat(mat, rowRange: new Range(50, 300), colRange: Range.All);
//CopyTo()和Clone()都是復制出一份新的Mat
var deepCopyMat = new Mat();
mat.CopyTo(deepCopyMat);
var cloneMat = mat.Clone();
var rect = new Rect(10, 10, 100, 100);
mat[rect] = new Mat(rect.Width, rect.Width, MatType.CV_8UC3, Scalar.Red);
Cv2.ImShow("mat", mat);
Cv2.ImShow("partRef1", partRef1);
Cv2.ImShow("partRef2", partRef2);
Cv2.ImShow("deepCopyMat", deepCopyMat);
Cv2.ImShow("cloneMat", cloneMat);
Cv2.WaitKey();
Cv2.DestroyAllWindows();
}
效果截圖:

讀寫測試代碼
private void readWriteTest()
{
string pngFile = @"D:\my_workspace\opencv\images\draw.png";
var srcMat = Cv2.ImRead(pngFile, ImreadModes.Color);
var rect = new Rect(10, 10, 200, 200);
//通過srcMat[Rect] 讀取指定區域, 讀取的結果也是一個Mat
var newMat = srcMat[rect];
//可以將一個新的Mat賦值到srcMat[Rect]
srcMat[rect] = new Mat(rect.Width, rect.Width, MatType.CV_8UC3, Scalar.Green);
for (int i = 0; i < srcMat.Rows; i++)
{
//可以通過 srcMat.At() 方法獲取指定點的顏色值.
var vec3b = srcMat.At<Vec3b>(i, 100);
//可以直接給 srcMat.At()的結果賦值
srcMat.At<Vec3b>(i, 100) = new Vec3b(vec3b.Item0, 0, 255);
}
Cv2.ImShow("mat", srcMat);
Cv2.ImShow("newMat", newMat);
Cv2.WaitKey();
Cv2.DestroyAllWindows();
}
效果截圖:

參考:
- OpenCV如何掃描圖像、利用查找表和計時/遍歷、修改Mat像素 https://blog.csdn.net/TyroneKing/article/details/129108838

浙公網安備 33010602011771號