USB摄像头使用记录

USB摄像头使用记录

文章目录

  • USB摄像头使用记录
    • 1.概述
      • 1.1 v4l2介绍
    • 2.使用
      • 2.1linux应用
      • 2.2linux驱动
    • 3.调试
      • 3.1应用调试
        • 3.1.1 获取并打印摄像头参数
        • 3.1.2get_data.c
    • 4.平台信息
    • 5.参考记录

1.概述

1.1 v4l2介绍


2.使用

2.1linux应用

2.1.1获取并打印摄像头参数


2.2linux驱动

3.调试

3.1应用调试

常用的VIDIOC命令

  1. VIDIOC_QUERYCAP (查询设备属性)2. VIDIOC_ENUM_FMT (显示所有支持的格式)3. VIDIOC_S_FMT (设置视频捕获格式)4. VIDIOC_G_FMT (获取硬件现在的视频捕获格式)5. VIDIOC_TRY_FMT (检查是否支持某种帧格式)6. VIDIOC_ENUM_FRAMESIZES (枚举设备支持的分辨率信息)7. VIDIOC_ENUM_FRAMEINTERVALS (获取设备支持的帧间隔)8. VIDIOC_S_PARM && VIDIOC_G_PARM (设置和获取流参数)9. VIDIOC_QUERYCAP (查询驱动的修剪能力)10. VIDIOC_S_CROP (设置视频信号的边框)11. VIDIOC_G_CROP (读取设备信号的边框)12. VIDIOC_REQBUFS (向设备申请缓存区)13. VIDIOC_QUERYBUF (获取缓存帧的地址、长度)14. VIDIOC_QBUF (把帧放入队列)15. VIDIOC_DQBUF (从队列中取出帧)16. VIDIOC_STREAMON && VIDIOC_STREAMOFF (启动/停止视频数据流)

原文链接:https://blog.csdn.net/mark_minge/article/details/81427489

3.1.1 获取并打印摄像头参数

头文件:

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <sys/ioctl.h>
#include <unistd.h>
#include <stdio.h>
#include <string.h>
#include <linux/types.h>          
#include <linux/videodev2.h>         /* for videodev2.h */

关键结构体:

struct v4l2_fmtdesc
{u32 index; 			// 要查询的格式序号,应用程序设置enum v4l2_buf_type type; 	// 帧类型,应用程序设置u32 flags; 			// 是否为压缩格式u8 description[32]; 		// 格式名称u32 pixelformat;		// 格式u32 reserved[4]; 		// 保留
};
struct v4l2_frmsizeenum {__u32 index; /* Frame size number */__u32 pixel_format; /* 像素格式 */__u32 type; /* type */union { /* Frame size */struct v4l2_frmsize_discrete discrete;struct v4l2_frmsize_stepwise stepwise;
};__u32 reserved[2]; /* Reserved space for future use */
};struct v4l2_frmsize_discrete {__u32 width; /* Frame width [pixel] */__u32 height; /* Frame height [pixel] */
};

.c

