我想在qt应用程序(OS Linux)中显示连接到树莓的相机的实时流。谷歌搜索之后,我发现我必须在QLabel中显示视频。当显示图像时没有问题,一切正常,但是当我想在QLabel中显示实时流时,实时流窗口将单独打开(不在QLabel内部)。你能告诉我如何解决这个问题吗?这是我的代码:
void Dialog::on_Preview_clicked()
{
command = "raspistill";
args<<"-o"<<"/home/pi/Pictures/Preview/"+Date1.currentDateTime().toString()+".jpg"<<"-t"<<QString::number(20000);
Pic.start(command,args,QIODevice::ReadOnly);
QPixmap pix("//home//pi//Pictures//Preview//test.jpg");
ui->label_2->setPixmap(pix);
ui->label_2->setScaledContents(true);
}
此代码将打开视频捕获屏幕,并在20秒后捕获图像。唯一的问题是捕获屏幕(可以用作实时流)。没有显示在“标签_2”中。无论如何,不使用OpenCV库就可以做到这一点吗?如果没有,请告诉我如何使用OpenCV。
谢谢
答案 0 :(得分:0)
在opencv中非常简单
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <iostream>
using namespace cv;
using namespace std;
int main( int argc, char** argv )
{
VideoCapture cap(0); // open the default camera
if(!cap.isOpened()) // check if we succeeded
return -1;
Mat edges;
namedWindow("edges",1);
for(;;)
{
Mat frame;
cap >> frame; // get a new frame from camera
imshow("edges", frame);
if(waitKey(30) >= 0) break;
}
return 0;
}
答案 1 :(得分:0)
使用OpenCV
流式传输相机,并以QLabel
进行显示。
如果QCamera无法正常工作,并且在项目中也使用OpenCV,则可以使用VideoCapture
代替QCamera来流式传输视频。
该问题可以分解为几个步骤。基本上,我们需要:
QThread
进行流传输(不要阻止GUI线程)。cv::VideoCapture
将帧捕获到cv::Mat
中。cv::Mat
转换为QImage
(how to convert an opencv cv::Mat to qimage)。QImage
帧从子线程传递到主GUI线程。QImage
上绘制QLabel
。我将完整的演示代码放在Github中。可以在QLabel
和QML VideoOutput
上绘制边框。