【问题标题】:Change speed using timer in QT creator在 QT creator 中使用计时器更改速度
【发布时间】:2019-01-14 06:25:36
【问题描述】:

我正在尝试以直线轨迹在背景图像顶部移动一个矩形框。我在 QT creator 中使用 Qtimer。我正在使用 openCV 与图像进行交互。 为了移动它,我每隔一段时间调用一个generate_video() 函数。

1.) 我想改变矩形移动的速度。为此,我在 QT 中使用了一个名为 horizontalSlider_speed 的水平滑块。基本上,我正在降低调用generate_video() 的时间间隔。当我增加滑块时,我可以提高速度,但即使我将滑块移动到最低,我也可以从较高的速度降低速度。

2.) 我也在使用VideoWriter 录制它。但即使我将 FPS 设置为 120,它也会跳帧。

#include <QTimer>
MainWindow *MainWindowPtr;
using namespace cv;
int heightImg,widthImg,intensity,initialX,initialY,xSin;
int velocity=1;
Mat imageBack,imageObject,frame;
extern void generate_video();
QTimer *timer;
VideoWriter outputVideo;

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
 ui->setupUi(this);
    imageBack= imread(filenameImg);
    outputVideo.open("outcpp.avi",CV_FOURCC('M','J','P','G'),24, 
    Size(imageBack.cols,imageBack.rows));
}

void MainWindow::on_pushButton_Generate_clicked()
{
    QTimer *timer = new QTimer;

    // make the connection using the timer variable
    connect(timer, &QTimer::timeout, this, &generate_video);

    // start the timer object by first dereferencing that object first
    timer->setInterval(100-MainWindowPtr->ui->horizontalSlider_speed->value());

    timer->start();
}

void generate_video()
{
    heightImg = MainWindowPtr->ui->lineEdit_Height->text().toInt();
    widthImg = MainWindowPtr->ui->lineEdit_Width->text().toInt();

imageBack= imread(filenameImg);

    cvtColor(imageBack, imageBack, cv::COLOR_RGB2GRAY);

    //draw rectangular object
    rectangle(imageBack,Point(initialX,initialY),Point(initialX+widthImg,initialY+heightImg),Scalar(intensity),-1,8,0);
    imshow("image",imageBack);

    //line trajectory

    if(initialX>640)
    initialX=0;
    else
    initialX+=2;

    //start recording
    if(recordFlag==1)
    {
        cv::cvtColor(imageBack, frame, cv::COLOR_GRAY2BGR);
        outputVideo.write(frame);
    }

}

void MainWindow::on_pushButton_Record_clicked()
{
 recordFlag=1; //start recording
}

【问题讨论】:

    标签: c++ qt opencv timer


    【解决方案1】:

    太好了,你自己发现了这个错误! :-)

    每次单击“生成”时,您都会创建一个新的QTimer。所有这些计时器都在不断触发,因为没有一个被停止。

    解决方案确实是使用单个计时器,但您可以比您的答案更进一步:

    您只需连接一次(在您的MainWindow 构造函数中)。

    然后,在on_pushButton_Generate_clicked 中,只需将时间间隔设置为当前所需的值并启动计时器。

    如果您使用new QTimer(this) 创建计时器,它会成为您的MainWindowQObject 子代,并在MainWindow 被销毁时自动删除。这可以防止当计时器尝试调用超时槽generate_video() 时可能发生的崩溃,尽管您的MainWindow 已被删除。

    另外,如果你只想播放一次动画,你可以在initialX达到640时停止计时器。

    【讨论】:

      【解决方案2】:

      我通过使用Qtimer disconnect 找到了解决方案。此外,我们不需要在每次按下按钮时都声明它。所以QTimer *timer = new QTimer;应该作为 timer = new QTimer 移动到MainWindow::MainWindow(),因为我们已经将其声明为全局。所以新的代码应该是这样的。

      void MainWindow::on_pushButton_Generate_clicked()
      {
          timer->disconnect();
      
          // make the connection using the timer variable
          connect(timer, &QTimer::timeout, this, &generate_video);
      
          // start the timer object by first dereferencing that object first
          timer->setInterval(100-MainWindowPtr->ui->horizontalSlider_speed->value());
      
          timer->start();
      }
      

      【讨论】:

        猜你喜欢
        • 2012-03-17
        • 2018-11-08
        • 2021-09-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-15
        • 1970-01-01
        • 2012-02-27
        相关资源
        最近更新 更多