Я уже делал преобразование mat в QImage в своем проекте.
static QImage Mat2QImage(const cv::Mat3b &src) {
QImage dest(src.cols, src.rows, QImage::Format_ARGB32);
for (int y = 0; y < src.rows; ++y) {
const cv::Vec3b *srcrow = src[y];
QRgb *destrow = (QRgb*)dest.scanLine(y);
for (int x = 0; x < src.cols; ++x) {
destrow[x] = qRgba(srcrow[x][2], srcrow[x][1], srcrow[x][0], 255);
}
}
return dest;
}
использование может быть таким:
void foo::timeout() // A slot which QTimer's timeout signal is connected to
{
// I didn't tested the code but it should work
Mat frame;
m_cap >> frame;
QImage img = Mat2QImage(frame);
QPixmap pixmap = QPixmap::fromImage(img);
ui->streamDisplay->setPixmap(pixmap);
}
Насколько я помню, изображение Mat должно быть ARGB32. Это было сработано на скорости 30 кадров в секунду.
Я слышал, что наилучшим эффективным решением является использование QOpenglWidget, но я не знаю, как реализовать такую же функциональность. Может быть, вы можете посмотреть.
моя старая ссылка на репо
display-code- cpp
изображения conversion- cpp