前言:
因笔者前期设备限制,并没有考虑摄像头聚焦、闪光灯相关,有小伙伴问到相关问题,所以笔者就测试了下。结果有点失望,但仍然共享给小伙伴们,以减少走弯路
本教程是在 Qt5.15.2+Qt6.2.1(qml)+opencv4.5.4实现扫码功能(多线程、微信扫码) 示例的基础上修改
QR扫码综合示例教程(二十一)Qt5.15.2+Qt6.2.1(qml)+opencv4.5.4实现扫码功能(多线程、微信扫码)_aggs1990的专栏-优快云博客
一、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均自动聚焦成功,其他的未成功,笔者建议等待官方的修复