我正在做一个关于人脸识别的项目。 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;
}
}
这是按钮点击代码,它包含播放视频的代码..
答案 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);