我正在开发一个项目,使用opencv对来自android usb摄像头的视频流进行一些图像处理。由于我不太擅长java,所以我决定在android上使用带有opencv-android-sdk的Qt。我使用 libuvc 示例在 android 上获取我的视频流:https
uvc_start_streaming(mDeviceHandle, &ctrl, cb, user_ptr, 0);
://github.com/ktossell/libuvc/blob/master/src/example.c
我的 uvc 代码:
uvc_start_streaming(mDeviceHandle, &ctrl, cb, user_ptr, 0);
sleep(10);/* stream for 10 seconds */
uvc_stop_streaming(mDeviceHandle);
cb 是 uvc_start_streaming 的回调函数,也是我放置 opencv 图像处理代码的地方,我还尝试在此函数中更新 Qt GUI 小部件。这是我的 cb 功能:
void cb(uvc_frame_t *frame, void *ptr) {
Mat img(480,640,CV_8UC3,frame->data,1280);
//some image process here
w->updatePreview(img);
}
w 是一个 qt Mainwindow 和我在 mainwinow 中的 updatePreview 函数:
void MainWindow::updatePreview(Mat imgPreview)
{
mpImageLabel->setPixmap(QPixmap::fromImage(Mat2QImage(imgPreview)));
}
我的例外是在 mpImageLabel 中看到来自我的 USB 摄像头的实时视频,但实际上只有最后一帧 uvc 流显示在 mpImageLabel 中,其他时候 mpImageLabel 都是空白的。我猜 gui 更新功能在 uvc 流期间挂断时间。我搜索了一段时间并尝试了 qApp->processEvent 方法,但根本不起作用。对此有什么想法吗?