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

介绍营销的网站郑州航海路网站建设

介绍营销的网站,郑州航海路网站建设,建设一个大型网站大概费用,百度爱采购怎么优化排名ALPHA/Mini I.MX6U 开发板配套支持多种不同的摄像头#xff0c;包括正点原子的 ov5640#xff08;500W像素#xff09;、 ov2640#xff08;200W 像素#xff09;以及 ov7725#xff08;不带 FIFO、30W 像素#xff09;这三款摄像头#xff0c;在开发板出厂系统上…ALPHA/Mini I.MX6U 开发板配套支持多种不同的摄像头包括正点原子的 ov5640500W像素、 ov2640200W 像素以及 ov7725不带 FIFO、30W 像素这三款摄像头在开发板出厂系统上可以使用这些摄像头当然除此之外我们还可以使用 USB 摄像头直接将 USB 摄像头插入到开发板上的 USB接口即可本章我们就来学习 Linux 下的摄像头应用编程。 本章将会讨论如下主题内容。 ⚫ V4L2 简介 ⚫ V4L2 设备应用编程介绍 ⚫ 摄像头应用编程实战 V4L2 简介 大家可以看到我们本章的标题叫做“V4L2 摄像头应用编程”那什么是 V4L2 呢对 Linux 下摄像头 驱动程序开发有过了解的读者应该知道这是什么意思。 V4L2 是 Video for linux two 的简称是 Linux 内核中视频类设备的一套驱动框架为视频类设备驱动开发和应用层提供了一套统一的接口规范那什么是视频类设备呢一个非常典型的视频类设备就是视频采集设备譬如各种摄像头当然还包括其它类型视频类设备这里就不再给介绍了。 使用 V4L2 设备驱动框架注册的设备会在 Linux 系统/dev/目录下生成对应的设备节点文件设备节点的名称通常为 videoXX 标准一个数字编号0、1、2、3……每一个 videoX 设备文件就代表一个视频类设备。应用程序通过对 videoX 设备文件进行 I/O 操作来配置、使用设备类设备下小节将向大家详细介绍 V4L2 摄像头应用程序 V4L2 设备驱动框架向应用层提供了一套统一、标准的接口规范应用程序按照该接口规范来进行应用编程从而使用摄像头。对于摄像头设备来说其编程模式如下所示 1. 首先是打开摄像头设备 2. 查询设备的属性或功能 3. 设置设备的参数譬如像素格式、帧大小、帧率 4. 申请帧缓冲、内存映射 5. 帧缓冲入队 6. 开启视频采集 7. 帧缓冲出队、对采集的数据进行处理 8. 处理完后再次将帧缓冲入队往复 9. 结束采集。 流程图如下所示 从流程图中可以看到几乎对摄像头的所有操作都是通过 ioctl()来完成搭配不同的 V4L2 指令request参数请求不同的操作这些指令定义在头文件 linux/videodev2.h 中在摄像头应用程序代码中需要包含头文件 linux/videodev2.h该头文件中申明了很多与摄像头应用编程相关的数据结构以及宏定义大家可以打开这个头文件看看。 在 videodev2.h 头文件中定义了很多 ioctl()的指令以宏定义的形式提供VIDIOC_XXX如下所示 每一个 不 同 的 指 令 宏 就 表 示 向 设 备 请 求 不 同 的 操 作 从 上 面 可 以 看 到 每 一 个 宏 后 面_IOWR/_IOR/_IOW还携带了一个 struct 数据结构体譬如 struct v4l2_capability、struct v4l2_fmtdesc这就是调用 ioctl()时需要传入的第三个参数的类型调用 ioctl()前定义一个该类型变量调用 ioctl()时、将变量的指针作为 ioctl()的第三个参数传入譬如 在实际的应用编程中并不是所有的指令都会用到针对视频采集类设备以下笔者列出了一些常用的指令 打开摄像头 视频类设备对应的设备节点为/dev/videoXX 为数字编号通常从 0 开始摄像头应用编程的第一步便是打开设备调用 open 打开得到文件描述符 fd如下所示 打开设备文件时需要使用 O_RDWR 指定读权限和写权限。 查询设备的属性/能力/功能 打开设备之后接着需要查询设备的属性确定该设备是否是一个视频采集类设备、以及其它一些属性怎么查询呢自然是通过 ioctl()函数来实现ioctl()对于设备文件来说是一个非常重要的系统调用凡是涉及到配置设备、获取设备配置等操作都会使用 ioctl 来完成在前面章节内容中我们就已经见识过了 但对于普通文件来说ioctl()几乎没什么用。 查询设备的属性使用的指令为 VIDIOC_QUERYCAP如下所示 ioctl(int fd, VIDIOC_QUERYCAP, struct v4l2_capability *cap); 此时通过 ioctl()将获取到一个 struct v4l2_capability 类型数据struct v4l2_capability 数据结构描述了设备的一些属性结构体定义如下所示 我们重点关注的是 capabilities 字段该字段描述了设备拥有的能力该字段的值如下可以是以下任意一个值或多个值的位或关系 这些宏都是在videodev2.h头文件中所定义的大家可以自己去看。对于摄像头设备来说它的capabilities字段必须包含 V4L2_CAP_VIDEO_CAPTURE表示它支持视频采集功能。所以我们可以通过判断 capabilities字段是否包含 V4L2_CAP_VIDEO_CAPTURE、来确定它是否是一个摄像头设备譬如 设置帧格式、帧率 一个摄像头通常会支持多种不同的像素格式譬如 RGB、YUYV 以及压缩格式 MJPEG 等并且还支持多种不同的视频采集分辨率譬如 640*480、320*240、1280*720 等除此之外同一分辨率可能还支持多种不同的视频采集帧率15fps、30fps。所以通常在进行视频采集之前、需要在应用程序中去设置这些参数。 a)枚举出摄像头支持的所有像素格式VIDIOC_ENUM_FMT 要设置像素格式首先得知道该设备支持哪些像素格式如何得知呢使用 VIDIOC_ENUM_FMT 指令 ioctl(int fd, VIDIOC_ENUM_FMT, struct v4l2_fmtdesc *fmtdesc); 使用 VIDIOC_ENUM_FMT 可以枚举出设备所支持的所有像素格式调用 ioctl()需要传入一个 struct v4l2_fmtdesc *指针ioctl()会将获取到的数据写入到 fmtdesc 指针所指向的对象中。struct v4l2_fmtdesc 结构体描述了像素格式相关的信息我们来看看 struct v4l2_fmtdesc 结构体的定义 index 表示编号在枚举之前需将其设置为 0然后每次 ioctl()调用之后将其值加 1。一次 ioctl()调用只能得到一种像素格式的信息如果设备支持多种像素格式则需要循环调用多次通过 index 来控制index 从 0 开始调用一次 ioctl()之后加 1直到 ioctl()调用失败表示已经将所有像素格式都枚举出来了 所以 index 就是一个编号获取 index 编号指定的像素格式。 description 字段是一个简单地描述性字符串简单描述 pixelformat 像素格式。 pixelformat 字段则是对应的像素格式编号这是一个无符号 32 位数据每一种像素格式都会使用一个u32 类型数据来表示如下所示 以上列举出来的只是其中一部分篇幅有限、不能将所有的像素格式都列举出来大家可以自己查看videodev2.h 头文件。可以看到后面有一个 v4l2_fourcc 宏其实就是通过这个宏以及对应的参数合成的一个u32 类型数据。 type 字段指定类型表示我们要获取设备的哪种功能对应的像素格式因为有些设备它可能即支持视频采集功能、又支持视频输出等其它的功能type 字段可取值如下 type 字 段 需 要 在 调 用 ioctl() 之 前 设 置 它 的 值 对 于 摄 像 头 需 要 将 type 字 段 设 置 为 V4L2_BUF_TYPE_VIDEO_CAPTURE指定我们将要获取的是视频采集的像素格式。 使用示例如下所示 b)枚举摄像头所支持的所有视频采集分辨率VIDIOC_ENUM_FRAMESIZES 使用 VIDIOC_ENUM_FRAMESIZES 指令可以枚举出设备所支持的所有视频采集分辨率用法如下所示 ioctl(int fd, VIDIOC_ENUM_FRAMESIZES, struct v4l2_frmsizeenum *frmsize); 调用 ioctl()需要传入一个 struct v4l2_frmsizeenum *指针ioctl()会将获取到的数据写入到 frmsize 指针所指向的对象中。struct v4l2_frmsizeenum 结构体描述了视频帧大小相关的信息我们来看看 struct v4l2_frmsizeenum 结构体的定义 index 字段与 struct v4l2_fmtdesc 结构体的 index 字段意义相同一个摄像头通常支持多种不同的视频采集分辨率一次 ioctl()调用只能得到一种视频帧大小信息如果设备支持多种视频帧大小则需要循环调用多次通过 index 来控制。 pixel_format 字段指定像素格式而 type 字段与 struct v4l2_fmtdesc 结构体的 type 字段意义相同在调用 ioctl()之前需要先设置 type 字段与 pixel_format 字段确定我们将要枚举的是设备的哪种功能、哪种像素格式支持的视频帧大小。 可以看到 struct v4l2_frmsizeenum 结构体中有一个 union 共用体 type V4L2_BUF_TYPE_VIDEO_CAPTURE 情况下discrete 生效这是一个 struct v4l2_frmsize_discrete 类型变量描述了视频帧大小信息包括视频帧的宽度和高度也就是视频采集分辨率大小。 譬如我们要枚举出摄像头 RGB565 像素格式所支持的所有视频帧大小 c)枚举摄像头所支持的所有视频采集帧率VIDIOC_ENUM_FRAMEINTERVALS 同一种视频帧大小摄像头可能会支持多种不同的视频采集帧率譬如常见的 15fps、30fps、45fps 以及 60fps 等使用 VIDIOC_ENUM_FRAMEINTERVALS 指令可以枚举出设备所支持的所有帧率使用方式如下 ioctl(int fd, VIDIOC_ENUM_FRAMEINTERVALS, struct v4l2_frmivalenum *frmival); 调用 ioctl()需要传入一个 struct v4l2_frmivalenum *指针ioctl()会将获取到的数据写入到 frmival 指针所指 向 的 对象 中 。 struct v4l2_frmivalenum 结构 体描 述 了 视频 帧 率相 关的 信 息 我 们 来看看 struct v4l2_frmivalenum 结构体的定义 index、type 字段与 struct v4l2_frmsizeenum 结构体的 index、type 字段意义相同。 width、height 字段用于指定视频帧大小pixel_format 字段指定像素格式。 以上这些字段都是需要在调用 ioctl()之前设置它的值。 可以看到 struct v4l2_frmivalenum 结构体也有一个 union 共用体当 type V4L2_BUF_TYPE_VIDEO_CAPTURE 时discrete 生效这是一个 struct v4l2_fract 类型变量描述了视频帧率信息一秒钟采集图像的次数struct v4l2_fract 结构体中numerator 表示分子、denominator 表示分母使用 numerator / denominator 来表示图像采集的周期采集一幅图像需要多少秒所以视频帧率便等于 denominator / numerator。 使用示例譬如我们要枚举出 RGB565 像素格式下 640*480 帧大小所支持的所有视频采集帧率 d)查看或设置当前的格式VIDIOC_G_FMT、VIDIOC_S_FMT 前面介绍的指令只是枚举设备支持的像素格式、视频帧大小以及视频采集帧率等这些信息将下来我们将介绍如何设置这些参数。 首先可以使用 VIDIOC_G_FMT 指令查看设备当前的格式用法如下所示 int ioctl(int fd, VIDIOC_G_FMT, struct v4l2_format *fmt); 调用 ioctl()需要传入一个 struct v4l2_format *指针ioctl()会将获取到的数据写入到 fmt 指针所指向的对象中struct v4l2_format 结构体描述了格式相关的信息。 使用 VIDIOC_S_FMT 指令设置设备的格式用法如下所示 int ioctl(int fd, VIDIOC_S_FMT, struct v4l2_format *fmt); ioctl()会使用 fmt 所指对象的数据去设置设备的格式。我们来看看 v4l2_format 结构体的定义 type 字段依然与前面介绍的结构体中的 type 字段意义相同不管是获取格式、还是设置格式都需要在调用 ioctl()函数之前设置它的值。 接下来是一个 union 共用体当 type 被设置为 V4L2_BUF_TYPE_VIDEO_CAPTURE 时pix 变量生效它是一个 struct v4l2_pix_format 类型变量记录了视频帧格式相关的信息如下所示 colorspace 字段描述的是一个颜色空间可取值如下 使用 VIDIOC_S_FMT 指令设置格式时通常不需要用户指定 colorspace底层驱动会根据像素格式 pixelformat 来确定对应的 colorspace。 例子获取当前的格式、并设置格式 使用指令 VIDIOC_S_FMT 设置格式时实际设置的参数并不一定等于我们指定的参数譬如上面我们指定视频帧宽度为 800、高度为 480但这个摄像头不一定支持这种视频帧大小或者摄像头不支持V4L2_PIX_FMT_RGB565 这种像素格式通常在这种情况下底层驱动程序并不会按照我们指定的参数进行设置它会对这些参数进行修改譬如如果摄像头不支持 800*480那么底层驱动可能会将其修改为640*480假设摄像头支持这种分辨率所以当 ioctl()调用返回后我们还需要检查返回的 struct v4l2_format类型变量以确定我们指定的参数是否已经生效 e)设置或获取当前的流类型相关参数VIDIOC_G_PARM、VIDIOC_S_PARM 使用 VIDIOC_G_PARM 指令可以获取设备的流类型相关参数Stream type-dependent parameters使用方式如下 ioctl(int fd, VIDIOC_G_PARM, struct v4l2_streamparm *streamparm); 调用 ioctl()需要传入一个 struct v4l2_streamparm *指针ioctl()会将获取到的数据写入到 streamparm 指针所指向的对象中struct v4l2_streamparm 结构体描述了流类型相关的信息具体的内容等会在介绍。 使用 VIDIOC_S_PARM 指令设置设备的流类型相关参数用法如下所示 ioctl(int fd, VIDIOC_S_PARM, struct v4l2_streamparm *streamparm); ioctl()会使用 streamparm 所指对象的数据去设置设备的流类型相关参数。我们来看看 struct v4l2_streamparm 结构体的定义 type 字段与前面一样不再介绍在调用 ioctl()之前需先设置它的值。 当 type V4L2_BUF_TYPE_VIDEO_CAPTURE 时union 共用体中 capture 变量生效它是一个 struct v4l2_captureparm 类型变量struct v4l2_captureparm 结构体描述了摄像头采集相关的一些参数譬如视频采集帧率上面已经给出了该结构体的定义。 struct v4l2_captureparm 结构体中capability 字段表示设备支持的模式有哪些可取值如下以下任意一个或多个的位或关系 capturemode 则表示当前的模式与 capability 字段的取值相同。 timeperframe 字段是一个 struct v4l2_fract 结构体类型变量描述了设备视频采集的周期前面已经给大家介绍过。使用 VIDIOC_S_PARM 可以设置视频采集的周期也就是视频采集帧率但是很多设备并不支持应用层设置 timeperframe 字段只有当 capability 字段包含 V4L2_CAP_TIMEPERFRAME 时才表示设备支持 timeperframe 字段这样应用层才可以去设置设备的视频采集帧率。 所以在设置之前先通过 VIDIOC_G_PARM 命令获取到设备的流类型相关参数判断 capability 字段是否包含 V4L2_CAP_TIMEPERFRAME如下所示 申请帧缓冲、内存映射 读取摄像头数据的方式有两种一种是 read 方式也就是直接通过 read()系统调用读取摄像头采集到的数据另一种则是 streaming 方式25.2.2 小节中介绍了使用 VIDIOC_QUERYCAP 指令查询设备的属性、得到一个 struct v4l2_capability 类型数据其中 capabilities 字段记录了设备拥有的能力当该字段包含 V4L2_CAP_READWRITE 时表示设备支持 read I/O 方式读取数据当该字段包含 V4L2_CAP_STREAMING 时表示设备支持 streaming I/O 方式事实上绝大部分设备都支持 streaming I/O 方式读取数据使用 streaming I/O 方式我们需要向设备申请帧缓冲并将帧缓冲映射到应用程序进程地址空间中。 当完成对设备的配置之后接下来就可以去申请帧缓冲了帧缓冲顾名思义就是用于存储一帧图像数据的缓冲区使用 VIDIOC_REQBUFS 指令可申请帧缓冲使用方式如下所示 ioctl(int fd, VIDIOC_REQBUFS, struct v4l2_requestbuffers *reqbuf); 调用 ioctl()需要传入一个 struct v4l2_requestbuffers *指针struct v4l2_requestbuffers 结构体描述了申请帧缓冲的信息ioctl()会根据 reqbuf 所指对象填充的信息进行申请。我们来看看 struct v4l2_requestbuffers 结构体的定义 type 字段与前面所提及到的 type 字段意义相同不再介绍在调用 ioctl()之前需先设置它的值。 count 字段用于指定申请帧缓冲的数量。 memory 字段可取值如下 通常将 memory 设置为 V4L2_MEMORY_MMAP 即可使用示例如下 streaming I/O 方式会在内核空间中维护一个帧缓冲队列驱动程序会将从摄像头读取的一帧数据写入到队列中的一个帧缓冲接着将下一帧数据写入到队列中的下一个帧缓冲当应用程序需要读取一帧数据时需要从队列中取出一个装满一帧数据的帧缓冲这个取出过程就叫做出队当应用程序处理完这一帧数据后需要再把这个帧缓冲加入到内核的帧缓冲队列中这个过程叫做入队这个很容易理解现实当中都有很多这样的例子这里就不再举例了。 所以由此可知读取图像数据的过程其实就是一个不断地出队列和入队列的过程如下图所示 将帧缓冲映射到进程地址空间 使用 VIDIOC_REQBUFS 指令申请帧缓冲该缓冲区实质上是由内核所维护的应用程序不能直接读取该缓冲区的数据我们需要将其映射到用户空间中这样应用程序读取映射区的数据实际上就是读取内核维护的帧缓冲中的数据。 在映射之前需要查询帧缓冲的信息譬如帧缓冲的长度、偏移量等信息使用VIDIOC_QUERYBUF指令查询使用方式如下所示 ioctl(int fd, VIDIOC_QUERYBUF, struct v4l2_buffer *buf); 调用 ioctl()需要传入一个 struct v4l2_buffer *指针struct v4l2_buffer 结构体描述了帧缓冲的信息ioctl()会将获取到的数据写入到 buf 指针所指的对象中。我们来看看 struct v4l2_buffer 结构体的定义 index 字段表示一个编号申请的多个帧缓冲、每一个帧缓冲都有一个编号从 0 开始。一次 ioctl()调用只能获取指定编号对应的帧缓冲的信息所以要获取多个帧缓冲的信息需要重复调用多次每调用一次ioctl()、index 加 1指向下一个帧缓冲。 type 字段与前面所提及到的 type 字段意义相同不再介绍在调用 ioctl()之前需先设置它的值。 memory 字段与 struct v4l2_requestbuffers 结构体的 memory 字段意义相同需要在调用 ioctl()之前设置它的值。 length 字段表示帧缓冲的长度而共同体中的 offset 则表示帧缓冲的偏移量如何理解这个偏移量因为应用程序通过 VIDIOC_REQBUFS 指令申请帧缓冲时内核会向操作系统申请一块内存空间作为帧缓冲区这块内存空间的大小就等于申请的帧缓冲数量 * 每一个帧缓冲的大小每一个帧缓冲对应到这一块内存空间的某一段所以它们都有一个地址偏移量。 帧缓冲的数量不要太多了尤其是在一些内存比较吃紧的嵌入式系统中帧缓冲的数量太多势必会占用太多的系统内存。 使用示例申请帧缓冲后、调用 mmap()将帧缓冲映射到用户地址空间 在上述的示例中我们会将三个帧缓冲映射到用户空间并将每一个帧缓冲对应的映射区的起始地址保存在 frm_base 数组中后面读取摄像头采集的数据时直接读取映射区即可。 入队 使用 VIDIOC_QBUF 指令将帧缓冲放入到内核的帧缓冲队列中使用方式如下 ioctl(int fd, VIDIOC_QBUF, struct v4l2_buffer *buf); 调用 ioctl()之前需要设置 struct v4l2_buffer 类型对象的 memory、type 字段使用示例如下所示将三个帧缓冲放入内核的帧缓冲队列入队操作中 开启视频采集 将三个帧缓冲放入到队列中之后接着便可以打开摄像头、开启图像采集了使用VIDIOC_DQBUF 指令开启视频采集使用方式如下所示 读取数据、对数据进行处理 开启视频采集之后接着便可以去读取数据了前面我们已经说过直接读取每一个帧缓冲的在用户空间的映射区即可读取到摄像头采集的每一帧图像数据。在读取数据之前需要将帧缓冲从内核的帧缓冲队列中取出这个操作叫做帧缓冲出队有入队自然就有出队前面已经给大家详细地介绍了这些理论知识。 使用 VIDIOC_DQBUF 指令执行出队操作使用方式如下 ioctl(int fd, VIDIOC_DQBUF, struct v4l2_buffer *buf); 帧缓冲出队之后接下来便可读取数据了然后对数据进行处理譬如将摄像头采集的图像显示到 LCD屏上数据处理完成之后再将帧缓冲入队将队列中的下一个帧缓冲出队然后读取数据、处理这样往复操作。 使用示例如下 结束视频采集 如果要结束视频采集使用 VIDIOC_STREAMOFF 指令用法前面已经介绍了。使用示例如下所示 V4L2 摄像头应用编程实战 通过前面的介绍我们已经知道如何对摄像头进行应用编程了摄像头的应用编程其实并不难基本都是按照那样的一套流程下来即可打开设备、查询设备、设置格式、申请帧缓冲、内存映射、入队、开启视频采集、出队、对采集到的数据进行处理虽然步骤很多但是这些操作步骤都是容易理解的他并没有让你感觉到很难理解这个步骤每一个步骤基本都是通过 ioctl()来实现搭配不同请求指令。 本小节我们来编写摄像头应用程序笔者希望大家能够自己去独立完成通过前面的介绍相信大家是能够独立完成的可以适当地参考下面笔者提供的示例代码 本例程源码对应的路径为 开 发 板 光 盘 -11 、 Linux C 应 用 编 程 例 程 源 码 -25_v4l2_camera-v4l2_camera.c。 上述示例代码中会将摄像头采集到的图像数据显示到开发板 LCD 屏上我们将摄像头的像素格式设置为 RGB565因为这样比较好处理。其它的代码就不给大家介绍了没什么可说的代码中的注释信息已经描述得很清楚了这要是讲视频还可以给扯一扯文本形式的话有些东西不是那么好描述 开发板出厂系统支持正点原子的 ov5640、ov7725无 FIFO以及 ov2640 这几款摄像头这几款摄像头都支持 RGB565 像素格式当然除此之外还可以板子上使用 UVC USB 摄像头如果大家身边有这种摄像头也可以进行测试但是这种 USB 摄像头通常不支持 RGB565 格式而更多是 YUYV 格式上述代码并不支持 YUYV 格式的处理需要大家进行修改你得将采集到的 YUYV 数据转为 RGB565 数据才能在LCD 上显示采集到的图像。 接下来编译示例代码 将编译得到的可执行文件拷贝到开发板 Linux 系统的用户家目录下 首先在测试之前我们的开发板上得插上一个摄像头这里需要注意一下前面我们提到开发板出厂系统支持ov5640、ov7725以及ov2640,这三款摄像头但是不能同时生效出厂系统默认配置使能的是ov5640如果要使用 ov7725 或 ov2640则需修改设备树具体如何修改请大家参考“开发板光盘资料 A-基础资料/【正点原子】I.MX6U 用户快速体验 V1.7.3.pdf”文档中的 3.16 小节。 这里笔者以 ov2640 摄像头为例笔者的测试板上已经连接了 ov2640 摄像头如下所示 其它摄像头的安装方式也是如此头部朝外注意一定是在启动之前就安装好了、而不是开发板启动之后再安装切记如果是 USB 摄像头则可在开发板运行状态下直接将 USB 摄像头插入到开发板上的USB HOST 接口即可。 接着运行测试程序我们需要传入一个参数该参数表示摄像头的对应的设备节点 程序运行之后此时开发板 LCD 屏上将会显示摄像头所采集到的图像如下所示 请大家忽略手机拍摄的问题原本运行程序之后终端会打印出摄像头所支持的像素格式、描述信息以及摄像头所支持的采集分辨率、帧率等信息但是从图 25.3.4 中打印信息可知程序运行之后只打印了像素格式以及描述信息并没有打印分辨率和帧率等信息为什么呢当然这个不是我们的程序有问题而是摄像头的驱动功能不够完善底层驱动并没有去实现这些相关的功能这里给大家简单地提一下免得大家以为程序有问题这里笔者换了一个 USB 摄像头给大家看下它的打印信息如下所示 从上图可以看到程序打印了摄像头所支持的所有采集分辨率大小以及帧率。 好了本章的内容到此结束了到此为止我们已经学习了很多硬件外设的应用编程知识了大家要学会活学活用把这些东西用起来尝试着做一个综合类的好玩的小项目提高自己的应用编程能力笔者觉得这是非常重要你不要跟着笔者的教程一个一个章节往下走你得停下来思考、多动动手、在教程的基础上多往外扩展这样你才能进步大家加油
http://www.tj-hxxt.cn/news/232435.html

