Linux下摄像头应用编程

2023-10-27

Linux下摄像头应用编程

  V4L2是Video for linux2的简称,为linux中关于视频设备的内核驱动。在Linux中,视频设备是设备文件,可以像访问普通文件一样对其进行读写,摄像头在/dev/video*下,如果只有一个视频设备,通常为/dev/video0。
  v4L2是针对uvc免驱usb设备的编程框架 ,主要用于采集usb摄像头等。

1.摄像头框架编程步骤

  (1)打开摄像头设备(/dev/video0 、/dev/video1 )。
  (2)设置图像格式:VIDIOC_S_FMT(视频捕获格式、图像颜色数据格式、图像宽和高)。
  (3)申请缓冲区:VIDIOC_REQBUFS(缓冲区数量、缓冲映射方式、视频捕获格式)。
  (4)将缓冲区映射到进程空间:VIDIOC_QUERYBUF(要映射的缓冲区下标、缓冲映射方式、视频捕获格式)。
  (5)将缓冲区添加到队列中:VIDIOC_QBUF(映射的缓冲区下标、缓冲映射方式、视频捕获格式)。
  (6)开启摄像头采集:VIDIOC_STREAMON (视频捕获格式)。
  (7)从采集队列中取出图像数据VIDIOC_DQBUF,进行图像渲染。

2.V4L2头文件信息

  V4L2是Linux下标准视频驱动框架,相关头文件信息在include/linux/videodev2.h中。
  V4L2 驱动对用户空间提供字符设备,主设备号为 81,对于视频设备,其次设备号为 0-63。除此之外,次设备号为 64-127 的 Radio 收音机设备,次设备号为 192-223 的是 Teletext 广播设备,次设备号为 224-255 的是 VBI视频消影设备。
  V4L2 驱动的 Video 设备在用户空间通过各种 ioctl 调用进行控制,并且可以使用 mmap 进行内存映射。

2.1 常用ioctl参数

设置视频捕获格式
#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_QBUF _IOWR(‘V’, 15, struct v4l2_buffer)
从队列中获取图像数据
#define VIDIOC_DQBUF _IOWR(‘V’, 17, struct v4l2_buffer)
开启摄像头图像采集
#define VIDIOC_STREAMON _IOW(‘V’, 18, int)

2.2 核心结构体信息

  • struct v4l2_format

struct v4l2_format {
__u32 type;/* 类型V4L2_BUF_TYPE_VIDEO_CAPTURE*/
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;
};

  • struct v4l2_pix_format

struct v4l2_pix_format {
__u32 width;//图像宽度
__u32 height;//图像高度
__u32 pixelformat;//图像数据格式
__u32 field; /*enum v4l2_field */
__u32 bytesperline; /*for padding, zero if unused */
__u32 sizeimage;
__u32 colorspace; /*enum v4l2_colorspace*/
__u32 priv; /*private data, depends on pixelformat */
};

  • struct v4l2_requestbuffers

//内存映射缓冲区
struct v4l2_requestbuffers {
__u32 count; //申请缓冲区个数
__u32 type; /* enum v4l2_buf_type 视频类型 /
__u32 memory; /
enum v4l2_memory 映射方式*/
__u32 reserved[2];
};

  • struct v4l2_buffer

//视频缓冲区信息
struct v4l2_buffer {
__u32 index;/数组下标/
__u32 type;/视频捕获格式/
__u32 bytesused;
__u32 flags;
__u32 field;
struct timeval timestamp;
struct v4l2_timecode timecode;
__u32 sequence;
/* memory location */
__u32 memory;/映射格式/
union {
__u32 offset;/偏移量/
unsigned long userptr;
struct v4l2_plane *planes;
int fd;
} m;
__u32 length;/映射缓冲区大小/
__u32 input;
__u32 reserved;
};

