【问题标题】:How to flip image from QCamera?如何从 QCamera 翻转图像?
【发布时间】:2021-04-02 20:43:24
【问题描述】:

在 QT Creator 中,我们如何从相机中获取图像。我用谷歌搜索了很多,但没有找到合适的解决方案。 以下是我的代码。

mCamera = new QCamera;
    mViewfinder = new QCameraViewfinder;
    mLayout = new QVBoxLayout(ui->graphicsView);
    mLayout->addWidget(mViewfinder);
    mCamera->setViewfinder(mViewfinder);
    mViewfinder->show();
    mCamera->start();

我在 QCamera 的构造函数参数中尝试了 QCamera::FrontFace 和 QCamera::BackFace,如下所示

mCamera = new QCamera(QCamera::FrontFace);

mCamera = new QCamera(QCamera::BackFace );

但两者没有区别。 在 Python 中

video=cv2.flip(self.frame,1)

会解决问题, 任何想法如何解决这个.. 我正在使用 Windows 10

【问题讨论】:

  • 你也在使用 OpenCV?

标签: c++ qcamera


【解决方案1】:

QCamera::FrontFaceQCamera::BackFace 只是相机的positions。为了达到你想要的效果,你应该翻转每张图片。

创建 QCameraImageCapture 并连接到它的 imageCaptured() 信号。

auto imageCapture = new QCameraImageCapture( mCamera );
connect(imageCapture, &QCameraImageCapture::imageCaptured, [&](int id, const QImage &preview){
    QImage flipped = preview.mirrored();
    // do what you want with flipped image
})

Documentation 表示 mirrored(bool Horizo​​ntal = false, bool vertical = true)

返回图像的镜像,在水平和/或垂直方向上镜像,具体取决于水平和垂直设置为真还是假。

更新:

我找到了相机并测试了代码,然后意识到我忘记了一件重要的事情。您需要使用 QCameraImageCapture 将捕获图像的计时器。

创建QTimer并连接到QTimer::timeout()信号:

connect (&timer, &QTimer::timeout, [&](){
    camera->searchAndLock();
    imageCapture->capture();
    camera->unlock();
});

然后启动计时器。要显示翻转的图像,您可以使用带有label->setPixmap(QPixmap::fromImage(flipped)) 方法的 QLabel 类。

【讨论】:

  • 我根据您的回答更改了代码,但显示的 graphicsView 项目中没有任何内容。我编辑了我的答案并添加了您的代码..
  • mCamera 可用吗?启动后检查其状态。您也可以尝试连接到 errorOccurred() 信号。不幸的是,现在我没有相机可以测试。但我认为问题在于 QCamera 初始化。尝试使用QCameraInfo::availableCameras() 加载相机并使用其中一个。另外,尝试将mCamera->start() 移动到函数的末尾。
  • 我正在使用我的膝上网络摄像头,它没有问题,现在它也适用于我的旧代码。
  • 我更新了答案并在我找到的相机上进行了测试。
  • 我用标签小部件 (videoFrame) 更新了我的代码,并按照你说的做了。但没有运气,我的问题已更新为新代码。对吗?
【解决方案2】:

嘿,我根据@Allocse 的回答更改了我的代码及其对我的工作 我的完整代码将是

mCamera = new QCamera;
    mCamera->start();
    imageCapture = new QCameraImageCapture( mCamera );
    connect (&timer, &QTimer::timeout, [&](){
    mCamera->searchAndLock();
    imageCapture->capture();
    mCamera->unlock();
    });
    connect(imageCapture, &QCameraImageCapture::imageCaptured, [&](int id, const QImage &preview){
    QImage flipped = preview.mirrored(true,false);

    ui->videoFrame->setPixmap(QPixmap::fromImage(flipped));
    });
     timer.start();

注意:-mCamera 和 imageCapture 应该在类声明中声明

【讨论】:

    猜你喜欢
    • 2022-11-30
    • 2017-06-24
    • 1970-01-01
    • 2021-02-08
    • 2011-08-02
    • 2011-03-01
    • 2021-11-29
    • 1970-01-01
    相关资源
    最近更新 更多