【问题标题】:Qt+ OpenCV video doesn't show on Qt Gui, but does in OpenCV show applicationQt+ OpenCV 视频不在 Qt Gui 上显示,但在 OpenCV 显示应用程序中显示
【发布时间】:2012-02-20 13:53:54
【问题描述】:

我附上了我的部分代码,

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "colorrecognition.h"


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

ui->setupUi(this);
//this->setStyleSheet("background-color: black;"); // set the background
//capture = 0;
// frame = 0;


//interface
//tabWidget = new QTabWidget;



//start capturing a video
//capture = cvCaptureFromCAM(0);
//capture = cvCaptureFromAVI("videoExample.avi");




//frame = cvQueryFrame(capture);

tabWidget = new QTabWidget(ui->centralWidget);
tabWidget->setObjectName(QString::fromUtf8("tabWidget"));
tabWidget->setGeometry(QRect(20, 0, 801, 571));
tabWidget->addTab(new ColorRecognition(), tr("Color Recognition"));

Contour contour1;



}


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


//========================================================


ColorRecognition::ColorRecognition(QWidget *parent){

storage1 = cvCreateMemStorage(0);

storage2 = cvCreateMemStorage(0);

 /*QFrame* frame1 = new QFrame(this);
 frame1->setObjectName(QString::fromUtf8("frame1"));
 frame1->setGeometry(QRect(20, 20, 761, 501));
 frame1->setFrameShape(QFrame::StyledPanel);
 frame1->setFrameShadow(QFrame::Raised);*/

 //start capturing a video
 capture = cvCaptureFromCAM(0);
 //capture = cvCaptureFromAVI("videoExample.avi");

 //print an error message in case you can't grab the frame
 if (!cvGrabFrame(capture)) { // capture a frame
         printf("couldn't grab a frame");
 }


 //First screen --- Color Identification ---

//QObject::connect(ui->tabWidget, SIGNAL(currentChanged(int)), this, SLOT(color_Recoginition()));


 //set timer for 50ms intervals

 QTimer* m_timer = new QTimer(this);

 connect(m_timer, SIGNAL(timeout()), this, SLOT(color()));

 m_timer->start(100);
}

    void ColorRecognition::paintEvent(QPaintEvent* e) {

    QPainter painter(this);

    painter.drawImage(10,10, qt_img);
}



void ColorRecognition::color(){

   frame = cvQueryFrame(capture);

   //CvSize imageSize = cvSize(frame->width,frame->height);

  //IplImage* resultImage = cvCreateImage(imageSize, 8, 3);

  //qDebug("Befroe manipulation");

  cvCvtColor(frame, frame, CV_BGR2RGB);

//CvSize imageSize = cvSize(frame->width, frame->height);

IplImage  **thresholdedImage = contour1.GetThresholdedImage(frame);

//insert the resulted frame from the above function into the find contour function

cvFindContours(thresholdedImage[0], storage1, &contours1, sizeof(CvContour),
            CV_RETR_EXTERNAL, CV_CHAIN_APPROX_SIMPLE, cvPoint(0, 0));

cvFindContours(thresholdedImage[1], storage2, &contours2, sizeof(CvContour),
            CV_RETR_EXTERNAL, CV_CHAIN_APPROX_SIMPLE, cvPoint(0, 0));

contour1.drawContour(contours1, storage1, frame, CV_RGB(255, 0, 0));

contour1.drawContour(contours2, storage2, frame, CV_RGB(0, 255, 0));


qt_img = QImage((unsigned char *)frame->imageDataOrigin,frame->width,frame->height,QImage::Format_RGB888);


    //release temp memory

    //cvReleaseMemStorage(&storage1);

    //cvReleaseMemStorage(&storage2);

    //cvReleaseMemStorage(&contours1->storage); // check if that is correct

    //cvReleaseMemStorage(&contours2->storage);*/


//resultImage = contour1.colorIdentification(frame);

//cvCvtColor(resultImage, resultImage, CV_BGR2RGB);

//qDebug("After manipulation");



this->update();

}

问题是,当我运行这段代码时,屏幕上什么也看不到,但是当我在 Qt 中运行代码时(仅在 OpenCV 中),代码运行没有问题

谁能知道这是什么交易?

【问题讨论】:

  • 检查是否正在调用绘制事件,然后检查图像是否为空白 - 尝试在 qt_img 中添加一些随机数据
  • 是的,它被调用是因为当我立即将帧图像从相机传递到 QT 帧时,它会显示在屏幕上.. 我怎么可能尝试添加随机数据?

标签: qt video opencv


【解决方案1】:

所以我发现我的代码出了什么问题,这真是一个愚蠢的错误 -->

我将帧图像立即传递给我已经完成的函数

frame = cvQueryFrame(capture);

所以解决我的问题的方法是将帧图像复制到 IplImage 中,然后它可以完美运行 -->

cvCopy(frame, resultImage);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-02-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-29
    相关资源
    最近更新 更多