在inRange期间,未受影响的Mat无法解释

时间:2013-12-04 20:27:42

标签: c++ opencv

如果在这里遇到一个非常奇怪的问题。我正在使用Visual Studio 10和OpenCV进行开发 在下面的代码段中,我正在创建一个1通道Mat并写入两个不同的Mats。 第一个窗口“test1”显示黑色图片。那是对的。

“test2”窗口仍显示黑色图片。还是正确的。

然后最后一个窗口“test3”显示与inRange命令之后存储在bwHSVred中相同的图片。 为什么bwHSVblue会在此inRange操作期间发生变化?

有人知道为什么吗?这对我来说没有任何意义。

frame = imread(pathtopicture);

cvtColor(frame, calHSV, COLOR_BGR2HSV);

inRange(calibHSV, Scalar(255, 255, 255), Scalar(0, 0, 0), bwAll);

bwHSVred = bwAll;
bwHSVblue = bwAll;
imshow("test1",bwHSVblue);

//load red
//set the x_MIN,x_MAX values to Hmin=0,Smin=119,Vmin=108,Hmax=218,Smax=234,Vmax=168
setHSVval(redCube);
updateTrackbars();
currentColor = RED;

imshow("test2",bwHSVblue);

inRange(calibHSV, Scalar(H_MIN, S_MIN, V_MIN), Scalar(H_MAX, S_MAX, V_MAX), bwHSVred);

imshow("test3",bwHSVblue);

.h文件中Mat对象的定义

private:
Mat calHSV;
Mat bwAll;
Mat bwHSVred;
Mat bwHSVblue;

2 个答案:

答案 0 :(得分:1)

问题在于你的C / C ++指针用法。

所有三个矩阵都是同一个实例:

bwHSVred = bwAll;
bwHSVblue = bwAll;

您正在复制指针,这意味着它们现在都指向相同的矩阵。

如果您想复制矩阵,请使用clonecopyTo as explained in the docs

Mat F = A.clone();
Mat G;
A.copyTo(G);

答案 1 :(得分:0)

Mat a = b;只做一个浅拷贝(都指向相同的数据)

这就是为什么bwHSVred == bwHSVblue == bwAll