1. 程式人生 > >OpenCV學習筆記(六十一)——建立支援OpenGL的OpenCV工程“Master OpenCV”chp.3

OpenCV學習筆記(六十一)——建立支援OpenGL的OpenCV工程“Master OpenCV”chp.3

從OpenCV2.4beta版本,OpenGL就可以有介面到highgui的模組中了。結合Master OpenCV第三章的閱讀,這裡說說如何在OpenCV的顯示中嵌入OpenGL的虛擬物體。

要注意的一點:如果想使OpenCV支援OpenGL,不能使用預編譯好的library,要用cmake rebuild工程,注意ENABLE_OPENGL = YES,(在2.4.2版本中,預設ENABLE_OPENGL = NO),標籤的改變在CMake的高階版本都是圖形介面的,只需把WITH_OPENGL的對號勾選即可。

這裡實戰過程中我還遇到了一個問題,用這個CMake得到的vs工程(添加了WITH_OPENGL)無法編譯通過,鬱悶了好久。因為opengl在vs中是支援的,不需要安裝

,最後找到了這個bug,需要把\modules\core\src\opengl_interop.cpp檔案中使用<gl\gl.h>前面新增#include <windows.h>,(其實#include <gl.h>前都需要新增#include <windows.h>這樣才能編譯通過,這裡我只重新編譯opencv_core243d.lib 和opencv_highgui243d.lib

已經得到了支援OpenGL的OpenCV lib,接下來就是如何用OpenCV建立OpenGL視窗,基本的呼叫方式很像OpenCV中滑鼠的使用,都是通過回撥函式實現,核心程式碼如下:

// callback function
void onDraw(void* param)
{
	// Draw something using OpenGL here
}

int main(void)
{
	string openGLWindowName = "OpenGL Test";
	namedWindow(openGLWindowName, WINDOW_OPENGL);
	resizeWindow(openGLWindowName, 640, 480);
	setOpenGlContext(openGLWindowName);
	setOpenGlDrawCallback(openGLWindowName, onDraw, NULL);

	updateWindow(openGLWindowName); // when needed
	return 0;
}

以前我們呼叫namedWindow最後一個引數通常會用預設或者使用WINDOW_AUTOSIZE,這回用WINDOW_OPENGL,然後呼叫setOpenGLContext建立視窗關聯,為了在這個視窗上畫虛擬物體,需要使用回撥函式,建立方法就是setOpenGLDrawCallback,注意這個函式第一個引數是視窗名稱,第二個引數是回撥函式名,第三個引數是回撥函式的引數,因為我這裡回撥函式onDraw是無參函式,所以這裡為NULL。跟MFC重繪需要呼叫Invalidate或者uadate類似,在需要重繪的時候還要呼叫updateWindow