无法理解cv2 :: absdiff:c ++的行为

时间:2016-12-30 14:36:06

标签: c++ opencv

我正在使用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

enter image description here

absdiff操作后:

enter image description here

1 个答案:

答案 0 :(得分:2)

问题是Mat oper = img_a_color_planes[1];不会复制底层数组,只会复制标题数据。这同样适用于documentation

您需要制作独立副本以避免更改原始图像。一种方法是通过clone()方法:Mat oper = img_a_color_planes[1].clone();。克隆使用引擎copyTo()下的Mat::clone()

引用copy constructor

  

使用复制构造函数或赋值运算符,右侧可以有数组或表达式(见下文)。如引言中所述,数组赋值是O(1)操作,因为它只复制标题并增加引用计数器。 Format formatter = new SimpleDateFormat("dd MMM yyyy", Locale.getDefault()); 方法可用于在需要时获取数组的完整(深层)副本。