一、OpenCV与OpenGL
OpenCV是 Open Source Computer Vision Library,是从图像到数据。OpenCV主要是提供图像处理和视频处理的基础算法库,还涉及一些机器学习的算法。比如你想实现视频的降噪、运动物体的跟踪、目标(比如人脸)的识别这些都是CV的领域。
OpenGL是 Open Graphics Library,是从数据到图像。OpenGL专注在Graphics,3D绘图。
其实两者的区别就是Computer Vision和Computer Graphics这两个学科之间的区别,前者专注于从采集到的视觉图像中获取信息,是用机器来理解图像;后者是用机器绘制合适的视觉图像给人看。
二、教程笔记
1.创建Windows窗口的过程
创建一个窗口程序主要包含以下四个过程:
(1)注册窗口
(2)监听用户操作,窗口消息处理
(3)创建窗口并展示窗口
(4)通过循环确保窗口打开的时长
2. 代码展示
#include <windows.h>
//窗口消息处理函数
LRESULT CALLBACK GLWindowProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
switch (msg)
{
case WM_CLOSE:
PostQuitMessage(0);
return 0;
}
return DefWindowProc(hwnd, msg, wParam, lParam); //系统默认消息处理函数
}
INT WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd)
{
//注册窗口
WNDCLASSEX wndclass; //WNDCLASSEX结构用于注册窗口类
wndclass.cbClsExtra = 0; //指定紧跟在窗口类结构后的附加字节数。
wndclass.cbSize = sizeof(WNDCLASSEX); //WNDCLASSEX 的大小。我们可以用sizeof(WNDCLASSEX)来获得准确的值。
wndclass.cbWndExtra = 0; //指定紧跟在窗口实例的附加字节数
wndclass.hbrBackground = NULL; //背景画刷的句柄
wndclass.hCursor = LoadCursor(NULL, IDC_ARROW); //光标的句柄
wndclass.hIcon = NULL; //图标的句柄
wndclass.hIconSm = NULL; //和窗口类关联的小图标。如果该值为NULL。则把hIcon中的图标转换成大小合适的小图标。
wndclass.hInstance = hInstance; //本模块的实例句柄
wndclass.lpfnWndProc = GLWindowProc; //窗口处理函数的指针
wndclass.lpszClassName = "GLWindow"; //指向类名称的指针
wndclass.lpszMenuName = NULL; //菜单名称
wndclass.style = CS_VREDRAW|CS_HREDRAW;//窗口重绘方式
ATOM atom = RegisterClassEx(&wndclass);
if (!atom)
{
MessageBox(NULL, "Register Fail", "Error", MB_OK);
return 0;
}
//窗口大小设置,使窗口实际大小为800*600
RECT rect;
rect.left = 0;
rect.right = 800;
rect.top = 0;
rect.bottom = 600;
AdjustWindowRect(&rect, WS_OVERLAPPEDWINDOW, NULL);
int windowWidth = rect.right - rect.left;
int windowHeight = rect.bottom - rect.top;
//创建窗口
HWND hwnd = CreateWindowEx(NULL, "GLWindow", "OpenGL Window", WS_OVERLAPPEDWINDOW,
100, 100, 800, 600,
NULL, NULL, hInstance, NULL);
//显示窗口
ShowWindow(hwnd, SW_SHOW);
UpdateWindow(hwnd);
//防止窗口一闪而过
MSG msg;
while (true)
{
if (PeekMessage(&msg, NULL, NULL, NULL, PM_REMOVE))
{
if (msg.message == WM_QUIT)
{
break;
}
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
return 0;
}
3.解决问题
项目运行时报如下错,是因为我们新建工程时项目是控制台应用程序,而不是窗口应用程序。