MFC中利用多线程实现opencv视频窗口多画面
效果图如上所示,在vc6.0+opencv1.0环境下实现。虽然现在opencv出2.0了,但是不再支持vc6.0了,做这个例子当是跟vc6.0告个别了。呵呵
详细内容,往后会写上去的。中间遇到不少问题,都被我一一解决了。呵呵
介绍之前,我们需要澄清一些问题:
1、在控制台下能否实现多画面?
答案是肯定的,通常采用内存贴图就可以实现的。只要把要显示位置的坐标计算正确,就可以了,并且也可以采用多线程来加快显示和处理速度。
2、那为什么还要在mfc下实现呢?
在mfc下实现主要是考虑到mfc的强大、方便性,如果想做大型的程序,利用一个强大的靠山何乐而不为呢。况且opencv中对ui界面的支持相当有限,想实现更复杂的功能就比较麻烦。
3、为什么要采用多线程?
摄像头的采集程序部分相当于是一个死循环,况且要实现多画面,如果写到一个进程里面..嘿嘿,如果卡不死那你一定是外星人了。
闲话少说,首先要介绍下线程创建的一般方法:
伪代码如下:
dword winapi fun1(lpvod lp);线程函数声明
main()
{
HANDLE hthread;定义线程句柄
hthread=createthread(-----);创建线程
closehandle(hthread);关闭句柄
}
dword winapi fun1(lpvod lp)
{要操作的内容}
很简单吧,多个线程照葫芦画瓢多定义几个就ok了;(线程同步就不讲了)
那有人可能就问了,既然如此直接在mfc里面定义几个这样的线程不就ok了么,答案是肯定也是否定的。因为mfc是以类为基础的,而对于线程函数来说,线程的调用是不需要依赖于某个类或某个对象的,但是如果不定义到类里面,我们的线程就无法使用类内部的资源,而单纯的定义到类内部的结果就是,编译器会报告如下 错误:
cannot convert parameter 3 from 'unsigned long(void *)' to 'unsigned long(_stdcall*)(void *)'
产生错误的原因就在于我们将线程定义到类的内部,但调用时我们却找不到这个对象