我在NVIDIA Jetson TX1 ARM开发套件上运行Linux 4.4。我使用Qt Boot2Qt Yocto系统构建了我的系统,该系统产生Qt 5.11。
我有一个小型Qt5应用程序,它使用OpenCV 3.3从TX1的板载CSI摄像机成功捕获视频。它如下所示:
std::string get_tegra_pipeline(int width, int height, int fps) {
return "nvcamerasrc ! video/x-raw(memory:NVMM), width=(int)" + std::to_string(width) + ", height=(int)" +
std::to_string(height) + ", format=(string)I420, framerate=(fraction)" + std::to_string(fps) +
"/1 ! nvvidconv flip-method=0 ! video/x-raw, format=(string)BGRx ! videoconvert ! video/x-raw, format=(string)BGR ! appsink";
}
...
// Define the gstream pipeline for CSI
std::string pipelineCSI = get_tegra_pipeline(WIDTH, HEIGHT, FPS);
std::cout << "Using pipeline: \n\t" << pipelineCSI << "\n";
// Create OpenCV CSI capture object, ensure it works.
m_VLCapture = cv::VideoCapture(pipelineCSI, cv::CAP_GSTREAMER);
if (!m_VLCapture.isOpened()) {
std::cout << "CSI Connection failed";
}
然后我可以捕获并显示我的QGraphicsScene上的帧,如下所示:
cv::Mat vlFrame;
m_VLCapture >> vlFrame; // Get a new frame from camera
m_VLPixmap = QPixmap::fromImage(QImage((unsigned char*)vlFrame.data,vlFrame.cols,vlFrame.rows,QImage::Format_RGB888).rgbSwapped().scaled(m_AppSize,Qt::IgnoreAspectRatio,Qt::SmoothTransformation));
m_VL->setPixmap(m_VLPixmap);
此操作大约需要5毫秒,我需要它更快。
我不想使用cv :: Mat创建QImage和QPixmap,而是使用QCamera直接捕获到我可以直接显示的QVideoFrame。
我一直在阅读QCamera文档并搜索示例,但我看不出如何配置QMultimedia gstreamer后端以使用NVIDIA gstreamer实现。
这个错误似乎表明它不可能: https://bugreports.qt.io/browse/QTBUG-49357
如何为QCamera捕获会话配置gstreamer管道?感谢。