要做一个视频录制的功能
使用的是opencv+vs2010,基于对话框的MFC
想要用一个按钮实现录制的开始和结束
就是点击该按钮,开始录制,再点击就结束录制。期间按钮的名字也要变化请问各位大大该怎么做呢?MFCOpenCV按钮事件

解决方案 »

  1.   

    在按钮的响应函数中添加下列代码试试 
    CString str = (CButton*)GetDlgItem(BUTTON_ID)->GetWindowText();
    if(str == "暂停")
            GetDlgItem(BUTTON_ID)->SetWindowText(_T("继续"));
    else
            GetDlgItem(BUTTON_ID)->SetWindowText(_T("暂停"));
      

  2.   

    我用了相似的思路
    当按下开始录制后按钮可以变为save,但此时画面冻结,程序不响应
    强制关掉后相应文件夹有录制的视频,但视频很慢并且播放器没有视频长度及进度条
        int state=0;
        CvVideoWriter* videoWriter;    void CMytestDlg::OnBnClickedButtonTape()
        {
           if(state==0)
           {
              state=1;
              CWnd* pWnd_video=GetDlgItem(IDC_BUTTON_TAPE);
              pWnd_video->SetWindowText(_T("Save"));
              //指定视频中每一帧的大小 
              CvSize size = cvSize(width,height);
              //需要初始化一个写视频文件的对象,这里注意使用的编解码器格式是MJPG  帧率设置为5
              videoWriter = 
                cvCreateVideoWriter("../videotap/test.avi",CV_FOURCC('M','J','P','G'),5,size);
           }
           else
           {
              state=0;
              CWnd* pWnd_video=GetDlgItem(IDC_BUTTON_TAPE);
              pWnd_video->SetWindowText(_T("Videotape"));
           } 
            //每隔200ms,从摄像头中取出一帧 
            while(cvWaitKey(200))
            {   
                if(state==0)
                 break;
              //得到从摄像头中获取的帧 
                IplImage* frame = cvQueryFrame(capture1); 
                //将帧写入视频文件中 
                cvWriteFrame(videoWriter,frame);   
            } 
        }
      

  3.   

    你需要的是多线程后台处理,防止界面冻结要不就用个定时器,把while这段去掉,while内部的内容放定时器里面
    保存时打开定时器,停止则关闭定时器
    这样界面应该也不会卡死
      

  4.   

    把while那一段 放到线程了去操作
      

  5.   

    原因很明显,你把视频录制的功能和页面管理功能都放在一个线程里面了,所以出现页面冻结现象。常见问题而已,解决办法有很多,不用担心(一般情况下,MFC是将对话框管理线程作为主线程)。酱紫做就可以(主要思路):
    step1:在XXXDlg.cpp文件中定义1个bool全局变量和子线程函数
    UINT threadfun1(LPVOID lpParameter)
    {
    while (全局变量)
    {
    WaitForSingleObject(g_hEvent,INFINITE);
                    //--------音频录制代码放在这里---------//
    SetEvent(g_hEvent);
    } return 0;
    }
    step2:在你的按钮响应函数里面启动、关闭等线程管理功能
    void XXXDlg::OnBnClickedButton1()
    {
            全局变量 = !全局变量;//逻辑控制
            g_hEvent = CreateEvent(NULL,FALSE,FALSE,NULL);//创建事件对象
    SetEvent(g_hEvent);                           //设置对象为有信号状态
    AfxBeginThread(threadfun1,this);
    }
    注:g_hEvent为全局Handle变量。
    给分吧!
      

  6.   

    原因很明显,你把视频录制的功能和页面管理功能都放在一个线程里面了,所以出现页面冻结现象。常见问题而已,解决办法有很多,不用担心(一般情况下,MFC是将对话框管理线程作为主线程)。酱紫做就可以(主要思路):
    step1:在XXXDlg.cpp文件中定义1个bool全局变量和子线程函数
    UINT threadfun1(LPVOID lpParameter)
    {
    while (全局变量)
    {
    WaitForSingleObject(g_hEvent,INFINITE);
                    //--------音频录制代码放在这里---------//
    SetEvent(g_hEvent);
    } return 0;
    }
    step2:在你的按钮响应函数里面启动、关闭等线程管理功能
    void XXXDlg::OnBnClickedButton1()
    {
            全局变量 = !全局变量;//逻辑控制
            g_hEvent = CreateEvent(NULL,FALSE,FALSE,NULL);//创建事件对象
    SetEvent(g_hEvent);                           //设置对象为有信号状态
    AfxBeginThread(threadfun1,this);
    }
    注:g_hEvent为全局Handle变量。
    给分吧!
    你好,我对多线程不怎么了解,按你的方法依葫芦画瓢了下。但得到的视频似乎只有第一帧,能帮忙分析下么
    bool state=false;
    HANDLE g_hEvent;
    CvVideoWriter* videoWriter;UINT threadfun1(LPVOID lpParameter)
    {
    while (state)
    {
    WaitForSingleObject(g_hEvent,INFINITE);
            //指定视频中每一帧的大小  
    CvSize size = cvSize(width,height);
    //需要初始化一个写视频文件的对象,这里注意使用的编解码器格式是MJPG  帧率设置为5
    videoWriter =  
            cvCreateVideoWriter("../videotap/test.avi",CV_FOURCC('M','J','P','G'),5,size);
    //得到从摄像头中获取的帧  
            IplImage* frame = cvQueryFrame(capture1);  
            //将帧写入视频文件中  
            cvWriteFrame(videoWriter,frame); 
    SetEvent(g_hEvent);
    }
    return 0;
    }
    void CMytestDlg::OnBnClickedButtonTape()
    {
    state=!state;
    if(state)
    {
    CWnd* pWnd_video=GetDlgItem(IDC_BUTTON_TAPE);
    pWnd_video->SetWindowText(_T("Save"));

    }
    else
    {
    CWnd* pWnd_video=GetDlgItem(IDC_BUTTON_TAPE);
    pWnd_video->SetWindowText(_T("Videotape"));
    }
    g_hEvent = CreateEvent(NULL,FALSE,FALSE,NULL);//创建事件对象
    SetEvent(g_hEvent);                           //设置对象为有信号状态
    AfxBeginThread(threadfun1,this);   
    }
      

  7.   

    原因很明显,你把视频录制的功能和页面管理功能都放在一个线程里面了,所以出现页面冻结现象。常见问题而已,解决办法有很多,不用担心(一般情况下,MFC是将对话框管理线程作为主线程)。酱紫做就可以(主要思路):
    step1:在XXXDlg.cpp文件中定义1个bool全局变量和子线程函数
    UINT threadfun1(LPVOID lpParameter)
    {
    while (全局变量)
    {
    WaitForSingleObject(g_hEvent,INFINITE);
                    //--------音频录制代码放在这里---------//
    SetEvent(g_hEvent);
    } return 0;
    }
    step2:在你的按钮响应函数里面启动、关闭等线程管理功能
    void XXXDlg::OnBnClickedButton1()
    {
            全局变量 = !全局变量;//逻辑控制
            g_hEvent = CreateEvent(NULL,FALSE,FALSE,NULL);//创建事件对象
    SetEvent(g_hEvent);                           //设置对象为有信号状态
    AfxBeginThread(threadfun1,this);
    }
    注:g_hEvent为全局Handle变量。
    给分吧!
    你好,我对多线程不怎么了解,按你的方法依葫芦画瓢了下。但得到的视频似乎只有第一帧,能帮忙分析下么
    bool state=false;
    HANDLE g_hEvent;
    CvVideoWriter* videoWriter;UINT threadfun1(LPVOID lpParameter)
    {
    while (state)
    {
    WaitForSingleObject(g_hEvent,INFINITE);
            //指定视频中每一帧的大小  
    CvSize size = cvSize(width,height);
    //需要初始化一个写视频文件的对象,这里注意使用的编解码器格式是MJPG  帧率设置为5
    videoWriter =  
            cvCreateVideoWriter("../videotap/test.avi",CV_FOURCC('M','J','P','G'),5,size);
    //得到从摄像头中获取的帧  
            IplImage* frame = cvQueryFrame(capture1);  
            //将帧写入视频文件中  
            cvWriteFrame(videoWriter,frame); 
    SetEvent(g_hEvent);
    }
    return 0;
    }
    void CMytestDlg::OnBnClickedButtonTape()
    {
    state=!state;
    if(state)
    {
    CWnd* pWnd_video=GetDlgItem(IDC_BUTTON_TAPE);
    pWnd_video->SetWindowText(_T("Save"));

    }
    else
    {
    CWnd* pWnd_video=GetDlgItem(IDC_BUTTON_TAPE);
    pWnd_video->SetWindowText(_T("Videotape"));
    }
    g_hEvent = CreateEvent(NULL,FALSE,FALSE,NULL);//创建事件对象
    SetEvent(g_hEvent);                           //设置对象为有信号状态
    AfxBeginThread(threadfun1,this);   
    }设置断点检查一下:当state为真时候,看看你的程序是否一直停留在while()循环里面。如果是这样滴话,那就不是多线程的问题,而是你的音频录制代码的问题了。
      

  8.   

    知道原因了,问题出在while里的 
    CvSize size = cvSize(width,height)
    videoWriter =  
    cvCreateVideoWriter("../videotap/test.avi",CV_FOURCC('M','J','P','G'),5,size);
    一段,应该将它放进主函数里初始化。否则每次循环都将重新新建一个视频文件