当前位置: 首页 > article >正文

【QML】Qt设置USB免驱相机曝光时间(Linux系统)UVC

1. 问题

使用QML的Camera组件创建相机。需要配置曝光时间,使用CameraExposure中的exposureCompensationexposureMode配置无效果,原因可能是不支持USB相机。

有两种方法经测试有效果:

  • 命令行调用v4l2-ctl命令的方法,使用QProcess::execute()函数
  • 使用ioctl()的方式

2. v4l2-ctl方式

2.1 .h文件

#ifndef CAMERATOOL_H
#define CAMERATOOL_H

#include <QObject>
#include <QtCore>

//ioctl方式需要的头文件
#include <linux/videodev2.h>
#include <sys/ioctl.h>
#include <fcntl.h>
#include <unistd.h>

class CameraTool : public QObject
{
    Q_OBJECT
public:
    explicit CameraTool(QObject *parent = nullptr);

public:
    Q_INVOKABLE void setExposure(const int exposure);
    Q_INVOKABLE void setAutoExposure(const bool en);

};

#endif // CAMERATOOL_H

2.2 .cpp文件

#include "cameratool.h"


CameraTool::CameraTool(QObject *parent)
{

}

//方法1,命令行方式, execute()
void CameraTool::setExposure(const int exposure)
{
	//注意:exposure_absolute 根据自己的系统来,查看方式:v4l2-ctl -d /dev/video9 --list-ctrls
    std::string cmd = "v4l2-ctl -d /dev/video9 -c exposure_absolute=" +  std::to_string(exposure);

    const char* cmdc = cmd.c_str();
    QProcess::execute(cmdc);
    return;
}

void CameraTool::setAutoExposure(const bool en)
{
    QStringList arg;

	//注意:exposure_auto 根据自己的系统来,查看方式:v4l2-ctl -d /dev/video9 --list-ctrls
    arg.clear();
    if(en == true){
        arg << "-d" << "/dev/video9" << "-c" << "exposure_auto=3";
    }else{
        arg << "-d" << "/dev/video9" << "-c" << "exposure_auto=1";
    }
    QProcess::execute("v4l2-ctl", arg);

    return;
}

3. ioctl()方式

3.1 .h文件

与上一节的头文件一样。

3.2 .cpp文件

#include "cameratool.h"


CameraTool::CameraTool(QObject *parent)
{

}


//方法2,ioctl方式, ioctl()
void CameraTool::setExposure(const int exposure)
{
    v4l2_control control;
    int fd = open("/dev/video9", O_RDWR);
    if(fd < 0){
        printf("open camera failed\n");
        return;
    }

    control.id = V4L2_CID_EXPOSURE_ABSOLUTE;
    control.value = exposure;
    ioctl(fd, VIDIOC_S_CTRL, &control);

    close(fd);
    return ;
}

void CameraTool::setAutoExposure(const bool en)
{
    v4l2_control control;
    int fd = open("/dev/video9", O_RDWR);
    if(fd < 0){
        printf("open camera failed\n");
        return;
    }

    control.id = V4L2_CID_EXPOSURE_AUTO;
    if(en == true){
        control.value = V4L2_EXPOSURE_APERTURE_PRIORITY;
    }else{
        control.value = V4L2_EXPOSURE_MANUAL;
    }
    ioctl(fd, VIDIOC_S_CTRL, &control);

    close(fd);
    return ;
}

参考:

调节UVC相机参数只需要六行代码


http://www.kler.cn/a/145317.html

相关文章:

  • 信号处理以及队列
  • 工作总结:压测篇
  • 电商系统-用户认证(三)基于公钥解析JWT令牌
  • LNMP架构
  • 虹科分享 | 汽车NVH小课堂之听音辨故障
  • C++,STL,【目录篇】
  • IDEA中的Postman?完全免费!
  • CDN技术解析:加速网络传输的魔法
  • 鸿蒙HarmonyOS手把手带大家创建第一个项目 并做一个基本的组件结构讲解
  • Vatee万腾独特科技力量的前沿探索:Vatee的数字化奇点
  • Android:Google三方库之集成应用内评价详细步骤
  • 下一代图片压缩格式 AVIF
  • NFT Insider115:The Sandbox开设元宇宙Diorama快闪店,​YGG Web3 游戏峰会已开幕
  • The TypeScript Compiler - Version 5.2.2,tsc -w无效怎么办?
  • 「Verilog学习笔记」数据串转并电路
  • 目录树自动生成器 golang+fyne
  • 力扣-55.跳跃游戏
  • Guacamole简介及centos7下搭建教程
  • 哲学家就餐问题
  • OSG编程指南<十二>:OSG二三维文字创建及文字特效
  • 哈希思想的应用
  • Python与设计模式--责任链模式
  • 【分布式】小白看Ring算法 - 03
  • 【SAS Planet 下载地图瓦片】
  • 【数据结构】树与二叉树(廿六):树删除指定结点及其子树(算法DS)
  • 如何找出excel中两列数据中不同的值(IF函数的用法)