<分区>
有没有人知道有关在 C++ 中混合 OpenCV
和 OpenGL
以及与 Computer Vision
和 3D 渲染相关的好的教程或文档?
我想用对象创建虚拟场景,然后使用 OpenCV 找到对象的 3D 姿势
,这样我就可以与已知的 OpenGL 位置进行比较,但到目前为止我没有找到太多“质量”信息。例如,我需要 opengl 相机的固有参数,以便使用 OpenCV 检测 3D 世界中的物体等。
<分区>
有没有人知道有关在 C++ 中混合 OpenCV
和 OpenGL
以及与 Computer Vision
和 3D 渲染相关的好的教程或文档?
我想用对象创建虚拟场景,然后使用 OpenCV 找到对象的 3D 姿势
,这样我就可以与已知的 OpenGL 位置进行比较,但到目前为止我没有找到太多“质量”信息。例如,我需要 opengl 相机的固有参数,以便使用 OpenCV 检测 3D 世界中的物体等。
最佳答案
混合 OpenGL 和 OpenCV 没有什么困难。这些只是两个库,一个用于图形,另一个用于计算机视觉。没有重叠,因此您可以将两者都包含在您的项目中。
那么它应该是渲染一些矩形或盒子(或者任何你想使用 OpenCV 定位的东西)的问题 - 有很多教程,然后使用 glReadPixels() 函数将渲染数据复制到客户端内存并将其传递给 OpenCV。
很可能没有教程,因为它太简单了......
你可以:
void onDisplay(void* param)
{
glClearColor(0, 1, 0, 1);
glClear(GL_COLOR_BUFFER_BIT); // Make a green window.
}
...
void MyClass::MyInit(bool useCustomInit)
{
std::string winname = "MyWnd";
if (useCustomInit) {
namedWindow(winname, CV_WINDOW_NORMAL);
resizeWindow(winname, 640, 480);
auto handle = cvGetWindowHandle(winname.c_str());
InitializeOpenGL(handle); // your custom OpenGL initialization.
} else {
namedWindow(winname, CV_WINDOW_NORMAL | CV_WINDOW_OPENGL);
resizeWindow(winname, 640, 480);
}
void *param_value = reinterpret_cast<void*>(this); // Can e.g. do this or just use nullptr.
setOpenGlDrawCallback(winname, onDisplay, param_value);
// ...
}
如果您对默认的 OpenGL 窗口满意,可以使用 Init(false)
。如果您想要花哨的位深度和模板缓冲区以及诸如此类的东西,请使用操作系统的窗口句柄自行初始化 OpenGL。确实有很多教程可以做到这一点。
关于c++ - OpenGL 与 OpenCV 相结合的计算机视觉教程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9095124/