一直在用opencv,用Rect类进行目标物体的坐标标记的时候,在标记过程后会发现Rect类里存在非法数据,当然这不是Rect类的问题,是我上一步处理过程中产生的问题,这些数应该都是在一个范围内的,将超过范围的数进行规范化,不然这些产生的异常数据会直接影响我下一步过程。这些都是废话,此篇博文的目的在于如何修改已存在Rect类中Rect [i]右下角坐标。
我的想法就是对结果进行检测,当Rect里面的br().x的值大于自定义数值(center + gap)的边界值时,为异常。处理过程:首先新建一个Rect B,然后将原来的Rect的值赋值给B,在赋值过程中把异常的值替换为(center+gap),把这个B构造完成后我就去替换原来的Rect类,发现只有修改的位置值是正确的,而Rect类的宽和高也进行了修改。
Rect B(boundingbox[i].tl().x, boundingbox[i].tl().y, (center + gap), boundingbox[i].br().y);//boundingbox[i]是上一步处理后标记的Rect类,(center-gap)为我的右边的值,实验结果大跌眼镜。
这是结果,正确的是第三行中,表示右边的值89,为最大边界值,第一行右的值是137为异常值,是需要二次更改的。
对B类修改后的结果
修改后发现,Rect(x,y,weigh,hight),我在第三、四个位置里的值为新的右下的坐标值,而实际上,Rect类将这两个值看作了宽和高,OMG。关键:不能对直接对其右下角坐标直接修改达到目的,只能通过改变原来Rect类的宽和高来修改它它右下坐标。
int newW = (center + gap) - boundingbox[i].tl().x;//得到从左边到边界的距离,也就是B的宽
Rect B(boundingbox[i].tl().x, boundingbox[i].tl().y, newW, boundingbox[i].br().y);
这是单纯进行宽度修改后的,发现右下坐标只有右是正确了,但是B的高度也就是下的坐标也增加了5,这个5我不由得想到与左上的起始坐标有关。Rect类是坐标定位是在左上角坐标点的基础上,根据宽和高来表示矩形框。看来是我改的不够彻底,改的不彻底。
int newW = (center + gap) - boundingbox[i].tl().x;
Rect B(boundingbox[i].tl().x, boundingbox[i].tl().y, newW, boundingbox[i].height);
当我把高度也更改后发现结果喜人。
总结:虽然网络上都是对Rect(x,y,weigh,hight),的介绍各种详解,但却没有介绍怎样去对已经存在的Rect类的坐标进行修改,难度没有,只不过饶了一个弯才能达成目的,我也是测试了好多次,翻阅了无数博客。我也是愚笨。希望我的tips能帮助到你。