我正在使用cv2::absdiff()从图像矩阵中减去标量。我使用的代码是:

  double min;
  double max;
  Scalar mean;
  Scalar std_dev;

  minMaxLoc(img_a_color_planes[1], &min, &max);
  meanStdDev(img_a_color_planes[1], mean, std_dev);

  Mat img_a_color_planes[3];
  split(img_a, img_a_color_planes);
  Mat oper = img_a_color_planes[1];

  absdiff(oper, mean, oper);
  divide(oper, std_dev, oper);
  multiply(oper, 10, oper);
  add(oper, mean, oper);

在这里,尽管在img_a中指定了输出矩阵Mat oper,但我专门将oper的绿色通道复制到absdiff中。即使这样,绿色通道img_a_color_planes[1]也会受到影响。我不明白原因。如何避免这种情况?
这是img_a操作后如何影响我的absdiff的信息:
初始img_a:

c++ - 无法了解cv2::absdiff的行为:C++-LMLPHPabsdiff操作之后:

c++ - 无法了解cv2::absdiff的行为:C++-LMLPHP

最佳答案

问题在于Mat oper = img_a_color_planes[1];不会复制基础数组,而只是 header 数据。 copy constructor也是如此。

您需要制作一个独立的副本,以避免对原始图像进行更改。一种方法是通过clone()方法:Mat oper = img_a_color_planes[1].clone();。克隆在后台使用copyTo():https://stackoverflow.com/a/15688165/2988730

引用 Mat docs:

10-08 05:08