void Widget::on_stop_video_btn_clicked() { // timer->stop();//停止更新画面 // cam->release();//释放摄像头 QString fileName = QFileDialog::getSaveFileName(this, tr("Save Video"), ".", tr("Video Files (*.avi *.mp4)")); 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格式 QByteArray imageData((const char*)frame->data, frame->cols * frame->rows * frame->elemSize()); // imag->loadFromData(imageData, frame->cols, frame->rows, QImage::Format_RGB888); ui->captrue_lab->setPixmap(QPixmap::fromImage(*imag));//将图片显示到label上 qApp->processEvents();//处理UI事件 writer.write(*frame); } } }这段代码中出现error: 'writer' was not declared in this scope if (writer.isOpened())
时间: 2023-06-26 13:04:38 浏览: 60
这个错误是因为在if语句块中,你定义了一个VideoWriter对象writer,但是在if语句块外部,writer并没有被声明,所以编译器无法找到它。
为了解决这个问题,你可以在if语句块之前声明一个VideoWriter对象,这样就可以在整个函数中使用它了。例如:
```
void Widget::on_stop_video_btn_clicked() {
QString fileName = QFileDialog::getSaveFileName(this, tr("Save Video"), ".", tr("Video Files (*.avi *.mp4)"));
int codec = cv::VideoWriter::fourcc('M', 'J', 'P', 'G');
double fps = 30;
cv::VideoWriter writer;
if (!fileName.isEmpty())
{
writer = cv::VideoWriter(fileName.toStdString(), codec, fps, frame->size(), true);
}
if (writer.isOpened())
{
// rest of your code...
}
}
```
在这个例子中,我们在函数开始时声明了一个VideoWriter对象writer,并且在if语句块中给它赋值。这样就可以避免在if语句块之外使用未声明的对象的问题。