int x;UINT ShowImage(LPVOID t)
{
cv::VideoCapture cap(0);//"d://swipe.avi");
cv::Mat frame;
while (1)
{
cap>>frame;
if (frame.empty() ) break;
cv::imshow ("1",frame);
cv::waitKey (30);
}
return 0;}
void CcvCapture_MT1Dlg::OnBnClickedButton1()
{
// TODO: Add your control notification handler code here

pThread=AfxBeginThread(ShowImage,&x);}这是调试时的代码

解决方案 »

  1.   

    没做过关于OpenCV的东西,而且不太了解楼主代码的具体实现。但可以提两点看能否帮上楼主。
    1、正常来讲不在线程中处理和在线程中处理是一样的。即使不在线程中处理也是在主线程中处理,没有区别的。我只能认为楼主把在之前主线程中处理的步骤忽略了一些,这部分没有加到你的线程中。而且感觉很大程序是这个原因造成的。
    2、楼主可以看看在哪个地方失败了,或调用什么函数失败了,看一下返回值或调用GetLastError看一下是什么错误,这样可以帮助楼主分析这个问题。
    建议参考第1点仔细查一下代码。另希望楼主提供更多的信息。
      

  2.   


    为测试这个功能, 使用的是最简化的代码,过程是这样的,1、新建一个基于对话框的MFC应用程序,上面加上一个BUTTON.
    2,如果不使用多线程,在BUTTON的CLICK消息中处理的代码就是ShowImage中的代码,这样无论测试哪个摄像头还是两个一起打开,都没问题,只是这样如果在图片控件显示视频时,其它控件没响应。
    3、如果使用多线程来处理,代码就是上面那些,这样处理内置摄像头没问题,可以如代码所示由OPENCV新建窗口显示,也可以画到图片控件中去。
    而使用手机摄像头,就不行,手机是安卓手机,用DroidCamApp使用蓝牙传输视频。在调试时应该是捕捉不到视频。
      

  3.   


    为测试这个功能, 使用的是最简化的代码,过程是这样的,1、新建一个基于对话框的MFC应用程序,上面加上一个BUTTON.
    2,如果不使用多线程,在BUTTON的CLICK消息中处理的代码就是ShowImage中的代码,这样无论测试哪个摄像头还是两个一起打开,都没问题,只是这样如果在图片控件显示视频时,其它控件没响应。
    3、如果使用多线程来处理,代码就是上面那些,这样处理内置摄像头没问题,可以如代码所示由OPENCV新建窗口显示,也可以画到图片控件中去。
    而使用手机摄像头,就不行,手机是安卓手机,用DroidCamApp使用蓝牙传输视频。在调试时应该是捕捉不到视频。
    那我再提两点:
    1、内置摄像头没有问题,手机的就有问题,那我是不是可以怀疑这两个硬件之间是不一样的啊!是不是硬件有问题啊?
    2、你能确定蓝牙传过来的视频是OK的吗?可以这样式一下,蓝牙传过来的也应该是一帧一帧的图片吧!你可以截下几个看看是否正确。
      

  4.   

    测试了一下USB外置摄像头,结果还是一样,后来在主线程中定义一个VideoCapture(1)对象,通过参数传到新的线程中去,竟然可以了。就是内置摄像头可以在多线程中使用,而外置的就不能。真是奇怪,谁能解解释一下吗。void ShowVideoA(cv::VideoCapture *cap)
    {
    cv::Mat frame;
    while (1)
    {
    cap->read(frame);
    cv::imshow ("ee",frame);
    cv::waitKey (20);
    }
    }cv::VideoCapture cap(2);void CIplCaptureMTDlg::OnBnClickedButton2()
    {
    // TODO: Add your control notification handler code here
    pThread=CreateThread(NULL,
    0,
    (LPTHREAD_START_ROUTINE)ShowVideoA,
    &cap,
    0,
    &ThreadID);}