Opencv Videowriter не может писать, как показывает imshow - PullRequest
0 голосов
/ 01 декабря 2018

Я создал программу для генерации видео с движущейся прямоугольной формой на фоновом изображении.Скорость этой формы определяется функцией таймера.Я получаю правильный вывод, как видно из imshow.Но у меня две проблемы:

  1. Если я увеличу скорость, я не смогу ее уменьшить.Я могу увеличить его еще больше, но не могу уменьшить.
  2. Когда я пытаюсь записать видео с использованием videowriter, оно пропускает кадры.Когда я пытаюсь уменьшить частоту кадров, она несколько улучшается.Есть ли способ сохранить точно так, как я вижу, как в imshow?

Я использую QT в Linux.Мой код:

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{

  sprintf(filenameImg,"/home/Workspace/TestVideoMaker/BackImages/7.jpg");


ui->setupUi(this);
imageBack= imread(filenameImg);
outputVideo.open("outcpp.avi",CV_FOURCC('M','J','P','G'),24,Size(imageBack.cols,imageBack.rows),true);
}

void MainWindow::on_pushButton_Generate_clicked()
{

initialX=MainWindowPtr->ui->lineEdit_initialX->text().toInt();
initialY=MainWindowPtr->ui->lineEdit_initialY->text().toInt();


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();
intensity=255;
imageBack= imread(filenameImg);  //to load original background repeatedly so that it doesn't show a trail of rectangle
cvtColor(imageBack, imageBack, cv::COLOR_RGB2GRAY);
rectangle(imageBack,Point(initialX,initialY),Point(initialX+widthImg,initialY+heightImg),Scalar(intensity),-1,8,0);

imshow("image",imageBack);
if(initialX>640)
initialX=0;
else
initialX+=2;

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

}

void MainWindow::on_pushButton_stop_clicked()
{
    outputVideo.release();
    timer->stop();
}

void MainWindow::on_pushButton_Record_clicked()
{
 recordFlag=1;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...