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 *)'

产生错误的原因就在于我们将线程定义到类的内部,但调用时我们却找不到这个对象

 

 

 

 

 

 

posted on 2009-12-21 00:26  oskycar  阅读(10733)  评论(5编辑  收藏  举报

导航