opencv的修改Rect类内的坐标值细节

一直在用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能帮助到你。

 

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
OpenCV中,可以使用Rect类来定义矩形区域,并使用该类来实现多区域ROI(Region of Interest)截图。以下是一个示例代码,演示了如何使用Rect类来截取多个矩形区域的图像: ``` #include <opencv2/opencv.hpp> #include <iostream> using namespace cv; using namespace std; int main() { Mat image = imread("test.jpg"); // 读入测试图像 if (image.empty()) { cout << "无法读取图像文件!" << endl; return -1; } // 定义多个矩形区域 Rect roi1(50, 50, 100, 100); Rect roi2(200, 100, 150, 200); Rect roi3(100, 300, 200, 150); // 从图像中截取对应区域的图像 Mat roiImage1 = image(roi1); Mat roiImage2 = image(roi2); Mat roiImage3 = image(roi3); // 显示截取的图像 imshow("ROI 1", roiImage1); imshow("ROI 2", roiImage2); imshow("ROI 3", roiImage3); waitKey(0); return 0; } ``` 在上述代码中,我们首先读入了一张图像,然后定义了三个矩形区域(roi1、roi2和roi3),每个矩形区域的位置和大小都不同。接着,我们使用Mat的ROI操作来从原始图像中截取对应区域的图像,并将其保存到Mat对象(roiImage1、roiImage2和roiImage3)中。最后,我们使用imshow函数来显示截取的图像。 需要注意的是,Rect类的构造函数需要传入四个参数,分别为矩形的左上角坐标(x、y)和矩形的宽度和高度(width、height)。在本例中,我们分别定义了三个矩形区域,并使用这些参数来创建Rect对象。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值