2.3 图像颜色编码格式

  关于YUV格式图像参考:https://blog.csdn.net/sway913/article/details/120602052

  • YUV
      YUV,是一种颜色编码方法。常使用在各个视频处理组件中。 YUV在对照片或视频编码时,考虑到人类的感知能力,允许降低色度的带宽。
      YUV是编译true-color颜色空间(color space)的种类,Y’UV, YUV, YCbCr,YPbPr等专有名词都可以称为YUV,彼此有重叠。“Y”表示明亮度(Luminance或Luma),也就是灰阶值,“U”和“V”表示的则是色度(Chrominance或Chroma),作用是描述影像色彩及饱和度,用于指定像素的颜色。
      YUV格式有两大类:planar(平面)和packed(交错)。
      对于planar的YUV格式,先连续存储所有像素点的Y,紧接着存储所有像素点的U,随后是所有像素点的V。
      对于packed的YUV格式,每个像素点的Y,U,V是连续交错存储的。
      YUV的主要优势在于可以兼容之前的黑白电视,单独只有Y数据就可以显示完整的黑白图像,UV是后期加入的色彩参数。
  • YUYV格式:YUV422
      YUV 4:2:2采样,表示在每4个像素中,Y采集4份,U采集2份,V采集2份。每两个 Y 分量共享一组 UV 分量。单个像素占用空间为:1byte(Y)+1/2byte(U)+1/2byte(V)=2字节;一帧图像占用的空间为:width * height * 2
    在这里插入图片描述
  • YUV420
      YUV420 每四个Y分量公用一个UV分量,并不是没有V分量,而是UV分量交替采样,所以每个像素点占用1.5个字节空间。根据planar(平面)和packed(交错)方式存储有4种存储方式。下面举其中一种示例说明:
       每4个Y共用一组UV分量,单个像素占用空间为:1byte(Y)+1/4byte(U)+1/4byte(V)=1.5字节;一帧图像占用的空间为:width * height * 3/2 byte。
    在这里插入图片描述
  • RGB
      RGB色彩模式是工业界的一种颜色标准,是通过对红®、绿(G)、蓝(B)三个颜色通道的变化以及它们相互之间的叠加来得到各式各样的颜色的,RGB即是代表红、绿、蓝三个通道的颜色,这个标准几乎包括了人类视力所能感知的所有颜色,是运用最广的颜色系统之一。
       常用的RGB格式:
  • RGB565:5位红色+6位绿色+5位蓝色=16位颜色值
  • RGB888:8位红色+8位绿色+8位蓝色=24真彩色
  • RGB32:RGB32是在RGB基础上附加上Alpha(透明度)通道,RGB个占8位,剩余8位用作Alpha通道。

在这里插入图片描述

3.摄像头编程示例

3.1 摄像头初始化

  打开摄像头设备,设置视频捕获格式,设置图像格式为YUYV422。

