有没有办法在OpenCV中使用minAreaRect?

时间:2016-02-09 15:02:16

标签: c++ opencv bounding-box

我在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,我不会百分之百确定,但我偶然发现了这一点,并希望避免编写我自己的旋转卡尺功能。

谢谢!

1 个答案:

答案 0 :(得分:3)

minAreaRect仅接受PointPoint2f,即CV_32SCV_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!