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

  • 一.摄像头(相机)常见参数
  • VIDIOC_QUERYCAP
  • VIDIOC_ENUM_FMT
  • VIDIOC_QUERYCAP
  • VIDIOC_G_FMT
  • VIDIOC_G_PARM
  • VIDIOC_G_PARM
  • VIDIOC_G_CTRL
  • 博客来源

一.摄像头(相机)常见参数

Linux下V4L2相关头文件所在路径为/内核源码目录/include/linux/videodev2.h。V4L2相关API文档
白平衡(自动白平衡AWB)及色温、曝光(自动曝光AE、曝光补偿EV)、亮度、对比度、饱和度、色度(色调+饱和度)、锐度(也叫清晰度)、背光补偿(也叫逆光补偿)、增益、对焦等

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

常见的 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  /* 设置调谐器频率 */

linux系统中提供的videodev2.h列出的 ioctl 命令

/**  I O C T L   C O D E S   F O R   V I D E O   D E V I C E S**/
#define VIDIOC_QUERYCAP      _IOR('V',  0, struct v4l2_capability)
#define VIDIOC_RESERVED       _IO('V',  1)
#define VIDIOC_ENUM_FMT         _IOWR('V',  2, struct v4l2_fmtdesc)
#define VIDIOC_G_FMT        _IOWR('V',  4, struct v4l2_format)
#define VIDIOC_S_FMT        _IOWR('V',  5, struct v4l2_format)
#define VIDIOC_REQBUFS      _IOWR('V',  8, struct v4l2_requestbuffers)
#define VIDIOC_QUERYBUF     _IOWR('V',  9, struct v4l2_buffer)
#define VIDIOC_G_FBUF        _IOR('V', 10, struct v4l2_framebuffer)
#define VIDIOC_S_FBUF        _IOW('V', 11, struct v4l2_framebuffer)
#define VIDIOC_OVERLAY       _IOW('V', 14, int)
#define VIDIOC_QBUF     _IOWR('V', 15, struct v4l2_buffer)
#define VIDIOC_EXPBUF       _IOWR('V', 16, struct v4l2_exportbuffer)
#define VIDIOC_DQBUF        _IOWR('V', 17, struct v4l2_buffer)
#define VIDIOC_STREAMON      _IOW('V', 18, int)
#define VIDIOC_STREAMOFF     _IOW('V', 19, int)
#define VIDIOC_G_PARM       _IOWR('V', 21, struct v4l2_streamparm)
#define VIDIOC_S_PARM       _IOWR('V', 22, struct v4l2_streamparm)
#define VIDIOC_G_STD         _IOR('V', 23, v4l2_std_id)
#define VIDIOC_S_STD         _IOW('V', 24, v4l2_std_id)
#define VIDIOC_ENUMSTD      _IOWR('V', 25, struct v4l2_standard)
#define VIDIOC_ENUMINPUT    _IOWR('V', 26, struct v4l2_input)
#define VIDIOC_G_CTRL       _IOWR('V', 27, struct v4l2_control)
#define VIDIOC_S_CTRL       _IOWR('V', 28, struct v4l2_control)
#define VIDIOC_G_TUNER      _IOWR('V', 29, struct v4l2_tuner)
#define VIDIOC_S_TUNER       _IOW('V', 30, struct v4l2_tuner)
#define VIDIOC_G_AUDIO       _IOR('V', 33, struct v4l2_audio)
#define VIDIOC_S_AUDIO       _IOW('V', 34, struct v4l2_audio)
#define VIDIOC_QUERYCTRL    _IOWR('V', 36, struct v4l2_queryctrl)
#define VIDIOC_QUERYMENU    _IOWR('V', 37, struct v4l2_querymenu)
#define VIDIOC_G_INPUT       _IOR('V', 38, int)
#define VIDIOC_S_INPUT      _IOWR('V', 39, int)
#define VIDIOC_G_EDID       _IOWR('V', 40, struct v4l2_edid)
#define VIDIOC_S_EDID       _IOWR('V', 41, struct v4l2_edid)
#define VIDIOC_G_OUTPUT      _IOR('V', 46, int)
#define VIDIOC_S_OUTPUT     _IOWR('V', 47, int)
#define VIDIOC_ENUMOUTPUT   _IOWR('V', 48, struct v4l2_output)
#define VIDIOC_G_AUDOUT      _IOR('V', 49, struct v4l2_audioout)
#define VIDIOC_S_AUDOUT      _IOW('V', 50, struct v4l2_audioout)
#define VIDIOC_G_MODULATOR  _IOWR('V', 54, struct v4l2_modulator)
#define VIDIOC_S_MODULATOR   _IOW('V', 55, struct v4l2_modulator)
#define VIDIOC_G_FREQUENCY  _IOWR('V', 56, struct v4l2_frequency)
#define VIDIOC_S_FREQUENCY   _IOW('V', 57, struct v4l2_frequency)
#define VIDIOC_CROPCAP      _IOWR('V', 58, struct v4l2_cropcap)
#define VIDIOC_G_CROP       _IOWR('V', 59, struct v4l2_crop)
#define VIDIOC_S_CROP        _IOW('V', 60, struct v4l2_crop)
#define VIDIOC_G_JPEGCOMP    _IOR('V', 61, struct v4l2_jpegcompression)
#define VIDIOC_S_JPEGCOMP    _IOW('V', 62, struct v4l2_jpegcompression)
#define VIDIOC_QUERYSTD          _IOR('V', 63, v4l2_std_id)
#define VIDIOC_TRY_FMT          _IOWR('V', 64, struct v4l2_format)
#define VIDIOC_ENUMAUDIO    _IOWR('V', 65, struct v4l2_audio)
#define VIDIOC_ENUMAUDOUT   _IOWR('V', 66, struct v4l2_audioout)
#define VIDIOC_G_PRIORITY    _IOR('V', 67, __u32) /* enum v4l2_priority */
#define VIDIOC_S_PRIORITY    _IOW('V', 68, __u32) /* enum v4l2_priority */
#define VIDIOC_G_SLICED_VBI_CAP _IOWR('V', 69, struct v4l2_sliced_vbi_cap)
#define VIDIOC_LOG_STATUS         _IO('V', 70)
#define VIDIOC_G_EXT_CTRLS  _IOWR('V', 71, struct v4l2_ext_controls)
#define VIDIOC_S_EXT_CTRLS  _IOWR('V', 72, struct v4l2_ext_controls)
#define VIDIOC_TRY_EXT_CTRLS    _IOWR('V', 73, struct v4l2_ext_controls)
#define VIDIOC_ENUM_FRAMESIZES  _IOWR('V', 74, struct v4l2_frmsizeenum)
#define VIDIOC_ENUM_FRAMEINTERVALS _IOWR('V', 75, struct v4l2_frmivalenum)
#define VIDIOC_G_ENC_INDEX       _IOR('V', 76, struct v4l2_enc_idx)
#define VIDIOC_ENCODER_CMD      _IOWR('V', 77, struct v4l2_encoder_cmd)
#define VIDIOC_TRY_ENCODER_CMD  _IOWR('V', 78, struct v4l2_encoder_cmd)

