我在3D环境和相机中工作,以便我在一侧有一些3D坐标,在另一侧玩OpenCV。
我需要找到一个多边形的最小边界矩形,考虑到二维坐标,并希望使用OpenCV。
问题是我的坐标用双精度表示。
我试过了:
std::vector<cv::Point2d> poly {{1.1, 2.2}, {3.3, 4.4}, {5.5, 6.6}, {7.7, 8.8}};
cv::RotatedRect box = cv::minAreaRect(poly); // crashes here
cv::Point2f corners[4];
box.points(corners);
但出现以下错误:
OpenCV错误:断言失败(points.checkVector(2)&gt; = 0&amp;&amp;(points.depth()== CV_32F || points.depth()== CV_32S))minAreaRect,file / build /buildd/opencv-2.4.8+dfsg1/modules/imgproc/src/contours.cpp,第1913行
如果我使用某些Point
代替Point2d
,则生成的矩形的坐标会被截断
// narrowing conversions
std::vector<cv::Point2d> poly {{1.1, 2.2}, {3.3, 4.4}, {5.5, 6.6}, {7.7, 8.8}};
cv::RotatedRect box = cv::minAreaRect(poly);
cv::Point2f corners[4];
box.points(corners);
如果我以正确的方式使用OpenCV,我不会百分之百确定,但我偶然发现了这一点,并希望避免编写我自己的旋转卡尺功能。
谢谢!
答案 0 :(得分:3)
minAreaRect
仅接受Point
或Point2f
,即CV_32S
或CV_32F
类型的点。
如果float
点具有足够的准确度,您可以使用Point2f
代替Point2d
:
std::vector<cv::Point2f> poly{ { 1.1f, 2.2f }, { 3.3f, 4.4f }, { 5.5f, 6.6f }, { 7.7f, 8.8f } };
cv::RotatedRect box = cv::minAreaRect(poly); // now it works!