V4L2下摄像头的详细参数调整

2023-11-05

(Linux下V4L2相关头文件所在路径为/内核源码目录/include/linux/videodev2.h,V4L2相关API文档可查看链接https://linuxtv.org/downloads/v4l-dvb-apis/uapi/v4l/v4l2.html)

摄像头(相机)常见参数:

白平衡(自动白平衡AWB)及色温、曝光(自动曝光AE、曝光补偿EV)、亮度、对比度、饱和度、色度(色调+饱和度)、锐度(也叫清晰度)、背光补偿(也叫逆光补偿)、增益、对焦等

注:不同摄像头开放的参数不一致,需提前确认该款摄像头的可调参数,未开放的参数是无法调整的!!!

上述参数涵义如有不懂,可自行维基百科https://zh.wikipedia.org/wiki/Wikipedia:%E9%A6%96%E9%A1%B5和百度词条https://baike.baidu.com/item/科普。

常见的 ioctl 命令:

VIDIOC_QUERYCAP     /* 获取设备支持的操作 */
VIDIOC_G_FMT             /* 获取设置支持的视频格式 */
VIDIOC_S_FMT             /* 设置捕获视频的格式 */
VIDIOC_REQBUFS       /* 向驱动提出申请内存的请求 */
VIDIOC_QUERYBUF    /* 向驱动查询申请到的内存 */
VIDIOC_QBUF              /* 将空闲的内存加入可捕获视频的队列 */
VIDIOC_DQBUF           /* 将已经捕获好视频的内存拉出已捕获视频的队列 */
VIDIOC_STREAMON      /* 打开视频流 */
VIDIOC_STREAMOFF    /* 关闭视频流 */
VIDIOC_QUERYCTRL    /* 查询驱动是否支持该命令 */
VIDIOC_G_CTRL         /* 获取当前命令值 */
VIDIOC_S_CTRL         /* 设置新的命令值 */
VIDIOC_G_TUNER     /* 获取调谐器信息 */
VIDIOC_S_TUNER      /* 设置调谐器信息 */
VIDIOC_G_FREQUENCY  /* 获取调谐器频率 */
VIDIOC_S_FREQUENCY  /* 设置调谐器频率 */

参数控制相关函数及结构体:

函数ioctl(fd,VIDIOC_QUERYCAP,struct v4l2_streamparm *argp);

作用:查询设备能力

struct v4l2_capability {
        __u8    driver[16];     /* i.e. "bttv" */
        __u8    card[32];       /* i.e. "Hauppauge WinTV" */
        __u8    bus_info[32];   /* "PCI:" + pci_name(pci_dev) */
        __u32   version;        /* should use KERNEL_VERSION() */
        __u32   capabilities;   /* Device capabilities */
        __u32   reserved[4];
};

栗子:

    /*获取摄像头信息*/
    struct v4l2_capability cap;

    if (ioctl(cam_fd, VIDIOC_QUERYCAP, &cap) < 0)
    {
        perror("get info failed!");
        return -1;
    }

    printf("Driver Name:%s\n Card Name:%s\n Bus info:%s\n version:%d\n capabilities:%x\n \n ", cap.driver, cap.card, cap.bus_info,cap.version,cap.capabilities);
             
    if ((cap.capabilities & V4L2_CAP_VIDEO_CAPTURE) == V4L2_CAP_VIDEO_CAPTURE)
    {
        printf("Device %s: supports capture.\n",DEV_NAME);
    }
    if ((cap.capabilities & V4L2_CAP_STREAMING) == V4L2_CAP_STREAMING)
    {
        printf("Device %s: supports streaming.\n",DEV_NAME);
    }

函数 int ioctl(fd, VIDIOC_ENUM_FMT, struct v4l2_fmtdesc *argp); 

作用:获取当前驱动支持的视频格式

struct v4l2_fmtdesc

{

__u32 index; // 要查询的格式序号,应用程序设置

enum v4l2_buf_type type; // 帧类型,应用程序设置

__u32 flags; // 是否为压缩格式

__u8 description[32]; // 格式名称

__u32 pixelformat; // 格式

__u32 reserved[4]; // 保留

};

栗子:

printf("【**********************所有支持的格式:****************************】\n");

struct v4l2_fmtdesc dis_fmtdesc;

dis_fmtdesc.index=0;

dis_fmtdesc.type=V4L2_BUF_TYPE_VIDEO_CAPTURE;

printf("Support format:\n");

while(ioctl(cam_fd,VIDIOC_ENUM_FMT,&dis_fmtdesc)!=-1)

{

printf("\t%d.%s\n",dis_fmtdesc.index+1,dis_fmtdesc.description);

dis_fmtdesc.index++;

}

printf("\n");

 

函数ioctl(fd,VIDIOC_QUERYCAP,struct v4l2_queryctrl *argp);  

作用:用作查询某些参数的一些属性要求(如最大最小范围,默认值等)

struct v4l2_queryctrl {
        __u32                id;
        enum v4l2_ctrl_type  type;
        __u8                 name[32];  /* Whatever */
        __s32                minimum;   /* Note signedness */
        __s32                maximum;
        __s32                step;
        __s32                default_value;
        __u32                flags;
        __u32                reserved[2];
};

函数ioctl(fd,VIDIOC_G_FMT,struct v4l2_format *argp);  //VIDIOC_S_FMT

作用:分辨率、图像采集格式相关设置

struct v4l2_format {
        enum v4l2_buf_type type;
        union {
                struct v4l2_pix_format          pix;     /* V4L2_BUF_TYPE_VIDEO_CAPTURE */
                struct v4l2_pix_format_mplane   pix_mp;  /* V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE */
                struct v4l2_window              win;     /* V4L2_BUF_TYPE_VIDEO_OVERLAY */
                struct v4l2_vbi_format          vbi;     /* V4L2_BUF_TYPE_VBI_CAPTURE */
                struct v4l2_sliced_vbi_format   sliced;  /* V4L2_BUF_TYPE_SLICED_VBI_CAPTURE */
                __u8    raw_data[200];                   /* user-defined */
        } fmt;
};

栗子:

    printf("【**********************获取当前格式信息:****************************】\n");
    Format.type= V4L2_BUF_TYPE_VIDEO_CAPTURE;
    if(ioctl(cam_fd,VIDIOC_G_FMT,&Format)==-1)
    {
        perror("ioctl");
        exit(EXIT_FAILURE);
    }
    printf(">>:  %d * %d\n",Format.fmt.pix.width,Format.fmt.pix.height);
    printf("pix.pixelformat:%c%c%c%c\n", \
            Format.fmt.pix.pixelformat & 0xFF,\
            (Format.fmt.pix.pixelformat >> 8) & 0xFF, \
            (Format.fmt.pix.pixelformat >> 16) & 0xFF,\
            (Format.fmt.pix.pixelformat >> 24) & 0xFF);
    printf("\n");

 

函数ioctl(fd,VIDIOC_G_PARM,struct v4l2_streamparm *argp);  //VIDIOC_S_PARM

作用:流相关 (如帧率)

struct v4l2_streamparm {
        enum v4l2_buf_type type;
        union {
                struct v4l2_captureparm capture;
                struct v4l2_outputparm  output;
                __u8    raw_data[200];  /* user-defined */
        } parm;
};

栗子:

printf("【***********************获取帧率信息**************************】\n");

struct v4l2_streamparm Stream_Parm;

Stream_Parm.type=V4L2_BUF_TYPE_VIDEO_CAPTURE;

if(ioctl(cam_fd,VIDIOC_G_PARM,&Stream_Parm)==-1)

{

perror("ioctl");

exit(EXIT_FAILURE);

}

printf(">>: Frame rate: %u/%u\n",Stream_Parm.parm.capture.timeperframe.numerator,Stream_Parm.parm.capture.timeperframe.denominator);

printf("\n");

函数ioctl(fd,VIDIOC_G_CTRL,struct v4l2_control*argp);  //VIDIOC_S_CTRL

作用:参数控制(白平衡、色温、对比度、饱和度、锐度、曝光等,均有该结构控制)

struct v4l2_control {
        __u32                id;        //id即要控制的参数id(例白平衡ID为V4L2_CID_AUTO_WHITE_BALANCE)
        __s32                value;  
};

栗子:

    printf("【**********************设置手动白平衡:******************************】\n");
    ctrl.id = V4L2_CID_AUTO_WHITE_BALANCE;
    ctrl.value = V4L2_WHITE_BALANCE_MANUAL ;
    if(ioctl(cam_fd,VIDIOC_G_CTRL,&ctrl)==-1)
    {
        perror("ioctl");
        exit(EXIT_FAILURE);
    }
    printf("\n");    

    /*************设置白平衡色温****************************/
    printf("【****************设置白平衡色温********************】\n");
    ctrl.id = V4L2_CID_WHITE_BALANCE_TEMPERATURE;
    ctrl.value = 5100;
     if(ioctl(cam_fd,VIDIOC_S_CTRL,&ctrl)==-1)
    {
        perror("ioctl");
        exit(EXIT_FAILURE);
    }
    printf("\n");

    printf("【***************设置亮度***************************】\n");
    ctrl.id= V4L2_CID_BRIGHTNESS;
    ctrl.value = 40;
    if(ioctl(cam_fd,VIDIOC_S_CTRL,&ctrl)==-1)
    {
        perror("ioctl");
        exit(EXIT_FAILURE);
    }
    printf("\n");

    printf("【***************设置对比度**************************】\n");
    ctrl.id = V4L2_CID_CONTRAST;
    ctrl.value= 45;
    if(ioctl(cam_fd,VIDIOC_S_CTRL,&ctrl)==-1)
    {
        perror("ioctl");
        exit(EXIT_FAILURE);
    }
    sleep(1);
    printf("\n");

    printf("【***************设置饱和度**************************】\n");
    ctrl.id = V4L2_CID_SATURATION;
    ctrl.value= 60;
    if(ioctl(cam_fd,VIDIOC_S_CTRL,&ctrl)==-1)
    {
        perror("ioctl");
        exit(EXIT_FAILURE);
    }
    printf("\n");

    printf("【********************设置色度**********************】\n");
    ctrl.id = V4L2_CID_HUE;
    ctrl.value = 1;
    if(ioctl(cam_fd,VIDIOC_S_CTRL,&ctrl)==-1)
    {
        perror("ioctl");
        exit(EXIT_FAILURE);
    }
    printf("\n");

    printf("【********************设置锐度**********************】\n");
    ctrl.id = V4L2_CID_SHARPNESS;
    ctrl.value = 4;
    if(ioctl(cam_fd,VIDIOC_S_CTRL,&ctrl)==-1)
    {
        perror("ioctl");
        exit(EXIT_FAILURE);
    }
    printf("\n");

    
    printf("【*******************设置背光补偿******************】\n");
    ctrl.id = V4L2_CID_BACKLIGHT_COMPENSATION;
    ctrl.value = 3;
    if(ioctl(cam_fd,VIDIOC_S_CTRL,&ctrl)==-1)
    {
        perror("ioctl");
        exit(EXIT_FAILURE);
    }
    printf("\n");

    printf("【********************设置伽玛值**********************】\n");
    ctrl.id = V4L2_CID_GAMMA;
    ctrl.value = 120;
    if(ioctl(cam_fd,VIDIOC_S_CTRL,&ctrl)==-1)
    {
        perror("ioctl");
        exit(EXIT_FAILURE);
    }
    printf("\n");

设置曝光值

1. 首先将曝光模式修改为手动曝光。

2. 设置曝光档次或者具体的曝光值。

例1:得到曝光模式,设置为手动曝光模式

int ret;
struct v4l2_control ctrl;
//得到曝光模式
ctrl.id = V4L2_CID_EXPOSURE_AUTO;
ret = ioctl(Handle, VIDIOC_G_CTRL, &ctrl);

if (ret < 0) 
{
    printf("Get exposure auto Type failed\n");

    return V4L2_UTILS_GET_EXPSURE_AUTO_TYPE_ERR;
}

printf("\nGet Exposure Auto Type:[%d]\n", ctrl.value);

//设置曝光模式为手动模式

ctrl.id = V4L2_CID_EXPOSURE_AUTO; 
ctrl.value = V4L2_EXPOSURE_MANUAL;  //手动曝光模式
ret = ioctl(Handle, VIDIOC_S_CTRL, &ctrl); 
if (ret < 0) 
{
   printf("Get exposure auto Type failed\n"); 

   return V4L2_UTILS_SET_EXPSURE_AUTO_TYPE_ERR; 

}
 例2:在设置为手动模式后,再得到和设置曝光等级
int ret; 
struct v4l2_control ctrl; 
ctrl.id = V4L2_CID_EXPOSURE;  //得到曝光档次,A20接受从 -4到4 共9个档次
ret = ioctl(Handle, VIDIOC_G_CTRL, &ctrl); 
if (ret < 0) 
{ 
    printf("Get exposure failed (%d)\n", ret); 
    return V4L2_UTILS_GET_EXPSURE_ERR; 
} 

printf("\nGet Exposure :[%d]\n", ctrl.value);

//设置曝光档次
ctrl.id = V4L2_CID_EXPOSURE; 
ctrl.value = -4; 
ret = ioctl(Handle, VIDIOC_S_CTRL, &ctrl); 
if (ret < 0) 
{ 
    printf("Set exposure failed (%d)\n", ret); 
    return V4L2_UTILS_SET_EXPSURE_ERR; 
} 

例3:在设置为手动模式后,再得到和设置曝光绝对值:

int ret;
struct v4l2_control ctrl;
ctrl.id = V4L2_CID_EXPOSURE_ABSOLUTE;
ret = ioctl(handle, VIDIOC_G_CTRL, &ctrl);
if (ret < 0) 
{
    printf("Set exposure failed (%d)\n", ret);

    //return V4L2_UTILS_SET_EXPSURE_ERR;
}

printf("\nGet ABS EXP Success:[%d]\n", ctrl.value);

sleep(1);

//设置曝光绝对值
ctrl.id = V4L2_CID_EXPOSURE_ABSOLUTE;
ctrl.value = 300;  //单位100us
ret = ioctl(handle, VIDIOC_S_CTRL, &ctrl);
if (ret < 0) 
{
    printf("Set exposure failed (%d)\n", ret);

    //return V4L2_UTILS_SET_EXPSURE_ERR;
}

 

( 以上参数经过测试均能有效设置,但曝光、自动对焦、增益无法设置通过,会出现ioctl: Invalid argument问题,原因未知,如有朋友知晓,诚请赐教,在此先行谢过)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

V4L2下摄像头的详细参数调整 的相关文章

  • Eclipse搭建stm32+jlink开发环境全攻略(进阶篇一)

    Eclipse搭建stm32 jlink开发环境全攻略 进阶篇 一 本篇开始讲解一些比较实用的东西 在前面的两章中 我们讲解了eclipse开发stm32的大部分问题 然而 在实际使用过程中 我们仍然会遇到一些不太理想的地方 比如 ecli
  • uboot分析之Makefile

    Uboot分析之Makefile 1 uboot根目录下执行 make smdk2410 config smdk2410 config unconfig MKCONFIG config arm arm920t smdk2410 samsun
  • 手动更新(rpi-update)树莓派固件

    手动更新 rpi update 树莓派固件 1 下载固件 本地更新 先在 PC 上下载固件 也可以用如下方法下载 curl L https github com Hexxeh rpi firmware archive master tar
  • 使用嵌入式linux完全手册光盘的arm-linux-gcc 遇到问题 自己编译

    Redhat9下重新生成交叉编译器gcc 3 4 5 glibc 2 3 6 看到论坛上有兄弟也遇到 arm linux gcc lib tls libc so 6 version GLIBC 2 4 not found required
  • Eclipse搭建stm32+jlink开发环境全攻略(高级篇)

    Eclipse搭建stm32 jlink开发环境全攻略 高级篇 一 问题概况 通过初级篇的学习 我们知道了一个Eclipse工程的配置以及调试 貌似使用也没什么问题 然而 当我们抛弃掉Eclipse自带的工程模版是 也抛弃的他的一些其他的功
  • 再介绍一种低成本的负电源电路

    前面介绍了几种产生负电源的方法 几种常用的产生负电源的方法 今天再来介绍一种低成本的负电源电路 用分离元件搭建 配合程序控制 实现正电源转负电源 先看电路 图中Q1 D1 L2和C1构成最基本的Buck Boost电路 L1 C2为一级LC
  • 基于DS18B20和HS1101的仓库自动报警系统

    基于DS18B20和HS1101的仓库自动报警系统 背景介绍 效果展示 完整版的项目代码 仿真文件 下面是项目原理图 具体管脚定义如下图 18B20温度原理 HS1101湿度传感器 红外测距报警模块我用到的是GP2D12 通过数模转化器AD
  • stm32USB之模拟U盘

    STMF0 W25Q32模拟U盘 1 第一次写博客 如有错误 请及时指正 如有表达不通顺的地方 敬请谅解 2 本篇文章主要描述如何使用STM32cube配置USB 使用的主控为STM32F072 Flash为W25Q32 使用的主控RAM只
  • firmware-mod-kit工具安装和使用说明

    一 firmware mod kit工具的安装 firmware mod kit工具的功能和binwalk工具的类似 其实firmware mod kit工具在功能上有调用binwalk工具提供的功能以及其他的固件解包工具的整合 下载fir
  • 06 CubeMX HAL库stm32作从机 硬件I2C中断接收无BUG程序

    文章目录 CubeMX HAL库stm32作从机 硬件I2C中断接收无BUG程序 一 设置烧录模式 二 使用外部晶振 三 开启IIC中断 四 设置IIC参数 五 配置外部时钟 六 设置工程信息 七 代码生成项配置 八 在Keil中打开工程
  • HMI智能串口屏——在STM32开发板上的实战应用及其详解

    HMI智能串口屏 在STM32开发板上的实战应用及其详解 一 HMI智能串口屏使用步骤 二 附录 一 HMI智能串口屏使用步骤 安装USART HMI软件 一般买的串口屏里面 商家送的资料里面都有改该软件 打开软件 并点击左上角的 新建 选
  • LWIP在STM32上的移植

    本文做记录摘抄 加上自己的体会 文章标题 STM32使用LWIP实现DHCP客户端 http www cnblogs com dengxiaojun p 4379545 html 该文章介绍了几点 LWIP源码的内容 关键点 1 inclu
  • 毕业设计 STM32人体红外测温枪温度采集系统 - 单片机

    文章目录 1 前言 2 主要器件 3 实现效果 4 设计原理 MLX90614 红外温度传感器 5 部分实现代码 6 最后 1 前言 这两年开始毕业设计和毕业答辩的要求和难度不断提升 传统的毕设题目缺少创新和亮点 往往达不到毕业答辩的要求
  • STM32F103C8移植uCOSIII(HAL库)

    少年 一 随笔 二 uCOSIII源码 三 项目导入文件整理 四 导入文件和增加头函数路径 五 代码改动 六 参考资料 一 随笔 移植一个嵌入式系统用了一天时间 只能说不愧是我 在不了解的情况下还是少一些自己的操作 自己挖坑埋自己 记录一下
  • 属性,服务,事件

    属性 即设备支持的可读和 或可设置的参数功能 以一个灯为例 灯的开关就可以定义为一个属性 用户可以读取该属性的当前数值来得知灯的开关状态 也可以通过对该属性进行设置来打开或者关闭这个灯 服务 如果设备的某个功能只能设置 不能获取 那么可以将
  • 嵌入式资源网站

    原题地址 http blog csdn net ce123 article details 6724127 一 MailList 1 MailList大全 网址 http news gmane org 描述 可以查到绝大部分开源项目的Mai
  • 面经——小米面经(2021春招)

    摘自 小米面经 2021春招 感谢小米 感谢雷总 感谢上官可编程 作者 阿波罗啦啦啦啦 发布时间 2021 05 01 11 08 41 网址 https blog csdn net weixin 44933419 article deta
  • 计算机基础:一颗芯片是怎样诞生的?

    一颗芯片是怎样诞生的 芯片属于半导体 半导体是介于导体和绝缘体之间的一类物质 元素周期表中硅 锗 硒 硼的单质都属于半导体 这些单质通过掺杂其他元素生成的一些化合物 也属于半导体的范畴 这些化合物在常温下可激发载流子的能力大增 导电能力大大
  • Java18都在路上了,你还在用Java8吗?

    Java18都在路上了 你还在用Java8吗 在开始前我有一些资料 是我根据自己从业十年经验 熬夜搞了几个通宵 精心整理了一份 Java的资料从专业入门到高级教程 工具包 点个关注 全部无偿共享给大家 在评论区回复 888 之后私信回复 8
  • 跟着野火学FreeRTOS:第一段(任务定义,切换以及临界段)

    在裸机系统中 系统的主体就是 C P U CPU CP U 按照预先设定的程序逻辑在 m a i n

随机推荐

  • JavaScript实现人民币大小写转换

    当使用支票或者签署合同时 需要用到大写人民币 常用的中文大写包括零 壹 贰 叁 肆 伍 陆 柒 捌 玖 拾 佰 仟 万 亿 本文介绍下如何使用JavaScript实现将阿拉伯数字的人民币转换成大写 工具地址 人民币大小写转换工具 人民币大小
  • uni-app自定义配置安卓模拟器 - MuMu模拟器

    第一步 下载MuMu模拟器 下载地址 http mumu 163 com 第二步 配置模拟器端口以及abd路径 该路径在HBuilder安装目录中 然后继续打开你的HBuilder编辑器 运行 运行到手机或模拟器 安卓模拟器端口配置 第三步
  • Oracle查询入门(五)连表查询

    定义 表连接查询 当要查询的数据来自于多个数据源 现在主要有92语法和99语法 92语法 select 数据 from 数据源1 数据源2 where 行过滤条件 group by 分组字段1 分组字段2 having 组过滤信息 orde
  • 仲裁文件夹服务器,存储仲裁服务器

    存储仲裁服务器 内容精选 换一换 帮助用户完成专属云服务器备份任务的创建 快速完成服务器数据保护 专属云服务器不支持应用一致性备份 当专属对象存储的容量不足时 会导致专属云服务器备份创建失败 已开通专属对象存储 登录管理控制台 单击 选择
  • IBM小型机安装AIX系统

    1 系统开机自检 系统开机后会进行自检 前置面板绿灯闪烁 此时放入系统光盘 2 系统菜单 系统自检完成后会显示菜单 按1进入系统菜单 这里要尽快输入 否则会进入之前的系统 3 输入密码 进入系统菜单后 出现两个选项 选择第二项输入密码 默认
  • html层级显示优先,CSS 样式的层叠和优先级说明

    上面说了浏览器要查看的所有样式来源后 现在聊一下浏览器显示元素时确认一个 CSS 属性值的次序 补充 CSS 样式由一条或者多条以分号分割开的样式声明组成 每条声明包含着一个 CSS 属性和该属性的值 两者以冒号分割 一 CSS 样式的层叠
  • 期货开户CTP高性能高容量高可靠性

    一 交易通道选择 CTP交易通道是就是上期技术 是上海期货信息技术有限公司研发的期货行业技术最先进的交易系统 具备每秒2000笔交易处理能力和1毫秒的行情更新速度 保障交易系统的最高可靠性 该通道是十分成熟的交易平台 目前主流期货公司中绝大
  • 在网页中内嵌网页

    目录 文章目录 前言 代码展示 主页代码 展示作品的代码 球体运动 方块旋转 结果演示 前言 在制作个人网站时 经常遇到一个问题 就是如何让自己的作品动态的显示在主页上 而本文就是找到了解决办法 利用标签 引入想要的结果 代码展示 主页代码
  • 自学Python能做哪些副业?我一般不告诉别人

    Python作为今天的互联网不可或缺的一门技能 可以成为自己的主业以外 其实它也还是可以成为副业的 那么学好python后可以从事的副业有哪些呢 自学Python能干的副业 1 兼职处理数据 分析数据是很重要的一点 那么利用python 就
  • 结构化思维的训练方式

    转自 https www sohu com a 198266900 628522 结构化思维 Structured Thinking 是指人在面对工作任务或者难题时 能从多个侧面进行思考 深刻分析导致问题出现的原因 系统制定行动方案 并采取
  • python实现剪刀石头布小游戏

    首先实现系统随机出剪刀石头布 import random 首先导入random模块 k 剪刀 石头 布 创建一个列表 列表共有我们所需要用到的三个元素 m random choice k 用该函数随机从k中取一个元素并赋值给m m便为剪刀石
  • MySql嵌套查询+关联查询+多表查询+对应案例+mybatis动态sql 超详细

    最近学习MyBatis框架 用到多表查询比较多 以前学的不是很好 今特意回来补上 呜呜呜 有对MySql数据库的初步使用不是很了解的朋友们 可以切换到这里噢 https blog csdn net haobo article details
  • [CMake教程] if 和 else

    目录 一 基本语法 二 基本用法 三 其他用法 3 1 逻辑运算 3 2 存在性检查 3 3 文件操作 3 4 数值比较 3 5 字符串比较 3 6 版本比较 3 7 路径比较 CMake 3 24引入 一 基本语法 if
  • 华为od机考真题-最少面试官数

    while 1 try n int input nums for in range n nums append list map int input
  • MQTT 协议入门:基础知识和快速教程

    本文是 MQTT 协议的入门指南 提供了实用的代码示例 物联网和 MQTT 的初学者可以通过本文掌握 MQTT 的基本概念 快速开启 MQTT 服务和应用的开发 什么是 MQTT MQTT Message Queuing Telemetry
  • Dell服务器通过IDRAC9收集TSR日志排查故障

    登陆IDRAC9 WEB管理界面 在菜单栏 lt 维护 gt 下选择 在联网的情况下推荐完成SupportAssist的注册 根据提示安装ISM并进行信息登记 如暂不注册 则点击取消继续 进入SupportAssist界面 点击 lt 开始
  • vue3+antv x6自定义节点样式

    前篇 vue3 ts使用antv x6 自定义节点 先大致定下节点样式 需要展示标题 输入 输出连接桩 参考样子大概是 https x6 antv antgroup com examples showcase practices class
  • 使用Pdb调试Python

    简单介绍 Python自带 Pdb库 使用 Pdb调试 Python程序还是很方便的 但是远程调试 多线程 Pdb是搞不定的 本文参考的相关文章如下 指针和字符串和字符串常量 用gdb来获取非法内存中的内容 Linux gdb调试器用法全面
  • 二维带权邮局位置(选址)问题(分别求横坐标、纵坐标的带权中位数)C++实现

    带权邮局位置问题 已知n个点p1 p2 pn及与它们相联系的权重w1 w2 wn 我们希望能找到一点p 不一定是输入点中的一个 使和式 最小 此处d a b 表示点a和点b之间的距离 找出二维带权邮局位置问题的最佳解答 其中所有的点都是 x
  • V4L2下摄像头的详细参数调整

    Linux下V4L2相关头文件所在路径为 内核源码目录 include linux videodev2 h V4L2相关API文档可查看链接https linuxtv org downloads v4l dvb apis uapi v4l