相关文章:

  • 做淘宝客网站推广被骗广州建设执业资格注册中心网站
  • dw建网站怎么做珠海网站建设网络公司怎么样
  • 网站建设服务要交印花税吗wordpress 模版安装教程
  • 网站国际化建设方案建站公司推荐首推万维科技
  • 如何注册网站免费注册好123上网主页
  • 闸北网站建设公司wordpress 标题重复
  • 网上开店电商平台有哪些网站建设及seo
  • 重庆重庆网站建设网络管理系统的基本组成和功能
  • 做水果的网站企业网站模板用哪个
  • 县总工会网站建设情况介绍网站模块在线制作
  • 长春市城建网站最新新闻热点国际
  • 金昌市建设局官方网站洛阳做网站的
  • 企业做推广哪些网站比较好产品线上营销方案
  • 空调维修网站建设wordpress付费开通站点
  • 漳州正规网站建设公司泰安网站制作电话
  • 手机网站返回跳转页面代码做网站SEO用什么电脑方便
  • 网站开发方案目录第三方平台网站的建设规划
  • 重庆好的推广网站外销网站怎么做的
  • 涂料网站模版python做的网站如何打开
  • 常州网站推广软件信息上海网页设计报价
  • 2024年最新时政热点网站个别页面做seo
  • 建设手机网站报价免费 网站 模板
  • win8扁平化网站前端网站开发一个月多少钱
  • 自己做个网站怎么赚钱网站建设 技术 哪些
  • 聚美优品网站建设的特点建设公积金网站
  • 自适应网站价格安徽茶叶网站建设
  • 免费自创网站运维工程师主要做什么
  • 怎么给网站做后台网站版面的美化原则
  • 住房和城乡建设部网站建筑合同长沙招聘网站制作
  • 网站建设中切图的意义沛县徐州网站开发