/*摄像头初始化*/
int Camera_Init(void)
{
	int i=0;
	/*1.打开摄像头设备*/
	int fd=open(VIDEO_DEV,2);
	if(fd<0)return -1;//摄像头打开失败
	/*2.设置摄像头捕获格式*/
	struct v4l2_format v4l2fmt;
	memset(&v4l2fmt,0,sizeof(v4l2fmt));//初始化结构体
	v4l2fmt.type=V4L2_BUF_TYPE_VIDEO_CAPTURE;//视频捕获格式
	v4l2fmt.fmt.pix.width=1920;//图像宽度
	v4l2fmt.fmt.pix.height=1080;//图像高度
	v4l2fmt.fmt.pix.pixelformat=V4L2_PIX_FMT_YUYV;//YUYV颜色编码格式
	if(ioctl(fd,VIDIOC_S_FMT,&v4l2fmt))return -2;//设置格式失败
	printf("采集图像大小:%d*%d\n",v4l2fmt.fmt.pix.width,v4l2fmt.fmt.pix.height);
	imag_w=v4l2fmt.fmt.pix.width;
	imag_h=v4l2fmt.fmt.pix.height;
	/*3.申请缓冲区*/
	struct v4l2_requestbuffers v4l2reqbuf;
    memset(&v4l2reqbuf,0,sizeof(v4l2reqbuf));//初始化结构体
	v4l2reqbuf.count=4;//申请的缓冲区个数
	v4l2reqbuf.type=V4L2_BUF_TYPE_VIDEO_CAPTURE;//视频捕获格式
	v4l2reqbuf.memory=V4L2_MEMORY_MMAP;//内存映射
	if(ioctl(fd,VIDIOC_REQBUFS,&v4l2reqbuf))return -3;//申请缓冲区失败
	printf("申请的缓冲区个数:%d\n",v4l2reqbuf.count);
	/*4.将缓冲区映射到进程空间*/
	struct v4l2_buffer v4l2buf;
	memset(&v4l2buf,0,sizeof(v4l2buf));//初始化结构体
	v4l2buf.type=V4L2_BUF_TYPE_VIDEO_CAPTURE;//视频捕获格式
	v4l2buf.memory=V4L2_MEMORY_MMAP;//内存映射
	for(i=0;i<v4l2reqbuf.count;i++)
	{
		v4l2buf.index=i;/*缓冲区下标*/
		if(ioctl(fd,VIDIOC_QUERYBUF,&v4l2buf))return -4;//申请缓冲区失败
		video_buff[i]=mmap(NULL,v4l2buf.length,PROT_READ|PROT_WRITE,MAP_SHARED,fd,v4l2buf.m.offset);
		printf("video_buff[%d]=%p\n",i,video_buff[i]);
	}
	/*5.将映射的空间添加到采集队列*/
	memset(&v4l2buf,0,sizeof(v4l2buf));//初始化结构体
	v4l2buf.type=V4L2_BUF_TYPE_VIDEO_CAPTURE;//视频捕获格式
	v4l2buf.memory=V4L2_MEMORY_MMAP;//内存映射
	for(i=0;i<v4l2reqbuf.count;i++)
	{
		v4l2buf.index=i;/*缓冲区下标*/
		if(ioctl(fd,VIDIOC_QBUF,&v4l2buf))return -5;//添加到采集队列失败
	}
	/*6.开启摄像头*/
	int type=V4L2_BUF_TYPE_VIDEO_CAPTURE;//视频捕获格式
	if(ioctl(fd,VIDIOC_STREAMON,&type))return -6;//启动摄像头失败
	return fd;//成功返回摄像头文件描述符
}

3.2 采集图像数据

  循环采集图像数据,将一帧图像数据保存为BMP图片。
   由于摄像头图像颜色格式为YUYV格式,BMP图片颜色格式为RGB,因此需要将YUYV转RGB再写入到文件中。

  • YUYV转换RGB函数
/*YUYV转RGB888*/
void yuv_to_rgb(unsigned char *yuv_buffer,unsigned char *rgb_buffer,int iWidth,int iHeight)
{
	int x;
	int z=0;
	unsigned char *ptr = rgb_buffer;
	unsigned char *yuyv= yuv_buffer;
	for (x = 0; x < iWidth*iHeight; x++)
	{
		int r, g, b;
		int y, u, v;
		if (!z)
		y = yuyv[0] << 8;
		else
		y = yuyv[2] << 8;
		u = yuyv[1] - 128;
		v = yuyv[3] - 128;
		r = (y + (359 * v)) >> 8;
		g = (y - (88 * u) - (183 * v)) >> 8;
		b = (y + (454 * u)) >> 8;
		*(ptr++) = (b > 255) ? 255 : ((b < 0) ? 0 : b);
		*(ptr++) = (g > 255) ? 255 : ((g < 0) ? 0 : g);
		*(ptr++) = (r > 255) ? 255 : ((r < 0) ? 0 : r);
		if(z++)
		{
			z = 0;
			yuyv += 4;
		}
	}
}
  • 图像采集和BMP图片编码