VIDIOC_QUERYCAP

参数控制相关函数及结构体:
函数: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);}

VIDIOC_ENUM_FMT

函数 :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");

VIDIOC_QUERYCAP

函数: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];
};

VIDIOC_G_FMT

函数: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");

VIDIOC_G_PARM

函数:ioctl(fd,VIDIOC_G_PARM,struct v4l2_streamparm *argp); //VIDIOC_S_PARM
作用:流相关 (如帧率)

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");

VIDIOC_G_PARM

函数: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");

VIDIOC_G_CTRL

函数: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问题,原因未知,如有朋友知晓,诚请赐教,在此先行谢过)。

博客来源

CSDN博主「人间凑数」原文链接:https://blog.csdn.net/qq_41248872/article/details/87928783

V4L2下摄像头的详细参数调整相关推荐

  1. linux下查看jvm详细参数

    java程序员除了编写业务代码之外,特别是项目上线之后,更需要关注的是系统的性能表现,这个时候就需要了解一下jvm的性能表现了,可以借助于java虚拟机自带的一些分析工具,主要有三个常用的命令. jm ...

  2. windows下编程控制摄像头的详细介绍

    这段时间闲来无事,看了看MSDN的文档,自己翻译了一下.一是为了学习,二是对空闲时间的打发.所以也希望大家在拍砖的同时,尊重我的劳动,如要转贴请注明转至blog.csdn.net/suntaoznz. ...

  3. android 摄像头调参,摄像头参数调整方法和装置、电子设备和存储介质与流程

    技术特征: 1.一种摄像头参数调整数调整方法,包括: 对参考摄像头采集的第一图像进行检测,获取第一检测结果: 对待调参摄像头采集的第二图像进行检测,获取第二检测结果,其中,所述第一图像与所述第二图像是 ...

  4. 树莓派3B摄像头的详细使用教程(拍照+录像+监控)

    树莓派4B摄像头的详细使用教程(拍照+录像+监控) 本篇博文将介绍树莓派摄像头是如何在树莓派开发板上从安装到使用的,博主过程中参考了许多帖子,现将整理的比较全面的过程分享出来,供大家参考使用. 排线连 ...

  5. opporeno3详细参数_opporeno3pro参数配置详情-opporeno3pro手机性能评测

    opporeno3pro是opporeno3同系列手机机型,这款手机主打的就是手机拍摄性能,在手机拍照方面还是可圈可点的,那么这款手机值不值得买呢?下面就是小编为大家带来的opporeno3pro详细 ...

  6. 树莓派4B摄像头的详细使用教程(拍照+录像+监控)

    树莓派4B摄像头的详细使用教程(拍照+录像+监控) 本篇博文将介绍树莓派摄像头是如何在树莓派开发板上从安装到使用的,博主过程中参考了许多帖子,现将整理的比较全面的过程分享出来,供大家参考使用. 排线连 ...

  7. 苹果前置摄像头拍出来是反的怎么调_不用等了!屏下摄像头难攻克,明年还是挖孔屏...

    看过目前市面上所有的手机外观,网友们表示更期待的还是屏下摄像头技术.打孔也好,刘海也好,水滴美人尖也好,升降机械结构也好,传统外观也好,折叠也好,都没能真正的解决用户们呼唤已久的"手机正面全 ...

  8. AI基础:数据划分、超参数调整、正则化

    本文来源于吴恩达老师的深度学习课程[1]笔记部分. 作者:黄海广[2] 导语 本文讲解机器学习的策略方面,包括数据划分.超参数调整.正则化等. 我正在编写AI基础系列,目前已经发布: AI 基础:简易 ...

  9. cox风险回归模型参数估计_信用风险管理:分类模型和超参数调整

    cox风险回归模型参数估计 The final part aims to walk you through the process of applying different classificati ...

