我正在使用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
:absdiff
操作之后:最佳答案
问题在于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: