OpenCV之rectangle函数与Windows的GDI函数Rectangle的说明

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qiuchangyong/article/details/89150204

rectangle函数就是绘制一个矩形框,它有两种形式,一种是输入左上角和右下角的点的x和y坐标,即Point,另一种是输入一个Rect。分别如下:

CV_EXPORTS_W void rectangle(CV_IN_OUT Mat& img, Point pt1, Point pt2,
                          const Scalar& color, int thickness=1,
                          int lineType=8, int shift=0);

CV_EXPORTS void rectangle(CV_IN_OUT Mat& img, Rect rec,
                          const Scalar& color, int thickness=1,
                          int lineType=8, int shift=0);

第一种形式绘制出来的矩形框包括右下角的位置,是一种真包含的关系。打个比方,如果左上角是(0,0),右下角是(1,1),画出来的是2个像素宽度和2个像素高度的矩形区域。

第二种形式的实现里也是调用了第一种形式。Rect的br()返回的是左上角的点坐标加上宽度和高度的偏移量,在调用第一种形式时,减掉了1,这样刚好绘制出来的矩形区域就等于Rect的宽度和高度之积。

所以要理解第一种形式中的pt2的坐标和第二种形式rec的br()返回的点的坐标是不同的。

而在Windows下绘制矩形框使用API函数Rectangle的行为就不同了,它传入左、上、右、下四个坐标,绘制出来的区域是不包含右边和下边的,这和上面的第二种形式有些类似。亲测发现,它对于右坐标小于左坐标,下坐标小于上坐标的情况还会进行交换,然后绘制出来的区域是不包含右下坐标对应的边。

此外,OpenCV画线段的函数line和Windows下画线段的函数LineTo也有类似的区别,即Windows下画出来的线段的是不包含末端那个点的,而OpenCV的是包含的。

感言:调用一个别人实现的东西,就像面对一个黑盒子,你永远不知道它里面是什么。即使有源码,要跟进去看个究竟,也耗时耗力。黑盒子还是少碰,没有源码的东西,遇到问题,就可能陷入死胡同,后患无穷。如果一定要用,也要选择口碑好的。一些开源的项目,代码量大,框架结构复杂,驾驭不了,用之前也要三思。

猜你喜欢

转载自blog.csdn.net/qiuchangyong/article/details/89150204