有没有办法将 OpenCV 中的 minAreaRect 与 double 一起使用?

Is there a way to use minAreaRect from OpenCV with double?

我在 3D 环境和相机中工作,因此我在一侧有一些 3D 坐标,在另一侧使用 OpenCV。

考虑到 2D 坐标,我需要找到多边形的最小边界矩形,并且想为此使用 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 Error: Assertion failed (points.checkVector(2) >= 0 && (points.depth() == CV_32F || points.depth() == CV_32S)) in minAreaRect, file /build/buildd/opencv-2.4.8+dfsg1/modules/imgproc/src/contours.cpp, line 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,但我偶然发现了这一点,并希望避免编写自己的旋转卡尺函数。

谢谢!

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!