QImage使用OpenCV腐败

QImage corrupts with OpenCV

本文关键字:腐败 OpenCV 使用 QImage      更新时间:2023-10-16

我有一个带有Qt和OpenCV的网络摄像头演示。基本上,它会显示网络摄像头的提要,当点击按钮时,它会启动一个长线程(3-5秒)。

问题是,当我点击按钮时,QImage立即损坏,正如你在这里看到的那样,我再也看不到视频源了。信号&插槽可以工作(我在控制台中看到输出),但我无法在这里发现问题。

有人能帮忙吗?

window::window() : QMainWindow(NULL, 0)
{
    std::cout << "constructor start" << std::endl;
    setWindowTitle("Video");
    button = new QPushButton("Long Job");
    connect(button, SIGNAL(clicked()), this, SLOT(longjob()));
    image = new QLabel();
    image->setAlignment(Qt::AlignCenter);
    layout = new QVBoxLayout();
    layout->addWidget(image);
    layout->addWidget(button);
    mainwidget = new QWidget();
    mainwidget->setLayout(layout);
    resize(800, 600);
    setCentralWidget(mainwidget);
    cap = cv::VideoCapture(0);
    timer = new QTimer();
    timer->setInterval(100);
    timer->start();
    connect(timer, SIGNAL(timeout()), this, SLOT(newframe()));
    std::cout << "constructor end" << std::endl;
}
void window::newframe()
{
    std::cout << "FRAME " << count++ << std::endl;
    cv::Mat frame;
    cap >> frame;
    image->setPixmap(QPixmap::fromImage(showImage(frame))); // converts perfectly
}
void window::longjob()
{
    std::cout << "START THREAD" << std::endl;
    w = new worker();
    connect(w, SIGNAL(resultReady(double)), this, SLOT(detected(double)));
    w->start();
    return;
}
void window::detected(double d)
{
    disconnect(w, SIGNAL(resultReady(double)), this, SLOT(detected(double)));
    std::cout << "DETECTED " << d << std::endl;
    delete w;
    frames.clear();
}
class worker : public QThread
{
    Q_OBJECT
public:
    worker();
    ~worker();
    void run() Q_DECL_OVERRIDE;
signals:
    void resultReady(double d);
};
worker::worker() : QThread()
{
}
worker::~worker()
{
    std::cout << "THREAD EXIT" << std::endl;
}
void worker::run()  
{
    std::cout << "THREAD RUN" << std::endl;
    double d = longOpenCVJob();
    emit resultReady(d);
}

我会将此代码用于showImage():

QImage window::showImage(cv::Mat mat)
{
  cv::Mat tmp;
  mat.convertTo(tmp, CV_8U);
  cvtColor(tmp, tmp, CV_BGR2RGB);
  QImage img = QImage((const unsigned char *)(tmp.data), tmp.cols, tmp.rows, tmp.step, QImage::Format_RGB888);
  return img;
}