在Qt中制作视频

时间:2014-04-30 05:02:47

标签: c++ qt opencv

This is the parent window, here I have a button 'select video', when I click the button(which is having the label 'select video from webcam') it will capture video from web-came. But the parent window is covering the video which is currently playing, or video which is playing currently is behind the parent window 我正在做一个关于人脸识别的项目。 Qt用于创建前端。

当我点击按钮(其标签为“从网络摄像头中选择视频”)时,它将从网络摄像头捕获视频,但它不可见。在该意义上不可见,父窗口覆盖当前正在播放的视频,或者当前正在播放的视频在父窗口后面。我应该怎么做才能在所有父窗口前面,直到视频结束。

void admin_db_creation::on_pushButton_3_clicked()
  {
capture = cvCaptureFromCAM(0);
    if(!capture)
        {
            cout<<"Could not initialize capturing..."<<endl;
        }
    while(1)
        {
            frame2 = cvQueryFrame(capture);
            frame3=detectFace(frame2);
            imshow("window", frame2);
            char key = cvWaitKey(10);
                if (key == 27)
                        break;
        }
 }

这是按钮点击代码,它包含播放视频的代码..

2 个答案:

答案 0 :(得分:6)

问题是你正在混合事件循环。

Qt提供自己的事件循环来处理所有系统事件,包括鼠标和键盘。 当您使用char key = cvWaitKey(10);时,您将创建另一个由OpenCV提供的事件循环,仅用于测试目的。

这是Qt代码所以使用这个不定式循环(对于Qt它是不定式的),创建一个插槽,它将获取单个帧并处理它(显示它)并使用QTimer重复调用它({{1信号)。 忘掉OpenCv的UI功能。从OpenCv只使用图像处理功能,没有别的。

这是类似的problem。并且here is something that may be also useful用于此主题。

答案 1 :(得分:2)

首先,将您的图片从cv::Mat转换为QImage。然后在GUI上使用QLabel显示它。忘了OpenCV highgui模块,它不会与Qt GUI相处!

1)转换示例:

// Mat __cvFrame is your OpenCV image, 
QImage __frame; 
if (__cvframe.channels()==3)
{
   Mat __cvRGBframe;
   cvtColor(__cvframe,__cvRGBframe,CV_BGR2RGB);
   __frame = QImage((const unsigned char*)(__cvRGBframe.data),
               __cvRGBframe.cols,__cvRGBframe.rows,QImage::Format_RGB888);
}
else
{
   __frame = QImage((const unsigned char*)(__cvframe.data),
                         __cvframe.cols,__cvframe.rows,QImage::Format_Indexed8);
}

2)将您的QImage放到QLabel上:

// QLabel* label has to exist in your GUI :)
label->setPixmap(QPixmap::fromImage(__frame));
label->setScaledContents(true);