【问题标题】:qml change the resolution before camera image captureqml 在相机图像捕获之前更改分辨率
【发布时间】:2016-11-23 06:08:35
【问题描述】:

我想以特定分辨率捕获图像。 我使用了这段代码,但是从相机以最后一个分辨率捕获的图像,并且捕获的图像的分辨率不会更改为大小(1280、720)。我想在拍摄图像之前更改分辨率。

imageCapture {
 resolution: Qt.size(1280, 720)
 onImageCaptured: {
 photoPreview.source = preview  
 }

【问题讨论】:

  • 最后的分辨率是多少?这是否意味着您在捕获图像之前更改分辨率?请发布适当的代码。

标签: qt camera qml


【解决方案1】:

在许多情况下,QML Camera 的行为很奇怪,并且一些依赖关系没有得到很好的记录(但是)。

无论如何,以下代码对我有用:

import QtQuick 2.6
import QtQuick.Window 2.2
import QtQuick.Layouts 1.3
import QtQuick.Controls 1.4
import QtMultimedia 5.6

Window {
    visible: true

    width: 1280
    height: 960

    GridLayout {
        id: grid
        rows: 2
        columns: 2

        Item {
            Layout.row: 0
            Layout.column: 0
            Layout.minimumWidth: 80
            Layout.minimumHeight: 30

            Button {
                id: button
                text: "capture"
                onClicked: {
                    camera.stop();
                    camera.viewfinder.resolution = "640x480";
                    camera.start();
                }
            }
        }

        Camera {
            id: camera
            captureMode: Camera.CaptureViewfinder

            viewfinder.resolution: "160x120"

            imageCapture {
                id: cameracapture

                onImageCaptured: {
                    photoPreview.source = preview  // Show the preview in an Image
                    console.log( "capture size: ", photoPreview.sourceSize );
                    timerHelper.restart();
                }

            }

            onCameraStateChanged: {
                console.log("camera state changed to: ", cameraState );
                if ( cameraState == Camera.ActiveState && viewfinder.resolution == Qt.size(640,480) ) {
                    cameracapture.capture();
                }
            }

            function cameraHelper() {
                console.log( "Stopping cam..." );
                camera.stop();
                viewfinder.resolution = "160x120";
                camera.start();
            }
        }

        Timer {
            id: timerHelper
            interval: 1
            onTriggered: camera.cameraHelper();
        }

        Item {
            width: 640
            height: 480

            Layout.row: 1
            Layout.column: 0
            Layout.minimumWidth: 640
            Layout.minimumHeight: 480

            Image {

                width: 640
                height: 480

                id: photoPreview
            }
        }

        Item {
            width: 640
            height: 480

            Layout.row: 1
            Layout.column: 1
            Layout.minimumWidth: 640
            Layout.minimumHeight: 480

            VideoOutput {
                source: camera
                anchors.fill: parent
                focus : visible // to receive focus and capture key events when visible
            }
        }
    }
}

如果你想成功切换分辨率,你必须stop()start()Camera

如果您尝试在onImageCaptured 中将分辨率切换回(160,120),则会冻结,所以我使用Timer 来获得某种QueuedConnection

【讨论】:

    【解决方案2】:

    在我的案例代码中: camera.stop(); camera.viewfinder.resolution = "640x480"; camera.start();

    不起作用。当 start() 调用我有错误: CameraBin 错误:“设备 '/dev/video0' 正忙” CameraBin 错误:“无法协商格式” 看起来我自己的应用程序没有释放设备,我无法更改分辨率。 在我的情况下,解决方案是在调用start() 之前添加camera.setCameraState(Camera.UnloadedState)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-30
      • 1970-01-01
      • 2016-09-13
      • 1970-01-01
      • 2010-09-06
      • 2013-03-28
      相关资源
      最近更新 更多