2017-04-20 158 views
0

我似乎無法在代碼中發現錯誤。代碼編譯完美我能夠開始視頻,但我無法錄製視頻。使用opencv和Qt的視頻記錄

圖像輸出窗口

視頻文件以所需目錄中創建,但它僅是10kb的。我曾嘗試將four_cc改爲MPEG仍然沒有效果。

#include "camerafeed.h" 
#include "ui_camerafeed.h" 
#include <opencv2/highgui.hpp> 
#include <opencv2/opencv.hpp> 
#include <opencv/cv.h> 

#include <QtCore> 

using namespace cv; 
using namespace std; 
bool recording = false; 



camerafeed::camerafeed(QWidget *parent) : 
    QMainWindow(parent), 
    ui(new Ui::camerafeed) 
{ 
    ui->setupUi(this); 
    cap1.open(0); 

    Starttrigger = new QTimer(this); 
// connect(Starttrigger,SIGNAL(timeout()),this,SLOT(processGui())); 


} 

camerafeed::~camerafeed() 
{ 
    delete ui; 
} 

void camerafeed::processGui() 
{ 
    int fcc = CV_FOURCC('D','I','V','X'); 
    int fps = 20; 

    cap1.read(frame1); 

    Size frameSize(cap1.get(CV_CAP_PROP_FRAME_WIDTH),cap1.get(CV_CAP_PROP_FRAME_HEIGHT)); 
    string filename1 = "D:\\Camera1\\video1.avi"; 
    writer1 = VideoWriter(filename1,fcc,fps,frameSize); 

    bool bSuccess = cap1.read(frame1); 

    if(recording==true) 
    { 
     writer1.write(frame1); 
     putText(frame1,"[REC]",Point(0,30),5,1,Scalar(0,0,225)); 

    } 

    cv::cvtColor(frame1,frame1,CV_BGR2RGB); 

    QImage qframe1((uchar*)frame1.data,frame1.cols,frame1.rows,frame1.step,QImage::Format_RGB888); 

    ui->camera1->setPixmap(QPixmap::fromImage(qframe1)); 
} 

void camerafeed::on_Start_clicked() 
{ 
    Starttrigger->start(20); 
    connect(Starttrigger,SIGNAL(timeout()),this,SLOT(processGui())); 
} 


void camerafeed::on_stop_clicked() 
{ 
    Starttrigger->stop(); 

    recording = false; 
    disconnect(Starttrigger,SIGNAL(timeout()),this,SLOT(processGui())); 

} 

void camerafeed::on_record_clicked() 
{ 
    recording = !recording; 

} 

回答

0

一個代碼的問題是,你是用功能重新啓動視頻對象,我建議你運行它,只有當按下啓動按鈕。爲此,最好創建一個執行此操作的函數。

CameraFeed::CameraFeed(QWidget *parent) : 
    QMainWindow(parent), 
    ui(new Ui::MainWindow) 
{ 
    ui->setupUi(this); 
    isRecorded = false; 
    trigger = new QTimer(this); 
    connect(trigger, &QTimer::timeout, this, &CameraFeed::processGui); 
} 

void CameraFeed::initCamera() 
{ 
    cap.open(0); 
    if(cap.isOpened()) 
    { 
     qDebug() << "Camera successfully connected."; 
    } 
} 

void CameraFeed::initVideo() 
{ 
    std::string filename = "video.avi"; 
    int fcc = CV_FOURCC('D','I','V','X'); 
    int fps = 20; 
    cv::Size frameSize(cap.get(CV_CAP_PROP_FRAME_WIDTH),cap.get(CV_CAP_PROP_FRAME_HEIGHT)); 
    writer = cv::VideoWriter(filename,fcc,fps,frameSize); 
} 

void CameraFeed::processGui() 
{ 
    if(cap.read(frame)){ 
     cv::cvtColor(frame,frame,CV_BGR2RGB); 
     if(isRecorded) 
     { 
      writer.write(frame); 
      cv::putText(frame,"[REC]",cv::Point(0,30),5,1,cv::Scalar(0,0,225)); 
     } 

     QImage qframe((uchar*)frame.data,frame.cols,frame.rows,frame.step,QImage::Format_RGB888); 

     ui->camera1->setPixmap(QPixmap::fromImage(qframe)); 
    } 
} 


void CameraFeed::on_start_clicked() 
{ 
    initCamera(); 
    trigger->start(100); 
} 

void CameraFeed::on_stop_clicked() 
{ 
    if(cap.isOpened()) 
    { 
     // Disconnect camera 
     cap.release(); 
     qDebug() << "Camera successfully disconnected."; 
    } 
    trigger->stop(); 
} 

void CameraFeed::on_record_clicked() 
{ 
    isRecorded = !isRecorded; 
    if(isRecorded) 
     initVideo(); 
} 

完全code

+0

感謝的是解決我的問題,但isRecorded必須是一個全局變量 –

+0

你說的全球平均? – eyllanesc

+0

如果我intialized isRecorded設置我無法在CameraFeed :: on_record_clicked()中訪問它,所以我不得不聲明它在 –