c++ - QImage 使用 OpenCV 损坏

标签 c++ qt opencv

<分区>

我有一个使用 Qt 和 OpenCV 的网络摄像头演示。基本上它会显示网络摄像头的提要,当单击按钮时,它会启动一个长线程(三到五秒)的线程。

问题是 QImage 立即损坏了 as you can see here当我单击按钮时,我再也看不到视频源了。信号和插槽工作(我在控制台中看到输出),但我无法在此处发现问题。

有人能帮忙吗?

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;
}

关于c++ - QImage 使用 OpenCV 损坏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37227990/

相关文章:

c++ - 是否有一些方法可以使 c++ 类中的一个函数在不同的线程中运行

c++ - 捕捉 c++ "Access Violation Writing Exception"?

python - Qt 使用 CSS 给对象上色?还有另一种方法可以解决这个问题吗?

python - SJ4000 + OpenCV + Raspberry Pi 图像处理

image-processing - 有没有办法检测图像是否模糊?

c++ - 特征行 vector 超出范围会产生 “Run-Time Check Failure #2 - Stack around the variable X was corrupted”

c++ - Android C++ 手势代码

c++ - ImageMagick 使用 qt ans magick++ 打开和写入图像

qt - QDialog : how to use question mark (?)按钮?

python - 使用 OpenCV 重映射功能裁剪图像