知识点

1、图像对象的拷贝
学过C++的应该都很清楚,拷贝分为深拷贝和浅拷贝
OpenCV的clone()和copyTo是深拷贝,赋值运算符‘=’是浅拷贝
image.png
头部保存了该图像的宽度和高度还有通道数等信息,数据部分保存了该图像的像素信息

2、图像对象的创建
常用方法有Mat::zeros()和Mat::ones()

C++代码

  1. #include <opencv2/opencv.hpp>
  2. #include <iostream>
  3. using namespace std;
  4. using namespace cv;
  5. void day03() {
  6. Mat src = imread("E:\\_Image\\OpenCVTest\\girl.jpg");
  7. if (src.empty()) {
  8. cout << "could not load image.." << endl;
  9. return;
  10. }
  11. // 创建方法-克隆
  12. Mat m1 = src.clone();
  13. // 复制
  14. Mat m2;
  15. src.copyTo(m2);
  16. // 赋值法
  17. Mat m3 = src;
  18. // 创建空白图像
  19. Mat m4 = Mat::zeros(src.size(), src.type());
  20. Mat m5 = Mat::zeros(Size(512, 512), CV_8UC3);
  21. Mat m6 = Mat::ones(Size(512, 512), CV_8UC3);
  22. waitKey(0);
  23. }

Python代码

  1. import cv2 as cv
  2. import numpy as np
  3. # 查看版本
  4. print(cv.__version__)
  5. # 读取图像
  6. src = cv.imread("E:/_Image/OpenCVTest/girl.jpg")
  7. # 深拷贝 克隆图像
  8. m1 = np.copy(src)
  9. # 浅拷贝 赋值
  10. m2 = src
  11. # 修改 src,m2 也会跟着变
  12. src[100:200, 200:300, :] = 255
  13. # 显示
  14. cv.imshow("src", src)
  15. cv.imshow("m1", m1)
  16. cv.imshow("m2", m2)
  17. # 创建图像对象
  18. m3 = np.zeros(src.shape, src.dtype)
  19. cv.imshow("m3", m3)
  20. m4 = np.zeros([512, 512], np.uint8)
  21. m4[:, :] = 127
  22. cv.imshow("m4", m4)
  23. m5 = np.ones(shape=[512, 512, 3], dtype=np.uint8)
  24. m5[:, :, 0] = 255
  25. cv.imshow("m5", m5)
  26. # 等待键盘输入
  27. cv.waitKey()
  28. # 释放内存
  29. cv.destroyAllWindows()

Javascript代码

  1. data() {
  2. return {
  3. num2type: {
  4. 1: 'CV_8SC1',
  5. 9: 'CV_8SC2',
  6. 17: 'CV_8SC3',
  7. 25: 'CV_8SC4',
  8. 0: 'CV_8UC1',
  9. 8: 'CV_8UC2',
  10. 16: 'CV_8UC3',
  11. 24: 'CV_8UC4',
  12. 3: 'CV_16SC1',
  13. 11: 'CV_16SC2',
  14. 19: 'CV_16SC3',
  15. 27: 'CV_16SC4',
  16. 2: 'CV_16UC1',
  17. 10: 'CV_16UC2',
  18. 18: 'CV_16UC3',
  19. 26: 'CV_16UC4',
  20. 5: 'CV_32FC1',
  21. 13: 'CV_32FC2',
  22. 21: 'CV_32FC3',
  23. 29: 'CV_32FC4',
  24. 4: 'CV_32SC1',
  25. 12: 'CV_32SC2',
  26. 20: 'CV_32SC3',
  27. 28: 'CV_32SC4',
  28. 6: 'CV_64FC1',
  29. 14: 'CV_64FC2',
  30. 22: 'CV_64FC3',
  31. 30: 'CV_64FC4'
  32. }
  33. }
  34. },
  35. methods: {
  36. onOpenCvReady() {
  37. if (!this.value) {
  38. this.$message.error('请选择一种创建类型')
  39. return
  40. }
  41. // 官方文档链接:https://docs.opencv.org/4.5.0/de/d06/tutorial_js_basic_ops.html
  42. const cv = window.cv
  43. // 读取图像
  44. const src = cv.imread('imageSrcRaw')
  45. // 拷贝 克隆 创建图像
  46. let dst = null
  47. switch (this.value) {
  48. case 1:
  49. dst = src.clone()
  50. break
  51. case 2:
  52. dst = new cv.Mat()
  53. src.copyTo(dst)
  54. break
  55. case 3:
  56. dst = new cv.Mat()
  57. break
  58. case 4:
  59. dst = new cv.Mat(512, 512, cv.CV_8UC4)
  60. break
  61. case 5:
  62. dst = new cv.Mat(512, 512, cv.CV_8UC4, [255, 0, 0, 127])
  63. break
  64. case 6:
  65. dst = cv.Mat.zeros(512, 512, cv.CV_8UC4)
  66. break
  67. case 7:
  68. dst = cv.Mat.ones(512, 512, cv.CV_8UC4)
  69. break
  70. case 8:
  71. dst = cv.Mat.eye(512, 512, cv.CV_8UC4)
  72. break
  73. }
  74. // 显示图像
  75. if (dst) cv.imshow('canvasOutput', dst)
  76. // 销毁所有 mat 释放内存
  77. src.delete()
  78. if (dst) dst.delete()
  79. },
  80. showImgInfo() {
  81. const img = window.cv.imread('imageSrcRaw')
  82. let content = ''
  83. content += 'img type: ' + this.num2type[img.type()] + ' '
  84. content += 'img cols: ' + img.cols + ' '
  85. content += 'img rows: ' + img.rows + ' '
  86. content += 'img depth: ' + img.depth() + ' '
  87. content += 'img channels: ' + img.channels() + ' '
  88. this.$alert(content, '图像属性', {
  89. confirmButtonText: '确定'
  90. })
  91. }
  92. }