Я собираю несколько потоков из ip-камер с помощью OpenCV. Когда я пытаюсь отобразить этот поток из окна OpenCV (cv::namedWindow(...)
), он работает без каких-либо проблем (до сих пор я пробовал до 4 потоков).
Проблема возникает, когда я пытаюсь показать эти потоки внутри виджета Qt. Поскольку захват выполняется в другом потоке, я должен использовать механизм слота сигнала для обновления QWidget (который находится в основном потоке).
В принципе, я испускаю вновь захваченный кадр из потока захвата, и слот в потоке графического интерфейса пользователя ловит его. Когда я открываю 4 потока, я не могу отображать видео плавно, как раньше.
Вот эмиттер:
void capture::start_process() {
m_enable = true;
cv::Mat frame;
while(m_enable) {
if (!m_video_handle->read(frame)) {
break;
}
cv::cvtColor(frame, frame,CV_BGR2RGB);
qDebug() << "FRAME : " << frame.data;
emit image_ready(QImage(frame.data, frame.cols, frame.rows, frame.step, QImage::Format_RGB888));
cv::waitKey(30);
}
}
Это мой слот:
void widget::set_image(QImage image) {
img = image;
qDebug() << "PARAMETER IMAGE: " << image.scanLine(0);
qDebug() << "MEMBER IMAGE: " << img.scanLine(0);
}
Проблема выглядит как накладные расходы на непрерывное копирование QImages. Хотя QImage использует неявное совместное использование, когда я сравниваю указатели данных изображений через сообщения qDebug()
, я вижу разные адреса.
1 Есть ли способ встроить OpenCV-окно непосредственно в QWidget?
2- Каков наиболее эффективный способ обработки нескольких видеороликов? Например, как в системах видеонаблюдения одновременно отображаются до 32 камер?
3- Каким должен быть способ?