我正在使用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
:
答案 0 :(得分:2)
问题是Mat oper = img_a_color_planes[1];
不会复制底层数组,只会复制标题数据。这同样适用于documentation。
您需要制作独立副本以避免更改原始图像。一种方法是通过clone()
方法:Mat oper = img_a_color_planes[1].clone();
。克隆使用引擎copyTo()
下的Mat::clone()
。
使用复制构造函数或赋值运算符,右侧可以有数组或表达式(见下文)。如引言中所述,数组赋值是O(1)操作,因为它只复制标题并增加引用计数器。
Format formatter = new SimpleDateFormat("dd MMM yyyy", Locale.getDefault());
方法可用于在需要时获取数组的完整(深层)副本。