如何使用 OpenCV(在 C++ 中)将齐次点转换为非齐次点

Posted

技术标签:

【中文标题】如何使用 OpenCV(在 C++ 中)将齐次点转换为非齐次点【英文标题】:How to convert homogeneous points to inhomogeneous points using OpenCV (in C++) 【发布时间】:2015-06-18 08:08:06 【问题描述】:

我想转换积分。目前我的代码如下所示:

std::vector<cv::Point3d> homCamPoints(4);
// some assignments to homCamPoints
std::vector<cv::Point2d> inhomCamPoints(4);
convertPointsFromHomogeneous(homCamPoints, inhomCamPoints);

但我总是收到有关内存位置的异常错误。所以,我假设我的输入类型是错误的,尽管OpenCV documentation 说:

src - N 维点的输入向量。 dst – N-1 维点的输出向量。

听起来我的输入类型没问题。但是在网上我只找到了使用cv::Mat 类型的例子,但由于时间问题我想避免在那个阶段进行重组。

我在调试模式下运行我的代码。调用函数时,参数似乎真的很好。然后在输入函数后立即发生错误,但我无法准确弄清楚,因为我无法进入函数代码本身。有谁知道为什么这不起作用?谢谢。

【问题讨论】:

功能代码可以在OpenCVsgithub上找到。您可以合法下载、编译、链接和使用。 【参考方案1】:

我试过了:

std::vector<cv::Point3d> homCamPoints(4, cv::Point3d(0,0,0));
homCamPoints[0] = cv::Point3d(0,0,0);
homCamPoints[1] = cv::Point3d(1,1,1);
homCamPoints[2] = cv::Point3d(-1,-1,-1);
homCamPoints[3] = cv::Point3d(2,2,2);

std::vector<cv::Point2d> inhomCamPoints(4);

cv::convertPointsFromHomogeneous(homCamPoints, inhomCamPoints);

它毫无例外地工作。也许您的问题在您的代码中的其他地方。 inhomCamPoints 是: [0, 0], [1, 1], [1, 1], [1, 1]

【讨论】:

很奇怪。如果我将您的行完全复制到我的代码中,那么它可以正常工作,直到这个函数调用......然后我再次收到错误。我实在想不通问题出在哪里。 你试过只执行这段代码吗?只有 int main()/*以上代码*/,当然包括库。如果这样可行,那么您的问题就出在其他地方。 我又试了一次,把所有的东西都注释掉了。我唯一包含的是#include "opencv2/opencv.hpp",然后是int main()/*above code*/,仅此而已。我仍然得到同样的错误...... 我不知道为什么,但是当我只输入float 而不是double 时,它就可以工作了.....

以上是关于如何使用 OpenCV(在 C++ 中)将齐次点转换为非齐次点的主要内容,如果未能解决你的问题,请参考以下文章

如何在 OSX 中使用 C++ opencv highgui 将活动窗口设置为 opencv 图像

OpenCV - 如何使用 Eclipse C++ IDE 将 /home 中编译的 opencv 库优先于 /usr/lib/ 中编译的库

如何在 C++ 中使用 OpenCV 4.2 计算二进制图像的周长

如何将来自不同图像的多个描述符存储在 C++ 和 OpenCV 中的向量向量中?

如何将 opencv c++ 代码集成到使用 c# 以统一 3D 开发的移动应用程序中

如何在带有 VB.net GUI 的 C++ OpenCV 项目中使用 C# 库?