[英]QImage corrupts with OpenCV
我有一个Qt和OpenCV的网络摄像头演示。 基本上,它将显示网络摄像头的提要,并且当单击按钮时,它将以一个长线程(三十五秒)启动一个线程。
问题是,当我单击该按钮时,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);
}
答案来自Evgeniy:QImage不拥有数据,也不像该答案所示那样模仿STL容器。
我会将这段代码用于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;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.