OpenGL 与 OpenCV 相结合的计算机视觉教程 [关闭]
Posted
技术标签:
【中文标题】OpenGL 与 OpenCV 相结合的计算机视觉教程 [关闭]【英文标题】:Tutorial on OpenGL combined with OpenCV for Computer Vision [closed] 【发布时间】:2012-02-01 11:38:26 【问题描述】:有没有人知道一个很好的教程或文档来处理在 C++ 中混合 OpenCV
和 OpenGL
,与 Computer Vision
和 3D 渲染有关?
我想用对象创建虚拟场景,然后使用 OpenCV 找到object's 3D poses
,这样我可以与已知的 OpenGL 位置进行比较,但到目前为止我没有找到太多“质量”信息。例如,我需要 opengl 相机的内在参数才能使用 OpenCV 检测 3D 世界中的物体等。
【问题讨论】:
【参考方案1】:混合 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。确实有很多教程可以做到这一点。
【讨论】:
实际上我可以使用 openCV 加载图像,然后将它们作为纹理传递给 openGL,然后从 openGL 读取像素并显示和 openCV 帧。但问题不在于混合它们,而是我想要一些关于如何处理相机参数、纹理过滤器如何影响识别等的信息 那么您可能应该重新表述这个问题。目前尚不清楚您是否想使用 OpenGL 进行 3D 渲染并在其上调用 OpenCV,或者您是否想使用 OpenGL 对图像进行后处理并将它们传递给 OpenCV,或者您是否想研究纹理插值过滤器的效果(如双线性过滤器)关于 OpenCV 识别率。如果是最后一个,那么您可能根本不需要使用 OpenGL,纹理过滤就像弱低通过滤器一样工作。只需使用它。如果是第二个,那么你需要一些关于 OpenGL 着色器的教程来实现你想要的效果。 “最有可能没有教程,因为它太简单了”这很蹩脚。如果真是这样,人们会认为会有很多新手教程。 使用 OpenGL 需要一些设置和上下文的创建。帧缓冲区、深度缓冲区、模板缓冲区、着色器等……需要设置并与窗口连接。问题可能是如何将 OpenGL 上下文与 OpenCV 窗口连接起来…… @the-swine 关于如何打开具有相关深度缓冲区(也可能是模板缓冲区和累积缓冲区)的 OpenCVnamedWindow
的快速代码 sn-p 会很有帮助。我没有找到“这很容易,真的没什么好解释的”这个有用的答案。以上是关于OpenGL 与 OpenCV 相结合的计算机视觉教程 [关闭]的主要内容,如果未能解决你的问题,请参考以下文章