int main()
{
	int fd=Camera_Init();
	if(fd<0)
	{
		printf("初始化摄像头失败,res=%d\n",fd);
		return 0;
	}
	printf("初始化摄像头成功\n");
	struct v4l2_buffer v4l2buf;
	memset(&v4l2buf,0,sizeof(v4l2buf));//初始化结构体
	v4l2buf.type=V4L2_BUF_TYPE_VIDEO_CAPTURE;//视频捕获格式
	v4l2buf.memory=V4L2_MEMORY_MMAP;//内存映射
	BMP_HEADER bmp_head;//bmp头数据
	BMP_INFO bmp_info;//位图数据
	memset(&bmp_head,0,sizeof(BMP_HEADER));
	memset(&bmp_info,0,sizeof(BMP_INFO));
	bmp_head.bfType='M'<<8|'B';//图片类型
	bmp_head.bfSize=imag_w*imag_h*3+sizeof(BMP_HEADER)+sizeof(BMP_INFO);
	bmp_head.bfOffBits=sizeof(BMP_INFO)+sizeof(BMP_HEADER);/*RGB颜色偏移量*/

	bmp_info.biSize=sizeof(BMP_INFO);//当前结构体大小
	bmp_info.biWidth=imag_w;//图片宽
	bmp_info.biHeight=imag_h;//图片高
	bmp_info.biPlanes=1;//固定为1
	bmp_info.biBitCount=24;//24位真彩色
	
	char *rgb=malloc(imag_w*imag_h*3);//存放rgb图像数据
	int count=1;
	char buff[20];
	FILE *fp;
	while(1)
	{
		/*从采集队列中取出图像数据*/
		if(ioctl(fd,VIDIOC_DQBUF,&v4l2buf))break;//取数据失败
		printf("v4l2buff[%d]=%p\n",v4l2buf.index,video_buff[v4l2buf.index]);
		/*将头数据和位图数据写入到文件中*/
		snprintf(buff,sizeof(buff),"./image/%d.bmp",count);//图片名字
		fp=fopen(buff,"w+b");
		if(fp==NULL)
		{
			printf("文件创建失败\n");
			continue;
		}
		count++;
		fwrite(&bmp_head,sizeof(BMP_HEADER),1,fp);//写头数据
		fwrite(&bmp_info,sizeof(BMP_INFO),1,fp);//写头数据
		/*将yuyv数据转换RGB888*/
		yuv_to_rgb(video_buff[v4l2buf.index],rgb,imag_w,imag_h);
		/*将颜色数据写入到文件中*/
		fwrite(rgb,imag_w*imag_h*3,1,fp);//写头数据
		fclose(fp);
		/*将缓冲区添加回采集队列中*/
		if(ioctl(fd,VIDIOC_QBUF,&v4l2buf))break;//添加到采集队列失败
	}
	close(fd);//关闭摄像头
	
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Linux下摄像头应用编程 的相关文章

  • PHP 从命令行启动 gui 程序,但 apache 不启动

    首先 我阅读了有类似问题的人的一些帖子 但所有答案都没有超出导出 DISPLAY 0 0 和 xauth cookies 这是我的问题 提前感谢您的宝贵时间 我开发了一个小库 它使用 OpenGL 和 GLSL 渲染货架 过去几天我将它包装
  • NPTL 和 POSIX 线程有什么区别?

    NPTL 和 POSIX 线程之间的基本区别是什么 这两者是如何演变的 POSIX 线程 pthread 不是一个实现 它是几个函数的 API 规范 纸上的标准 英文 其名称以pthread 以及定义在
  • Linux:在文件保存时触发 Shell 命令

    我想在修改文件时自动触发 shell 命令 我认为这可以通过注册 inotify 挂钩并调用来在代码中完成system 但是是否有更高级别的 bash 命令可以完成此任务 尝试 inotify 工具 我在复制链接时遇到问题 抱歉 但 Git
  • Linux 可执行文件与 OS X“兼容”吗?

    如果您在基于 Linux 的平台上用 C 语言编译一个程序 然后将其移植以使用 MacOS 库 它会工作吗 来自编译器的核心机器代码在 Mac 和 Linux 上兼容吗 我问这个问题的原因是因为两者都是 基于 UNIX 的 所以我认为这是真
  • 安装J语言的JQt IDE,出现错误

    我一直按照这里的说明进行操作 http code jsoftware com wiki System Installation Linux http code jsoftware com wiki System Installation L
  • 使用 sh 运行 bash 脚本

    我有 bash 脚本 它需要 bash 另一个人尝试运行它 sh script name sh 它失败了 因为 sh 是他的发行版中 dash 的符号链接 ls la bin sh lrwxrwxrwx 1 root root 4 Aug
  • ubuntu:升级软件(cmake)-版本消歧(本地编译)[关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 我的机器上安装了 cmake 2 8 0 来自 ubuntu 软件包 二进制文件放置在 usr bin cmake 中 我需要将 cmake 版本至少
  • PHP 无法打开流:是一个目录

    非常简单的 PHP 脚本 我在我亲自设置的 Ubuntu Web 服务器上的 EE 模板中运行 我知道这与权限有关 并且我已经将我尝试写入的目录的所有者更改为 Apache 用户 我得到的错误是 遇到 PHP 错误 严重性 警告 消息 fi
  • SSE:跨页边界的未对齐加载和存储

    我在页面边界旁边执行未对齐加载或存储之前读过某处 例如使用 mm loadu si128 mm storeu si128内在函数 代码应首先检查整个向量 在本例中为 16 个字节 是否属于同一页 如果不属于同一页 则切换到非向量指令 我知道
  • 查找哪些页面不再与写入时复制共享

    假设我在 Linux 中有一个进程 我从中fork 另一个相同的过程 后forking 因为原始进程将开始写入内存 Linux写时复制机制将为进程提供与分叉进程使用的不同的唯一物理内存页 在执行的某个时刻 我如何知道原始进程的哪些页面已被写
  • 内核模式下的线程(和进程)与用户模式下的线程(和进程)有什么区别?

    我的问题 1 书中现代操作系统 它说线程和进程可以处于内核模式或用户模式 但没有明确说明它们之间有什么区别 2 为什么内核态线程和进程的切换比用户态线程和进程的切换花费更多 3 现在 我正在学习Linux 我想知道如何在LINUX系统中分别
  • 如何在 Bash 中给定超时后终止子进程?

    我有一个 bash 脚本 它启动一个子进程 该进程时不时地崩溃 实际上是挂起 而且没有明显的原因 闭源 所以我对此无能为力 因此 我希望能够在给定的时间内启动此进程 如果在给定的时间内没有成功返回 则将其终止 有没有simple and r
  • 是否可以创建一个脚本来保存和恢复权限?

    我正在使用 Linux 系统 需要对一组嵌套文件和目录进行一些权限实验 我想知道是否没有某种方法可以保存文件和目录的权限 而不保存文件本身 换句话说 我想保存权限 编辑一些文件 调整一些权限 然后将权限恢复到目录结构中 将更改的文件保留在适
  • “make install”将库安装在 /usr/lib 而不是 /usr/lib64

    我正在尝试在 64 位 CentOS 7 2 上构建并安装一个库 为了这个目的我正在跑步 cmake DCMAKE BUILD TYPE Release DCMAKE INSTALL PREFIX usr DCMAKE C COMPILER
  • waitpid() 的作用是什么?

    有什么用waitpid 它通常用于等待特定进程完成 或者如果您使用特殊标志则更改状态 基于其进程 ID 也称为pid 它还可用于等待一组子进程中的任何一个 无论是来自特定进程组的子进程还是当前进程的任何子进程 See here http l
  • 子目录中的头文件(例如 gtk/gtk.h 与 gtk-2.0/gtk/gtk.h)

    我正在尝试使用 GTK 构建一个 hello world 其中包括以下行 include
  • Fortran gfortran linux 中的“分段错误(核心转储)”错误

    我正在创建一个程序 该程序将分析目录中的文件 fits 然后它将在另一个目录中创建另一个文件 txt 它只是一个转换器 当我尝试执行该程序 编译正常 时 它给了我一条错误消息 程序收到信号 SIGSEGV 分段错误 无效的内存引用 此错误的
  • 捕获实时流量时如何开启纳秒精度?

    如何告诉 libpcap v1 6 2 将纳秒值存储在struct pcap pkthdr ts tv usec 而不是微秒值 捕获实时数据包时 Note This question is similar to How to enable
  • 为什么C Clock()返回0

    我有这样的事情 clock t start end start clock something else end clock printf nClock cycles are d d n start end 我总是得到输出 时钟周期是 0
  • git 错误:无法处理 https

    当我尝试使用 git clone 时https xxx https xxx我收到以下错误我不处理协议 https 有人可以帮我吗 完整消息 dementrock dementrock A8Se git 克隆https git innosta

随机推荐

  • Flutter - 裁剪组件大全(ClipRect、ClipRRect、ClipOval、ClipPath)

    在Flutter中 提供了不少裁剪组件 可以帮助我们实现不同形状的组件 当然 如果需要特殊的形状 那就需要自定义裁剪组件了 ClipRect 矩形裁剪 ClipRect组件使用矩形裁剪子组件 通常情况下 ClipRect用于Center A
  • 【线性代数】最小二乘法的本质、施密特正交化的“前世今生”,投影的核心思想

    目录 一 处理无解线性方程组 1 1 解线性方程组无解的几何意义 1 2 寻求线性方程组的近似解 1 3 利用矩阵描述向一维直线的投影 1 4 利用Python计算无解线性方程组的近似解 二 深入剖析最小二乘法的本质 2 1 互补的子空间
  • 结构体初值设置问题小记

    文章目录 前言 esp32 panic报错LoadProhibited 原因探究 前言 在搞esp32 ota功能的时候 esp32一加上空中升级的功能 就不断重启 查了两天 才发现是结构体初始化赋值的问题 esp32 panic报错Loa
  • c++中函数参数值传递的方式

    在调用函数时 需要将变量值传递给函数参数 即给函数参数赋值 在c 中函数参数值传递有三种方式 按值传递 指针传递 参数地址传递 引用传递 下面简单介绍一下这三种方式的异同 一 按值传递 按值传递实质上就是将传递的变量值拷贝一个副本给函数参数
  • Mac 安装 brew

    转载自 https zhuanlan zhihu com p 90508170 Homebrew是一款包管理工具 目前支持macOS和linux系统 主要有四个部分组成 brew homebrew core homebrew cask ho
  • PN结的形成原理

    关于二极管的原理来自于PN结 下图为本征半导体 1 空穴与电子 动画中空穴是红的 电子是蓝的 其实我一直对空穴这个概念很抵触 因为从这个动画上来看空穴是不动的 但讲PN结 三极管的时候都会把空穴当成运动的载流子 虽然似乎也不是很难理解 P型
  • 使用阿里云服务器搭建简单的linux——web服务器

    使用阿里云服务器搭建简单的linux web服务器 云服务器的搭建方法有很多种 如 源码安装 yum在线安装 apt指令安装 再次介绍介绍一种自我是用的一种安装方式 1 首先 选用使用WinSCP工具来远程链接服务器的盘库管理 使用putt
  • 高德地图php定位我的位置,我的高德地图之定位,Marker,位置信息。

    高德地图 定位 Marker 本期给大家高德地图的展示 和定位 并显示popwindow 当前位置信息 滑动地图实时更新位置信息 界面预览 具体实现 新司机爬坑 界面预览 具体实现 地图控件和定位必须的 private AMap aMap
  • SpringBoot 整合Redis客户端lettuce,LPOS异常分析

    项目场景 项目场景 SpringBoot 整合Redis客户端lettuce 问题描述 整合Redis客户端lettuce出现异常 Caused by java lang NoSuchFieldError LPOS at org sprin
  • SeleniumLibrary4.5.0 关键字详解(三)

    SeleniumLibrary4 5 0 关键字详解 三 库版本 4 5 0 库范围 全局 命名参数 受支持 简介 SeleniumLibrary是Robot Framework的Web测试库 本文档说明了如何使用SeleniumLibra
  • 设计模式之原型模式(Prototype)摘录

    23种GOF设计模式一般分为三大类 创建型模式 结构型模式 行为模式 创建型模式包括 1 FactoryMethod 工厂方法模式 2 Abstract Factory 抽象工厂模式 3 Singleton 单例模式 4 Builder 建
  • Linux 性能优化的全景指南,可能都在这里了,建议收藏~

    更多专业文档请访问 www itilzj com Linux 性能优化 性能优化 性能指标 高并发和响应快对应着性能优化的两个核心指标 吞吐和延时 应用负载角度 直接影响了产品终端的用户体验 系统资源角度 资源使用率 饱和度等 性能问题的本
  • uniapp中获取dom元素的方法,更改dom元素颜色(遇坑记录)

    前言 最近写uniapp 遇到一个需要获取到页面中dom元素 我第一反应是使用this refs进行获取 于是我开心的使用this refs写了很多代码 使用h5调试的过程中没有发现任何问题 但后来真机调试的时候发现在app端无效 于是我查
  • ftp服务器内部文件,ftp服务器内部文件

    ftp服务器内部文件 内容精选 换一换 您需要提前准备好符合条件的镜像文件 并了解操作系统的已知问题 参见已知问题 表1中 网络 工具 驱动相关的配置需要在虚拟机内部完成 强烈建议您在原平台的虚拟机实施修改后 再导出镜像文件 当然 您也可以
  • 推进数字化转型进程,AntDB数据库协同神州云动共促新发展

    当今 数字化转型已成为企业发展的必由之路 随着新技术的不断发展和市场的日益竞争 越来越多的企业开始意识到数字化转型的重要性 在帮助企业数字化转型过程中 高效的客户关系管理软件和具有灵活性 可伸缩的数字底座 可以帮助企业突破管理瓶颈 降本增效
  • [1094]adb控台中Permission denied的解决方案

    前提 手机一定要root 在控制台中想要将电脑上c盘中的tcpdump文件导入到手机 data local tcpdump中 于是采用adb push c tcpdump data local tcpdump命令 但提示Permission
  • C语言快速入门(3)

    目录 1 操作符 1 2关系操作符 1 3自增自减操作符 1 3三目操作符 exp1 exp2 exp3 2 常见关键字 2 1常见关键字 2 2关键字typedef 2 3关键字static 2 3 1static修饰局部变量 2 3 2
  • Windows上安装Linux步骤(虚拟机与WSL)

    虚拟机方式 1 安装VMware 官网网址 https www vmware com cn products workstation pro html 1 选择正版或者试用版 我用于学习就选择试用版了 2 根据你所使用的系统选择下载版本 3
  • F110操作手册-自动付款

    SAP 系统 F110系统操作手册 目 录 1 自动付款 3 1 自动付款 事务代号 F110 菜单路径 会计 财务会计 应付帐款 期间处理 双击进入自动付款界面 填写好运行日期 标识 标识是为了后面的递交 审核等做个标记 便于查询 在中说
  • Linux下摄像头应用编程

    Linux下摄像头应用编程 V4L2是Video for linux2的简称 为linux中关于视频设备的内核驱动 在Linux中 视频设备是设备文件 可以像访问普通文件一样对其进行读写 摄像头在 dev video 下 如果只有一个视频设