我用VS2010新建一个MFC对话框。
新建3个全局变量:IplImage img;CvCapture capture; int m_flag=0。(m_flag用来退出线程。)
在对话框上插入一个图片控件IDC_PTC。
在对话框的初始化函数中插入如下代码
capture=cvCreateCameraCapture(0);
if(!capture)
{
MessageBox(_T("打开摄像头失败!"));
}
else
{
m_flag=1;
cvSetCaptureProperty(capture, CV_CAP_PROP_FRAME_WIDTH, 800);
cvSetCaptureProperty(capture, CV_CAP_PROP_FRAME_HEIGHT, 800);
cvSetCaptureProperty(capture, CV_CAP_PROP_FPS, 5);
HANDLE hThread;
hThread=CreateThread(NULL,0,FunProc1,(LPVOID)this,0,NULL);
CloseHandle(hThread);
}
线程函数如下:
DWORD WINAPI CtestDlg::FunProc1(LPVOID lp)
{
CtestDlg* dlg=(CtestDlg*)lp;
CWnd* wnd=(CWnd*)lp;
CClientDC dc(wnd&&m_flag);
RECT rect;
(wnd->GetDlgItem(IDC_PTC))->GetWindowRect(&rect);
wnd->ScreenToClient(&rect);
img=cvQueryFrame(capture);
CvvImage cvImg;
while(img&&m_flag)
{
cvImg.CopyOf(img);
cvImg.DrawToHDC(dc,&rect);
img=cvQueryFrame(capture);
}
cvImg.Destroy();
return 1;
}
那么问题来了:
这样在线程函数开头插入断点"调试运行"对话框显示时就可以看到相机实时采集图像显示在图片控件内。
但是如果直接点“开始执行(不调试)”,目前所知有2种情况:
1、用USB接口相机,图片控件上不显示相机采集的视频。
2、用笔记本自带相机,图片控件上显示相机采集的视频。
这是为什么?还有下面2个问题如下:
3、“调试运行”对话框按正常流程退出。“开始执行(不调试)”对话框时不时的不正常退出(任务管理器可以看到程序在后台运行)。
4、如果把创建线程的函数放入到一个按钮里面,那么2个相机采集的视频都可以正常显示在图片控件里面。
望大神解答一下上面的疑问,我是自己没事自学的,没什么水平。
你线程中不要更新界面 而是发送消息主线程 让它来更新界面元素等
上面代码有个错误 CClientDC dc(wnd&&m_flag); 这句后面的&&m_flag是多余的。我贴错了。不好意思。
主线程重绘窗口,与在子线程力调用主窗口DC重画主窗口区域有什么不同?望指点,谢谢啊。
就是picture控件显示
用USB接口相机 用笔记本自带相机对应的调用接口是不同的
如(网上随便找的代码)
#include "stdafx.h"
#include
#include
#include
int main( int argc, char** argv )
{
//声明IplImage指针
IplImage* pFrame = NULL;
CvCapture* pCapture = cvCreateCameraCapture(-1);
cvNamedWindow("video", 1);
while(1)
{
pFrame=cvQueryFrame( pCapture );
if(!pFrame)break;
cvShowImage("video",pFrame);
char c=cvWaitKey(33);
if(c==27)break;
}
cvReleaseCapture(&pCapture);
cvDestroyWindow("video");
}
这段里面cvCreateCameraCapture后面的数字就是不同的相机 一般为 0 1 -1