我做的在MFC控件中播放视频的程序,总是显示不出来啊,哪位高手给看看! 其中用到了OPENCV和多线程的知识
我做的在MFC控件中播放视频的程序,总是显示不出来啊,哪位高手给看看!其中用到了OPENCV和多线程的知识voidDrawPicToHDC(IplImage*img,UI...
我做的在MFC控件中播放视频的程序,总是显示不出来啊,哪位高手给看看!
其中用到了OPENCV和多线程的知识
void DrawPicToHDC(IplImage *img, UINT ID)
{
HWND HDialog=FindWindow(NULL, "Camera");
HDC hdc;
hdc=GetDC(GetDlgItem(HDialog,ID));
CRect rect;
GetClientRect(GetDlgItem(HDialog,ID),&rect);
CvvImage cimg;
cimg.CopyOf(img);
cimg.DrawToHDC(hdc,&rect);
ReleaseDC(GetDlgItem(HDialog,ID),hdc);
}
UINT FunctionName(LPVOID pParam)
{
while(true)
{
if(!cvGrabFrame(pCapture)) break;
pFrame=cvRetrieveFrame(pCapture);
if(!pFrame) break;
DrawPicToHDC(pFrame, IDC_STATIC_PIC);
}
return 0;
}
void CCameraDlg::OnTimer(UINT nIDEvent)
{
// TODO: Add your message handler code here and/or call default
AfxBeginThread(FunctionName,NULL,THREAD_PRIORITY_BELOW_NORMAL,0,0);
CDialog::OnTimer(nIDEvent);
}
you settimer 展开
其中用到了OPENCV和多线程的知识
void DrawPicToHDC(IplImage *img, UINT ID)
{
HWND HDialog=FindWindow(NULL, "Camera");
HDC hdc;
hdc=GetDC(GetDlgItem(HDialog,ID));
CRect rect;
GetClientRect(GetDlgItem(HDialog,ID),&rect);
CvvImage cimg;
cimg.CopyOf(img);
cimg.DrawToHDC(hdc,&rect);
ReleaseDC(GetDlgItem(HDialog,ID),hdc);
}
UINT FunctionName(LPVOID pParam)
{
while(true)
{
if(!cvGrabFrame(pCapture)) break;
pFrame=cvRetrieveFrame(pCapture);
if(!pFrame) break;
DrawPicToHDC(pFrame, IDC_STATIC_PIC);
}
return 0;
}
void CCameraDlg::OnTimer(UINT nIDEvent)
{
// TODO: Add your message handler code here and/or call default
AfxBeginThread(FunctionName,NULL,THREAD_PRIORITY_BELOW_NORMAL,0,0);
CDialog::OnTimer(nIDEvent);
}
you settimer 展开
4个回答
展开全部
你的想法是不是:每隔一段时间调用一次Ontimer,在这次ontimer启动一个线程,在这个线程内将一帧图像显示在MFC控件上?
那么你做法明显错了,你的实际做法是:每隔一段时间调用一次ontimer,在这次ontimer启动一个线程,在这个线程内开始一个循环,在这个循环内把所有帧都画在IDC_STATIC_PIC上面,直到帧被画完为止。你想想,你每次调用的ontimer都做了“把所有帧都画在IDC_STATIC_PIC"这个工作,是错误。你应该做的事情是:每隔一段时间调用的ontimer,只把一帧显示在控件上。建议修改while循环体。
那么你做法明显错了,你的实际做法是:每隔一段时间调用一次ontimer,在这次ontimer启动一个线程,在这个线程内开始一个循环,在这个循环内把所有帧都画在IDC_STATIC_PIC上面,直到帧被画完为止。你想想,你每次调用的ontimer都做了“把所有帧都画在IDC_STATIC_PIC"这个工作,是错误。你应该做的事情是:每隔一段时间调用的ontimer,只把一帧显示在控件上。建议修改while循环体。
展开全部
我觉得是不是该在while中添加cvWaitkey(30);要不然来不及显示。
不知道对不对。lz试试吧。
不知道对不对。lz试试吧。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
用CvvImage类的CvvImage::DrawToHDC试试吧。
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询