gpt4 book ai didi

c++ - 它是 opencv RotatedRect 的错误吗?

转载 作者:太空狗 更新时间:2023-10-29 22:59:49 31 4
gpt4 key购买 nike

我写了下面的代码:

#include<iostream>
#include<opencv2/core/core.hpp>
using namespace std;
using namespace cv;

int main()
{
Point2f p[4];
RotatedRect rr(Point2f(),Size2f(1,2),0);
rr.points(p);
for(int i = 0;i < 4;i++) cout<<p[i]<<endl;
Rect r = rr.boundingRect();
cout<< r.x << " " << r.y << " " << r.br().x << " " << r.br().y <<endl;
return 0;
}

RotatedRect rr 的左上角为(-0.5,-1),RotatedRect rr 的右下角为(0.5,1)。所以包含旋转矩形的最小最小右上角矩形为[( -1,-1),(1,1)],(-1,-1)是左上角,(1,1)是右下角。但是结果rect的右下角是( 2,2).

我阅读了来源:

Rect RotatedRect::boundingRect() const
{
Point2f pt[4];
points(pt);
Rect r(cvFloor(std::min(std::min(std::min(pt[0].x, pt[1].x), pt[2].x), pt[3].x)),
cvFloor(std::min(std::min(std::min(pt[0].y, pt[1].y), pt[2].y), pt[3].y)),
cvCeil(std::max(std::max(std::max(pt[0].x, pt[1].x), pt[2].x), pt[3].x)),
cvCeil(std::max(std::max(std::max(pt[0].y, pt[1].y), pt[2].y), pt[3].y)));
r.width -= r.x - 1;
r.height -= r.y - 1;
return r;
}

我想知道代码 r.width -= r.x - 1;r.height -= r.y - 1;我认为应该是 r.width -= r.x;r.height -= r.y;谁能告诉我是不是出处不对?

最佳答案

看起来 cv::boundingRectRotatedRect::boundingRect 不一致。我使用了这个小测试应用程序

int main(int argc, char* argv[])
{
cv::Mat input = cv::imread("C:/StackOverflow/Input/Lenna.png");

//cv::RotatedRect rr = cv::RotatedRect(cv::Point2f(), cv::Size2f(1, 2), 0);

cv::RotatedRect rr = cv::RotatedRect(cv::Point2f(256,256), cv::Size2f(150, 100), 45);

cv::Rect rect1 = rr.boundingRect();

cv::Point2f pt[4];
rr.points(pt);

std::vector<cv::Point> pts;
pts.push_back(pt[0]);
pts.push_back(pt[1]);
pts.push_back(pt[2]);
pts.push_back(pt[3]);

cv::Rect rect2 = cv::boundingRect(pts);

std::cout << "RotatedRect::boundingRect: " << rect1 << std::endl;
std::cout << "cv::boundingRect: " << rect2 << std::endl;

cv::line(input, pt[0], pt[1], cv::Scalar(0, 0, 255));
cv::line(input, pt[1], pt[2], cv::Scalar(0, 0, 255));
cv::line(input, pt[2], pt[3], cv::Scalar(0, 0, 255));
cv::line(input, pt[3], pt[0], cv::Scalar(0, 0, 255));

cv::rectangle(input, rect1, cv::Scalar(255, 0, 0));
cv::rectangle(input, rect2, cv::Scalar(0, 255, 0));

cv::imshow("input", input);
cv::waitKey(0);
return 0;
}

结果给出了略有不同的边界矩形(RotatedRect::boundingRect 围绕着点,而 cv::boundingRect 被放置在点上)。这可能真的是一个错误,也许最初 cv::RotatedRect::boundingRect 是 cv::boundingRect 的优化拷贝,并且 cv::boundingRect 中的错误修复没有更新成员函数。不确定...我建议一直使用通用 cv::boundingRect(虽然没有测量速度)。

enter image description here

关于c++ - 它是 opencv RotatedRect 的错误吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35869565/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com