void Widget::on_open_video_btn_clicked() { cam->open(0);//打开摄像头,从摄像头中获取视频 timer->start(30); //每30ms更新一次画面 QString fileName = QFileDialog::getSaveFileName(this, tr("Save Video"), ".", tr("Video Files (*.avi)")); if (!fileName.isEmpty()) { int codec = cv::VideoWriter::fourcc('M', 'J', 'P', 'G');//设置视频编码格式 double fps = 30;//设置视频帧率 cv::VideoWriter writer(fileName.toStdString(), codec, fps, frame->size(), true);//创建VideoWriter对象 if (writer.isOpened()) { timer->stop();//停止更新画面 cam->release();//释放摄像头 while (true) //写入视频帧 { (*cam) >> (*frame);//继续读取下一帧 if(frame->empty()) { break;//如果没有帧,则退出循环 } cv::cvtColor(*frame,*frame,cv::COLOR_BGR2RGB);//转化为Qt的RGB格式 imag->load((uchar)frame->data,frame->cols,frame->rows,QImage::Format_RGB888);//将Mat类型转换成QImage类型 ui->label->setPixmap(QPixmap::fromImage(*imag));//将图片显示到label上 qApp->processEvents();//处理UI事件 writer.write(*frame); } } } } error: no matching function for call to 'QImage::load(uchar, int&, int&, QImage::Format)'
时间: 2023-06-27 07:01:11 浏览: 158
这个错误是因为`QImage::load()`函数的第一个参数需要传入一个指向图像数据的指针,而你传递的是一个单独的uchar类型的数据。你需要将这个uchar类型的数据转换成指向图像数据的指针。可以使用`QByteArray`或者`std::vector`来存储图像数据。
例如,可以将以下代码:
```
imag->load((uchar)frame->data,frame->cols,frame->rows,QImage::Format_RGB888);
```
改为:
```
QByteArray imageData((const char*)frame->data, frame->cols * frame->rows * frame->elemSize());
imag->loadFromData(imageData, frame->cols, frame->rows, QImage::Format_RGB888);
```
或者:
```
std::vector<uchar> imageData(frame->data, frame->data + frame->cols * frame->rows * frame->elemSize());
imag->loadFromData(imageData.data(), frame->cols, frame->rows, QImage::Format_RGB888);
```
相关问题
#include "widget.h" #include "ui_widget.h" #include <QTime> Widget::Widget(QWidget *parent) : QWidget(parent) , ui(new Ui::Widget) { ui->setupUi(this); //显示系统时间 //实例化对象 this->timer=new QTimer(this); QString curtime=QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss"); //信号和槽函数关联 connect(this->timer,&QTimer::timeout,this,&Widget::update_time); //启动定时器 this->timer->start(1000); //启动计时器 this->count=0; //实例化对象 this->timer2=new QTimer(this); //信号和槽函数关联 connect(this->timer2,&QTimer::timeout,this,&Widget::update_time2); //开始计时 this->timer2->start(1000); } Widget::~Widget() { delete ui; } void Widget::on_home_btn_clicked() { //首页 } void Widget::on_per_btn_clicked() { //上一页 } void Widget::on_next_btn_clicked() { //下一页 } void Widget::on_last_btn_clicked() { //尾页 } void Widget::update_time() { //获取系统时间 QString curtime=QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss"); //显示 this->ui->time_lab->setText(curtime); } void Widget::update_time2() { //计时 this->count++; QTime time(0,0,0,0); //QTime转换成QString QString sec=time.addSecs(this->count).toString("mm:ss"); //更新到LCDNumber显示 this->ui->lcdNumber->display(sec); }增加代码使用QStringList实现电子相册
在Widget类中添加一个QStringList成员变量,用于存储相册中的图片路径:
```c++
private:
Ui::Widget *ui;
QTimer *timer; //系统时间定时器
QTimer *timer2; //计时器
int count; //计时器计数器
QStringList photoList; //相册中的图片路径
```
在Widget类的构造函数中初始化photoList:
```c++
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
//显示系统时间
//实例化对象
this->timer=new QTimer(this);
QString curtime=QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss");
//信号和槽函数关联
connect(this->timer,&QTimer::timeout,this,&Widget::update_time);
//启动定时器
this->timer->start(1000);
//启动计时器
this->count=0;
//实例化对象
this->timer2=new QTimer(this);
//信号和槽函数关联
connect(this->timer2,&QTimer::timeout,this,&Widget::update_time2);
//开始计时
this->timer2->start(1000);
//初始化相册图片路径
this->photoList.append(":/images/photo1.jpg");
this->photoList.append(":/images/photo2.jpg");
this->photoList.append(":/images/photo3.jpg");
this->photoList.append(":/images/photo4.jpg");
this->photoList.append(":/images/photo5.jpg");
this->photoList.append(":/images/photo6.jpg");
}
```
在Widget类的头文件中添加一个私有函数showNextPhoto(),用于显示相册中的下一张照片:
```c++
private:
void showNextPhoto();
```
在showNextPhoto()函数中,使用QPixmap加载相册中的下一张照片,并显示在QLabel控件中:
```c++
void Widget::showNextPhoto()
{
static int index = 0;
if (index >= this->photoList.size()) {
index = 0;
}
QPixmap pixmap(this->photoList.at(index));
this->ui->photo_label->setPixmap(pixmap.scaled(this->ui->photo_label->size(), Qt::KeepAspectRatio));
index++;
}
```
在Widget类的头文件中添加一个私有槽函数on_show_btn_clicked(),用于处理“显示”按钮的点击事件。在该槽函数中调用showNextPhoto()函数显示相册中的下一张照片:
```c++
private slots:
void on_show_btn_clicked();
```
在Widget类的源文件中实现on_show_btn_clicked()槽函数:
```c++
void Widget::on_show_btn_clicked()
{
this->showNextPhoto();
}
```
最后,在widget.ui文件中添加一个QLabel控件用于显示相册中的照片,并添加一个QPushButton控件用于触发显示操作。将QPushButton控件的clicked()信号与Widget类的on_show_btn_clicked()槽函数关联,即可实现电子相册的功能。
//选择视频 void Widget::on_choose_btn_clicked() { //获取视频的完整路径 // QString str="D:\Qt\Qt5.12.12\QT\QT_project\output.avi"; //QString path = "D:\Qt\Qt5.12.12\QT\QT_project\output.avi"; QString path = QFileDialog::getOpenFileName(nullptr, "Open Image", QDir::homePath(), "Images (*.avi *.mp4 *.wmv)"); //加载资源文件 this->player->setMedia(QMediaContent(QUrl(path))); //设置画面的输出 this->player->setVideoOutput(video_widget); // 将视频画面输出到pictrue_lab } //开始播放 void Widget::on_start_play_btn_clicked() { //播放视频 this->player->play(); //播放滑块的初始值 this->ui->slider->setValue(0); //启动定时器 this->timer->start(1000); }点击播放不显示画面
可能是因为视频播放器没有正确的配置。请尝试以下步骤:
1. 确认视频文件的路径是否正确,可以在打开文件对话框中选择视频文件并获取其完整路径。
2. 确认视频文件的格式是否被支持,可以查看视频文件的扩展名是否在支持的列表中(如 .avi, .mp4, .wmv)。
3. 确认视频播放器的输出是否正确设置。可以尝试将视频画面输出到其他窗口或控件上,比如主窗口或一个 QLabel 控件上,看是否能够正常显示。
4. 确认视频播放器相关的库是否正确导入。比如如果是使用 Qt 自带的 QMediaPlayer 组件,需要在项目文件中添加对 multimedia 模块的依赖。
如果以上步骤都无法解决问题,请提供更多代码和错误信息,以便更好地定位问题所在。
阅读全文