QR扫码综合示例教程(二十二)Qt5.15.2+Qt6.2.1(qml)+opencv4.5.4解决扫码聚焦、闪光灯(多线程、微信扫码)

前言:

因笔者前期设备限制,并没有考虑摄像头聚焦、闪光灯相关,有小伙伴问到相关问题,所以笔者就测试了下。结果有点失望,但仍然共享给小伙伴们,以减少走弯路

本教程是在 Qt5.15.2+Qt6.2.1(qml)+opencv4.5.4实现扫码功能(多线程、微信扫码) 示例的基础上修改

QR扫码综合示例教程(二十一)Qt5.15.2+Qt6.2.1(qml)+opencv4.5.4实现扫码功能(多线程、微信扫码)_aggs1990的专栏-CSDN博客

一、Qt5.15.2摄像头聚焦问题

1.分离取景器

因当前代码较多,笔者将VideoOutput给移到一个单独qml文件中,并作修改

(1)增加了十字标,用于显示点击的位置

(2)在qml中,增加如下代码,以绘制当前的摄像头焦点区域

    Repeater {
           model: camera.focus.focusZones

           Rectangle {
               border {
                   width: 2
                   color: status == Camera.FocusAreaFocused ? "green" : "white"
               }
               color: "transparent"

               // Map from the relative, normalized frame coordinates
               property variant mappedRect: videoOutput.mapNormalizedRectToItem(area);

               x: mappedRect.x
               y: mappedRect.y
               width: mappedRect.width
               height: mappedRect.height
           }
     }

PS。windows系统下不支持哈,所以运行在windows下时,只会多一些不支持的警告

响应下鼠标区域的事件,添加如下代码

Connections {
        target: mouseArea
        function onDoubleClicked(mouse) {
            //取消显示十字标
            viewFinder.state = ""
//            camera.unlock()
        }

        function onClicked(mouse) {
            console.log("clicked", mouse.x, mouse.y)
            if( Math.abs(mouseX - mouse.x) < mouseArea.drag.threshold
                    && Math.abs(mouseY - mouse.y) < mouseArea.drag.threshold
                    && viewFinder.state === "State_clicked")
            {
                //取消显示十字标
                viewFinder.state = ""
                //取消摄像头的锁定
                camera.unlock()
            }
            else
            {
                //显示十字标
                mouseX = mouse.x
                mouseY = mouse.y
                viewFinder.state = "State_focus"

                //计算相对位置
                let sourcePoint = videoOutput.mapPointToSource(Qt.point(mouse.x, mouse.y ))
                let pointX = sourcePoint.x / camera.viewfinder.resolution.width
                let pointY = sourcePoint.y / camera.viewfinder.resolution.height
                customFocusPoint = Qt.point(pointX, pointY )
                //聚焦并锁定摄像头
                camera.searchAndLock()

            }
        }
    }

笔者设置双击或点在同一位置时,取消十字标的显示,否则就显示在点击的位置上

显示十字标的同时,计算出点击的相对位置坐标(聚焦的输入量是一个相关位置),然后手工调用摄像头的聚焦功能(笔者找这个函数,花了不少时间-_-,小伙伴不要忘记调用,否则不生效的)

取消显示十字标时,要取消摄像头的锁定,否则自动聚焦就失效了

2.修改摄像头参数

以下是自动聚集时的参数

Camera {
    id: camera
    focus.focusMode: Camera.FocusMacro + Camera.FocusContinuous
    focus.focusPointMode: Camera.FocusPointAuto
    captureMode: Camera.CaptureStillImage
    imageCapture {}
}

聚焦模式设置为自动聚焦最近的物体

聚焦点的模式设置为自动聚焦点

设置完成后就可以实现自动聚焦功能

下面设置手动聚焦

    Camera {
        id: camera
        focus.customFocusPoint: viewFinder.customFocusPoint
        focus.focusPointMode: Camera.FocusPointCustom
        focus.focusMode: Camera.FocusMacro
        imageCapture {}
    }

聚焦模式设置为自定义聚焦模式

聚焦点的模式设置为自定义聚焦点

设置完成后,要传入自定义的聚焦位置点(注意是相对坐标),再调用 camera.searchAndLock()

才能实现自动聚焦功能

二、Qt5.15.2摄像头闪光灯问题

这个相对简单,修改主界面,增加设置项

 直接绑定camera的属性即可

camera.flash.mode: checkBox_flash.checked ? Camera.FlashOn
                      : checkBox_flash.tristate ? Camera.FlashAuto : Camera.FlashOff

三、Qt6.2.1摄像头聚焦问题

1.分离取景器

因当前代码较多,笔者将VideoOutput给移到一个单独qml文件中,并作修改

(1)增加了十字标,用于显示点击的位置

(2)在qml中,定义聚焦点属性,用以绘制当前的摄像头焦点

property point focusPoint

响应下鼠标区域的事件,添加如下代码

Connections {
        target: mouseArea
        function onDoubleClicked(mouse) {
            //取消显示十字标
            viewFinder.state = ""
        }

        function onClicked(mouse) {
            console.log("clicked", mouse.x, mouse.y)
            if( Math.abs(mouseX - mouse.x) < mouseArea.drag.threshold
                    && Math.abs(mouseY - mouse.y) < mouseArea.drag.threshold
                    && viewFinder.state === "State_clicked")
            {
                //取消显示十字标
                viewFinder.state = ""
            }
            else
            {
                //显示十字标
                mouseX = mouse.x
                mouseY = mouse.y
                viewFinder.state = "State_focus"


                //计算相对位置

                let pointX = ( mouse.x - videoOutput.contentRect.x ) / videoOutput.contentRect.width
                let pointY = ( mouse.y - videoOutput.contentRect.y ) / videoOutput.contentRect.height
                customFocusPoint = Qt.point(pointX, pointY )
                console.debug("customFocusPoint", customFocusPoint )

            }
        }
    }

笔者设置双击或点在同一位置时,取消十字标的显示,否则就显示在点击的位置上

显示十字标的同时,计算出点击的相对位置坐标(聚焦的输入量是一个相关位置)

2.修改摄像头参数

以下是自动聚集时的参数

Camera {
    id: camera
    focusMode: Camera.FocusModeAutoNear
}

聚焦模式设置为自动聚焦最近的物体

下面设置手动聚焦

    Camera {
        id: camera
        customFocusPoint: viewFinder.customFocusPoint
        focusMode: Camera.FocusModeManual
    }

聚焦模式设置为自定义聚焦点模式

设置完成后,要传入自定义的聚焦位置点(注意是相对坐标),才能实现自动聚焦功能

笔者测试未成功,打印出camera.isFocusModeSupported(Camera.FocusModeManual)是false,笔者受限于设置,未再测试

四、Qt6.2.1摄像头闪光灯问题

 这个相对简单,修改主界面,增加设置项

 直接绑定camera的属性即可

camera.flashMode: checkBox_flash.checked ? Camera.FlashOn : checkBox_flash.tristate ? Camera.FlashAuto : Camera.FlashOn

这个笔者也未测试成功

修改完成以上代码,就可以运行程序了,以下是笔者的运行结果

 1.Qt6.2.1在android下的运行结果

 很遗憾,未成功,一定是自动聚焦模式

 2.Qt5.15.2在android下的运行结果

运行成功,点哪就聚焦哪;若取消则自动聚焦;闪光灯也正常使用

 闪光灯不方便演示,就不截图了

 本次教程源码下载

后记:

本次教程在windows上无法观看效果

使用Qt6.2.1均自动聚焦成功,其他的未成功,笔者建议等待官方的修复

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

꧁白杨树下꧂

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值