初级_学徒 2016-09-05 12:37 采纳率: 100%
浏览 1333
已采纳

MFC对话框初始化时新建线程,调用OPENCV显示视频文件的问题。

我用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个相机采集的视频都可以正常显示在图片控件里面。
望大神解答一下上面的疑问,我是自己没事自学的,没什么水平。

  • 写回答

4条回答 默认 最新

  • oyljerry 2016-09-05 13:46
    关注

    你线程中不要更新界面 而是发送消息主线程 让它来更新界面元素等

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(3条)

报告相同问题?

悬赏问题

  • ¥15 不同尺寸货物如何寻找合适的包装箱型谱
  • ¥15 求解 yolo算法问题
  • ¥15 虚拟机打包apk出现错误
  • ¥15 用visual studi code完成html页面
  • ¥15 聚类分析或者python进行数据分析
  • ¥15 三菱伺服电机按启动按钮有使能但不动作
  • ¥15 js,页面2返回页面1时定位进入的设备
  • ¥50 导入文件到网吧的电脑并且在重启之后不会被恢复
  • ¥15 (希望可以解决问题)ma和mb文件无法正常打开,打开后是空白,但是有正常内存占用,但可以在打开Maya应用程序后打开场景ma和mb格式。
  • ¥20 ML307A在使用AT命令连接EMQX平台的MQTT时被拒绝