最新文章

  1. 【神经网络】(10) Resnet18、34 残差网络复现,附python完整代码
  2. zatree插件优化:优化左侧边栏
  3. MAC OS 10.11.1虚拟机免费下载已安装Xcode7图片后有下载地址
  4. python利用决策树进行特征选择
  5. echart的x换行
  6. 用JS实现人脑和计算机交互,这个厉害了
  7. Apache连接和访问控制
  8. RHEL5.X 重启网卡出现./network-functions: line 78: .: ifcfg-eth0: file not found
  9. CVPR2020 | 跨模态行人重识别:共享与特异特征变换算法cm-SSFT
  10. 真无线蓝牙耳机,享受高品质杜比音效
  11. Cocos2dx之UI组件
  12. WebService框架——CXF介绍
  13. 花式讲解校园网绕过认证原理
  14. Java开发者必备十大学习网站
  15. 单片机学习 8-LED点阵实验
  16. cad解除块的快捷命令_cad隐藏块快捷键是什么,Auto CAD隐藏块快捷键是什么?
  17. 计算机组装配置(Win10蓝屏错误代码大全详解)
  18. curl http或https上传下载
  19. IDEA 在DEBUG模式下如何不执行后续代码直接停止程序?
  20. pandas水平concat后出现NaN值

热门文章

  1. FPGA 学习笔记:Vivado 2018.2 MicroBlaze Uartlite 配置
  2. 猎豹android studio,小米方盒音箱与猎豹音箱对比
  3. JavaScript基础操作——获取元素 id class
  4. 第3讲、Cadence原理图工程以及原理图库的创建
  5. 步进电机驱动器转动一圈400步程序
  6. Jmeter对基于websocket协议的压力测试
  7. 2021年电工(初级)考试内容及电工(初级)证考试
  8. python爬虫教程,带你抓取百度的高清摄影图片
  9. VR+全景播放器+头控讲解-05
  10. java 发送邮件demo_Java 邮件发送Demo