/** @Descripttion: * @version: * @Author: Andy* @Date: 2024-05-26 00:03:08* @LastEditors: Andy* @LastEditTime: 2024-05-26 00:06:05*/
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <sys/ioctl.h>
#include <unistd.h>
#include <stdio.h>
#include <string.h>
#include <linux/types.h>          /* for videodev2.h */
#include <linux/videodev2.h>/* ./video_test </dev/video0> */int main(int argc, char **argv)
{int fd;struct v4l2_fmtdesc fmtdesc;struct v4l2_frmsizeenum fsenum;int fmt_index = 0;int frame_index = 0;if (argc != 2){printf("Usage: %s </dev/videoX>, print format detail for video device\n", argv[0]);return -1;}/* open */fd = open(argv[1], O_RDWR);if (fd < 0){printf("can not open %s\n", argv[1]);return -1;}while (1){/* 枚举格式 */fmtdesc.index = fmt_index;  // 比如从0开始fmtdesc.type  = V4L2_BUF_TYPE_VIDEO_CAPTURE;  // 指定type为"捕获"if (0 != ioctl(fd, VIDIOC_ENUM_FMT, &fmtdesc))break;frame_index = 0;while (1){/* 枚举这种格式所支持的帧大小 */memset(&fsenum, 0, sizeof(struct v4l2_frmsizeenum));fsenum.pixel_format = fmtdesc.pixelformat;fsenum.index = frame_index;if (ioctl(fd, VIDIOC_ENUM_FRAMESIZES, &fsenum) == 0){printf("format %s,%d, framesize %d: %d x %d\n", fmtdesc.description, fmtdesc.pixelformat, frame_index, fsenum.discrete.width, fsenum.discrete.height);}else{break;}frame_index++;}fmt_index++;}return 0;
}
3.1.2get_data.c

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <sys/ioctl.h>
#include <unistd.h>
#include <stdio.h>
#include <string.h>
#include <linux/types.h>          /* for videodev2.h */
#include <linux/videodev2.h>
#include <poll.h>
#include <sys/mman.h>/* ./video_test </dev/video0> */int main(int argc, char **argv)
{int fd;struct v4l2_fmtdesc fmtdesc;struct v4l2_frmsizeenum fsenum;int fmt_index = 0;int frame_index = 0;int i;void *bufs[32];int buf_cnt;int type = V4L2_BUF_TYPE_VIDEO_CAPTURE;struct pollfd fds[1];char filename[32];int file_cnt = 0;if (argc != 2){printf("Usage: %s </dev/videoX>, print format detail for video device\n", argv[0]);return -1;}/* open */fd = open(argv[1], O_RDWR);if (fd < 0){printf("can not open %s\n", argv[1]);return -1;}/* 查询能力 */struct v4l2_capability cap;memset(&cap, 0, sizeof(struct v4l2_capability));if (0 == ioctl(fd, VIDIOC_QUERYCAP, &cap)){        if((cap.capabilities & V4L2_CAP_VIDEO_CAPTURE) == 0) {fprintf(stderr, "Error opening device %s: video capture not supported.\n",argv[1]);return -1;}if(!(cap.capabilities & V4L2_CAP_STREAMING)) {fprintf(stderr, "%s does not support streaming i/o\n", argv[1]);return -1;}}else{printf("can not get capability\n");return -1;}while (1){/* 枚举格式 */fmtdesc.index = fmt_index;  // 比如从0开始fmtdesc.type  = V4L2_BUF_TYPE_VIDEO_CAPTURE;  // 指定type为"捕获"if (0 != ioctl(fd, VIDIOC_ENUM_FMT, &fmtdesc))break;frame_index = 0;while (1){/* 枚举这种格式所支持的帧大小 */memset(&fsenum, 0, sizeof(struct v4l2_frmsizeenum));fsenum.pixel_format = fmtdesc.pixelformat;fsenum.index = frame_index;if (ioctl(fd, VIDIOC_ENUM_FRAMESIZES, &fsenum) == 0){printf("format %s,%d, framesize %d: %d x %d\n", fmtdesc.description, fmtdesc.pixelformat, frame_index, fsenum.discrete.width, fsenum.discrete.height);}else{break;}frame_index++;}fmt_index++;}/* 设置格式 */struct v4l2_format fmt;memset(&fmt, 0, sizeof(struct v4l2_format));fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;fmt.fmt.pix.width = 1024;fmt.fmt.pix.height = 768;fmt.fmt.pix.pixelformat = V4L2_PIX_FMT_MJPEG;fmt.fmt.pix.field = V4L2_FIELD_ANY;if (0 == ioctl(fd, VIDIOC_S_FMT, &fmt)){printf("set format ok: %d x %d\n", fmt.fmt.pix.width, fmt.fmt.pix.height);}else{printf("can not set format\n");return -1;}/** 申请buffer*/struct v4l2_requestbuffers rb;memset(&rb, 0, sizeof(struct v4l2_requestbuffers));rb.count = 32;rb.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;rb.memory = V4L2_MEMORY_MMAP;if (0 == ioctl(fd, VIDIOC_REQBUFS, &rb)){/* 申请成功后, mmap这些buffer */buf_cnt = rb.count;for(i = 0; i < rb.count; i++) {struct v4l2_buffer buf;memset(&buf, 0, sizeof(struct v4l2_buffer));buf.index = i;buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;buf.memory = V4L2_MEMORY_MMAP;if (0 == ioctl(fd, VIDIOC_QUERYBUF, &buf)){/* mmap */bufs[i] = mmap(0 /* start anywhere */ ,buf.length, PROT_READ | PROT_WRITE, MAP_SHARED, fd,buf.m.offset);if(bufs[i] == MAP_FAILED) {perror("Unable to map buffer");return -1;}}else{printf("can not query buffer\n");return -1;}            }printf("map %d buffers ok\n", buf_cnt);}else{printf("can not request buffers\n");return -1;}/* 把所有buffer放入"空闲链表" */for(i = 0; i < buf_cnt; ++i) {struct v4l2_buffer buf;memset(&buf, 0, sizeof(struct v4l2_buffer));buf.index = i;buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;buf.memory = V4L2_MEMORY_MMAP;if (0 != ioctl(fd, VIDIOC_QBUF, &buf)){perror("Unable to queue buffer");return -1;}}printf("queue buffers ok\n");/* 启动摄像头 */if (0 != ioctl(fd, VIDIOC_STREAMON, &type)){perror("Unable to start capture");return -1;}printf("start capture ok\n");while (1){/* poll */memset(fds, 0, sizeof(fds));fds[0].fd = fd;fds[0].events = POLLIN;if (1 == poll(fds, 1, -1)){/* 把buffer取出队列 */struct v4l2_buffer buf;memset(&buf, 0, sizeof(struct v4l2_buffer));buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;buf.memory = V4L2_MEMORY_MMAP;if (0 != ioctl(fd, VIDIOC_DQBUF, &buf)){perror("Unable to dequeue buffer");return -1;}/* 把buffer的数据存为文件 */sprintf(filename, "video_raw_data_%04d.jpg", file_cnt++);int fd_file = open(filename, O_RDWR | O_CREAT, 0666);if (fd_file < 0){printf("can not create file : %s\n", filename);}printf("capture to %s\n", filename);write(fd_file, bufs[buf.index], buf.bytesused);close(fd_file);/* 把buffer放入队列 */if (0 != ioctl(fd, VIDIOC_QBUF, &buf)){perror("Unable to queue buffer");return -1;}}}if (0 != ioctl(fd, VIDIOC_STREAMOFF, &type)){perror("Unable to stop capture");return -1;}printf("stop capture ok\n");close(fd);return 0;
}

3.1.3 ctrl_light


#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <sys/ioctl.h>
#include <unistd.h>
#include <stdio.h>
#include <string.h>
#include <linux/types.h>          /* for videodev2.h */
#include <linux/videodev2.h>
#include <poll.h>
#include <sys/mman.h>
#include <pthread.h>/* ./video_test </dev/video0> */static void *thread_brightness_control (void *args)
{int fd = (int)args;unsigned char c;int brightness;int delta;struct v4l2_queryctrl   qctrl;memset(&qctrl, 0, sizeof(qctrl));qctrl.id = V4L2_CID_BRIGHTNESS; // V4L2_CID_BASE+0;if (0 != ioctl(fd, VIDIOC_QUERYCTRL, &qctrl)){printf("can not query brightness\n");return NULL;}printf("brightness min = %d, max = %d\n", qctrl.minimum, qctrl.maximum);delta = (qctrl.maximum - qctrl.minimum) / 10;struct v4l2_control ctl;ctl.id = V4L2_CID_BRIGHTNESS; // V4L2_CID_BASE+0;ioctl(fd, VIDIOC_G_CTRL, &ctl);while (1){c = getchar();if (c == 'u' || c == 'U'){ctl.value += delta;}else if (c == 'd' || c == 'D'){ctl.value -= delta;}if (ctl.value > qctrl.maximum)ctl.value = qctrl.maximum;if (ctl.value < qctrl.minimum)ctl.value = qctrl.minimum;ioctl(fd, VIDIOC_S_CTRL, &ctl);}return NULL;
}int main(int argc, char **argv)
{int fd;struct v4l2_fmtdesc fmtdesc;struct v4l2_frmsizeenum fsenum;int fmt_index = 0;int frame_index = 0;int i;void *bufs[32];int buf_cnt;int type = V4L2_BUF_TYPE_VIDEO_CAPTURE;struct pollfd fds[1];char filename[32];int file_cnt = 0;if (argc != 2){printf("Usage: %s </dev/videoX>, print format detail for video device\n", argv[0]);return -1;}/* open */fd = open(argv[1], O_RDWR);if (fd < 0){printf("can not open %s\n", argv[1]);return -1;}/* 查询能力 */struct v4l2_capability cap;memset(&cap, 0, sizeof(struct v4l2_capability));if (0 == ioctl(fd, VIDIOC_QUERYCAP, &cap)){        if((cap.capabilities & V4L2_CAP_VIDEO_CAPTURE) == 0) {fprintf(stderr, "Error opening device %s: video capture not supported.\n",argv[1]);return -1;}if(!(cap.capabilities & V4L2_CAP_STREAMING)) {fprintf(stderr, "%s does not support streaming i/o\n", argv[1]);return -1;}}else{printf("can not get capability\n");return -1;}while (1){/* 枚举格式 */fmtdesc.index = fmt_index;  // 比如从0开始fmtdesc.type  = V4L2_BUF_TYPE_VIDEO_CAPTURE;  // 指定type为"捕获"if (0 != ioctl(fd, VIDIOC_ENUM_FMT, &fmtdesc))break;frame_index = 0;while (1){/* 枚举这种格式所支持的帧大小 */memset(&fsenum, 0, sizeof(struct v4l2_frmsizeenum));fsenum.pixel_format = fmtdesc.pixelformat;fsenum.index = frame_index;if (ioctl(fd, VIDIOC_ENUM_FRAMESIZES, &fsenum) == 0){printf("format %s,%d, framesize %d: %d x %d\n", fmtdesc.description, fmtdesc.pixelformat, frame_index, fsenum.discrete.width, fsenum.discrete.height);}else{break;}frame_index++;}fmt_index++;}/* 设置格式 */struct v4l2_format fmt;memset(&fmt, 0, sizeof(struct v4l2_format));fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;fmt.fmt.pix.width = 1024;fmt.fmt.pix.height = 768;fmt.fmt.pix.pixelformat = V4L2_PIX_FMT_MJPEG;fmt.fmt.pix.field = V4L2_FIELD_ANY;if (0 == ioctl(fd, VIDIOC_S_FMT, &fmt)){printf("set format ok: %d x %d\n", fmt.fmt.pix.width, fmt.fmt.pix.height);}else{printf("can not set format\n");return -1;}/** 申请buffer*/struct v4l2_requestbuffers rb;memset(&rb, 0, sizeof(struct v4l2_requestbuffers));rb.count = 32;rb.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;rb.memory = V4L2_MEMORY_MMAP;if (0 == ioctl(fd, VIDIOC_REQBUFS, &rb)){/* 申请成功后, mmap这些buffer */buf_cnt = rb.count;for(i = 0; i < rb.count; i++) {struct v4l2_buffer buf;memset(&buf, 0, sizeof(struct v4l2_buffer));buf.index = i;buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;buf.memory = V4L2_MEMORY_MMAP;if (0 == ioctl(fd, VIDIOC_QUERYBUF, &buf)){/* mmap */bufs[i] = mmap(0 /* start anywhere */ ,buf.length, PROT_READ | PROT_WRITE, MAP_SHARED, fd,buf.m.offset);if(bufs[i] == MAP_FAILED) {perror("Unable to map buffer");return -1;}}else{printf("can not query buffer\n");return -1;}            }printf("map %d buffers ok\n", buf_cnt);}else{printf("can not request buffers\n");return -1;}/* 把所有buffer放入"空闲链表" */for(i = 0; i < buf_cnt; ++i) {struct v4l2_buffer buf;memset(&buf, 0, sizeof(struct v4l2_buffer));buf.index = i;buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;buf.memory = V4L2_MEMORY_MMAP;if (0 != ioctl(fd, VIDIOC_QBUF, &buf)){perror("Unable to queue buffer");return -1;}}printf("queue buffers ok\n");/* 启动摄像头 */if (0 != ioctl(fd, VIDIOC_STREAMON, &type)){perror("Unable to start capture");return -1;}printf("start capture ok\n");/* 创建线程用来控制亮度 */pthread_t thread;pthread_create(&thread, NULL, thread_brightness_control, (void *)fd);while (1){/* poll */memset(fds, 0, sizeof(fds));fds[0].fd = fd;fds[0].events = POLLIN;if (1 == poll(fds, 1, -1)){/* 把buffer取出队列 */struct v4l2_buffer buf;memset(&buf, 0, sizeof(struct v4l2_buffer));buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;buf.memory = V4L2_MEMORY_MMAP;if (0 != ioctl(fd, VIDIOC_DQBUF, &buf)){perror("Unable to dequeue buffer");return -1;}/* 把buffer的数据存为文件 */sprintf(filename, "video_raw_data_%04d.jpg", file_cnt++);int fd_file = open(filename, O_RDWR | O_CREAT, 0666);if (fd_file < 0){printf("can not create file : %s\n", filename);}printf("capture to %s\n", filename);write(fd_file, bufs[buf.index], buf.bytesused);close(fd_file);/* 把buffer放入队列 */if (0 != ioctl(fd, VIDIOC_QBUF, &buf)){perror("Unable to queue buffer");return -1;}}}if (0 != ioctl(fd, VIDIOC_STREAMOFF, &type)){perror("Unable to stop capture");return -1;}printf("stop capture ok\n");close(fd);return 0;
}

4.平台信息

开发板:韦东山imx6ull

摄像头:韦东山usb免驱摄像头

涉及软件:

乌班图
vscode
MobaXterm

linux版本:Linux-4.9.88

5.参考记录

博客

正点原子:

【正点原子Linux连载】第二十章 V4L2摄像头应用编程-摘自【正点原子】I.MX6U嵌入式Linux C应用编程指南V1.1_v4l2驱动框架 正点原子-CSDN博客

视频

韦东山:

03_V4L2应用程序开发_列出帧细节_哔哩哔哩_bilibili

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/17362.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【掌握递归:以斐波那契数列为例】

文章目录 前言斐波那契数列简介使用递归计算斐波那契数递归的优点与缺点优化递归算法结论 前言 递归是编程中一种强有力的技术&#xff0c;它允许一个函数调用自身来解决问题。尽管递归在初学者中可能看起来有些难以理解&#xff0c;但通过实际的例子和练习&#xff0c;它可以…

Docker快速安装SQL Server 2022

说明&#xff1a; 系统&#xff1a;Ubuntu 24.04 LTS 拉取SQL Server Docker镜像 docker pull mcr.microsoft.com/mssql/server:2022-CU12-ubuntu-22.04创建数据目录 sudo mkdir /var/mssql_data sudo chmod 777 /var/mssql_data说明&#xff1a; 权限设置为777&#xff0…

thinkphp6的请求

由于笔者是刚入门thinkphp&#xff0c;所以学习时对照thinkphp的官网&#xff0c;各位读者也可以对照官网学习。还麻烦各位笔者一键三连&#xff0c;谢谢。 1.请求对象 当前的请求对象由think\Request类负责&#xff0c;该类不需要单独实例化调用&#xff0c;通常使用依赖注入…

ubuntu下vscode的安装包

1.引言 ubuntu下面安装vscode&#xff0c;编码调用接口时可以跳到接口api的位置&#xff0c;因此在ubuntu下安装vscode还是非常有意义的。 2.下载地址 链接&#xff1a;https://pan.baidu.com/s/1j3XNmvbL574p_hYeBqO6dg?pwdryr7 提取码&#xff1a;ryr7 --来自百度网盘超…

如何应对触摸一体机触摸屏失灵问题?怎么校准?

触摸一体机是一种功能强大的设备&#xff0c;集成了电脑、电视和触摸屏等多种功能。其中&#xff0c;触摸屏是其重要组成部分之一。然而&#xff0c;当触摸屏突然失灵时&#xff0c;我们该如何应对呢&#xff1f;以下是一些建议&#xff0c;以帮助您排除问题并重新获得正常触摸…

2024 年你应该选择哪个开源大模型?

自2017年发表的论文《Attention Is All You Need》发明了Transformer架构以来&#xff0c;自然语言处理&#xff08;NLP&#xff09;取得了巨大的进展。随着2022年11月ChatGPT的发布&#xff0c;大型语言模型&#xff08;LLM&#xff09;引起了广泛关注。 你是否想在自己的用例…

通过Zerossl给IP申请免费SSL证书, 实现https ip访问

参考通过Zerossl给IP申请免费SSL证书 | LogDicthttps://www.logdict.com/archives/tong-guo-zerosslgei-ipshen-qing-mian-fei-sslzheng-shu

授权调用: 介绍 Transformers 智能体 2.0

简要概述 我们推出了 Transformers 智能体 2.0&#xff01; ⇒ &#x1f381; 在现有智能体类型的基础上&#xff0c;我们新增了两种能够 根据历史观察解决复杂任务的智能体。 ⇒ &#x1f4a1; 我们致力于让代码 清晰、模块化&#xff0c;并确保最终提示和工具等通用属性透明化…

关于指针和数组的一些经典笔试题解析

前言 大家好&#xff0c;本篇博客将为大家展示一些曾经考过的关于指针的经典笔试题&#xff0c;里面有些题目的难度还是不小的&#xff0c;所以希望大家可以认真理解&#xff1b;如果你点开了本篇博客&#xff0c;麻烦各位大佬一键三连&#xff0c;多多支持&#xff0c;感谢&a…

MATLAB算法实战应用案例精讲-【数模应用】NPS净推荐值分析

目录 前言 几个高频面试题目 NPS如何解决运营人客户忠诚度低落问题

只读存储器(ROM)和并行存储器简介

目录 只读存储器&#xff08;ROM&#xff09; ROM的工作原理 ROM的特点 ROM的应用 并行存储器 并行存储器的工作原理 并行存储器的特点 并行存储器的应用 结论 在计算机体系结构中&#xff0c;存储器起着至关重要的作用&#xff0c;它负责存储和检索数据与指令。只读存…

Aws CodeCommit代码仓储库

1 创建IAM用户 IAM创建admin用户&#xff0c;增加AWSCodeCommitFullAccess权限 2 创建存储库 CodePipeline -> CodeCommit -> 存储库 创建存储库 3 SSH 1) window环境 3.1.1 上载SSH公有秘钥 生成SSH秘钥ID 3.1.2 编辑本地 ~/.ssh 目录中名为“config”的 SSH 配置文…

JRT连接希森美康出图

上一篇用JRT连设备实现了比较有难度的Sebia绘图设备和TCP模式连接。这次连接最常见的检验设备&#xff08;西森美康&#xff09;&#xff0c;读文件和图上传出图。 视频演示 结果格式 通道对应 接口设置 接口处理实现&#xff0c;JRT设备连接全部采用CMD驱动方式实现&am…

The First项目报告:解读去中心化衍生品交易所AVEO

2023 年12月8日凌晨&#xff0c;Solana 生态 MEV 基础设施开发商 Jito Labs 开放了 JTO 空投申领窗口&#xff0c;JTO 的价格在开盘短暂震荡后迅速攀高&#xff0c;一度触及 4.94 美元。 JTO 是加密社区这两日关注的热门标的&#xff0c;而在这场讨论中&#xff0c;除 Solana …

springboot 集成 es--未完结

基于es7.10.x版本 一、前提知识 常见的两种方式&#xff1a;spring boot提供的API 和 ES 官方提供的API ES官方&#xff1a; RestHighLevelClient&#xff1a; 适用于复杂、更细粒度控制的Elasticsearch 操作 spring boot&#xff1a; ElasticsearchRestTemplate&#xff1a…

【无标题】MySQL基础命令

好的&#xff0c;以下是15个常见的MySQL命令及其解释&#xff1a; ### 1. 连接到MySQL服务器 sql mysql -u username -p - **解释**&#xff1a;使用指定的用户名连接到MySQL服务器&#xff0c;-p表示需要输入密码。 ### 2. 显示数据库列表 sql SHOW DATABASES; - **解释**…

AI智能体研发之路-模型篇(四):一文入门pytorch开发

博客导读&#xff1a; 《AI—工程篇》 AI智能体研发之路-工程篇&#xff08;一&#xff09;&#xff1a;Docker助力AI智能体开发提效 AI智能体研发之路-工程篇&#xff08;二&#xff09;&#xff1a;Dify智能体开发平台一键部署 AI智能体研发之路-工程篇&#xff08;三&am…

C++ | Leetcode C++题解之第115题不同的子序列

题目&#xff1a; 题解&#xff1a; class Solution { public:int numDistinct(string s, string t) {int m s.length(), n t.length();if (m < n) {return 0;}vector<vector<unsigned long long>> dp(m 1, vector<unsigned long long>(n 1));for (i…

[docker] docker 安全知识 - 镜像,port registry

[docker] docker 安全知识 - 镜像&#xff0c;port & registry 这是第一篇&#xff0c;安全部分还有一篇笔记就记完了 说实话&#xff0c;看完了要学的这些东西&#xff0c;感觉大多数安全问题都可以通过验证登录的合法性去解决 镜像 镜像的问题还是比较多的&#xff0…

Mybatis——入门

新建 idea 准备 数据库 create table user(id int unsigned primary key auto_increment comment ID,name varchar(100) comment 姓名,age tinyint unsigned comment 年龄,gender tinyint unsigned comment 性别, 1:男, 2:女,phone varchar(11) comment 手机号 ) comment 用…