linux 下V4L的使用例子

【Linux应用】Linux--V4L2摄像头应用编程 在Linux中,摄像头方面的标准化程度比较高,这个标准就是V4L2驱动程序,这也是业界比较公认的方式。 本文写的是在V4L2驱动框架上的应用编程实战。 阅读详情

#include <stdio.h>
#include <string.h>
#include <errno.h>
#include <fcntl.h>
#include <sys/mman.h>
#include <linux/videodev.h>
#include<sys/types.h>
#define VIDEO_PALETTE_RAW_JPEG 20
#define VIDEO_PALETTE_JPEG 21

#ifdef ANDROID_ENV
#define LOG LOGV
#else
#define LOG printf
#endif


#define CAPTURE_FILE "/tmp/catchpic.jpg"

typedef struct _v4ldevice
{int fd;//设备号
struct video_capability capability;
struct video_channel channel[10];
struct video_picture picture;
struct video_clip clip;
struct video_window window;
struct video_capture capture;
struct video_buffer buffer;
struct video_mmap mmap;
struct video_mbuf mbuf;
struct video_unit unit;
unsigned char *map;//mmap方式获取数据时,数据的首地址
pthread_mutex_t mutex;
int frame;
int framestat[2];
int overlay;
}v4ldevice;


int v4lgetcapability(v4ldevice *vd)
{
if(ioctl(vd->fd, VIDIOCGCAP, &(vd->capability)) < 0) {
LOG("an error happen when get capability");
return -1;
}

// Print capability infomations
LOG("Capability Informations:/n");
LOG(" name: %s/n", vd->capability.name);
LOG(" type: %d/n", vd->capability.type);
// LOG(" channel: %d/n", vd->capability.channel);
LOG(" maxwidth: %d/n", vd->capability.maxwidth);
LOG(" maxheight: %08X/n", vd->capability.maxheight);
LOG(" minwidth: %d/n", vd->capability.minwidth);
LOG(" minheight: %08X/n", vd->capability.minheight);
return 0;
}


int v4lgetmbuf(v4ldevice *vd)
{
if(ioctl(vd->fd, VIDIOCGMBUF, &(vd->mbuf))<0) {
LOG("v4lgetmbuf:VIDIOCGMBUF");
return -1;
}
return 0;
}


unsigned char *v4lgetaddress(v4ldevice *vd)
{
return (vd->map + vd->mbuf.offsets[vd->frame]);
}

int v4lopen(char *name, v4ldevice *vd)
{
int i;
if((vd->fd = open(name,O_RDWR)) < 0) {
return -1;
}
if(v4lgetcapability(vd))
return -1;
}


int v4lgrabinit(v4ldevice *vd, int width, int height)
{
vd->mmap.width = width;
vd->mmap.height = height;
vd->mmap.format = vd->picture.palette;
vd->frame = 0;
vd->framestat[0] = 0;
vd->framestat[1] = 0;
return 0;
}


int v4lmmap(v4ldevice *vd)
{
if(v4lgetmbuf(vd)<0)
return -1;
if((vd->map = mmap(0, vd->mbuf.size, PROT_READ|PROT_WRITE, MAP_SHARED, vd->fd, 0)) < 0) {
return -1;
}
return 0;
}


int v4lgrabstart(v4ldevice *vd, int frame)
{
vd->mmap.frame = frame;
if(ioctl(vd->fd, VIDIOCMCAPTURE, &(vd->mmap)) < 0) {
return -1;
}
vd->framestat[frame] = 1;
return 0;
}


int v4lsync(v4ldevice *vd, int frame)
{
if(ioctl(vd->fd, VIDIOCSYNC, &frame) < 0) {
return -1;
}
vd->framestat[frame] = 0;
return 0;
}


int v4lcapture(v4ldevice *vd, int frame)
{
vd->mmap.frame = frame;
if(ioctl(vd->fd, VIDIOCMCAPTURE, &(vd->mmap)) < 0) {
return -1;
}
vd->framestat[frame] = 1;
}

//static void dump_to_file(const char *fname, char *buf, int *size){

//};


static void dump_to_file(const char *fname, char *buf, long int size)
{
int nw, cnt = 0;
int written = 0;

LOG("/n=========opening file [%s]+++++++++++/n", fname);
int fd = open(fname, O_RDWR | O_CREAT);
if (fd < 0) {
LOG("failed to create file [%s]: %s", fname, strerror(errno));
return;
}

LOG("/n=============writing %d bytes to file [%s]/n++++++++++++", size, fname);
while (written < size) {
nw = write(fd,
buf + written,
size - written);
if (nw < 0) {
LOG("failed to write to file [%s]: %s",
fname, strerror(errno));
break;
}
written += nw;
cnt++;
}
LOG("done writing %d bytes to file [%s] in %d passes/n",
size, fname, cnt);
close(fd);
}

 

int main(){
char* devicename="/dev/video0";
char* buffer;
v4ldevice device;
int width = 640;
int height = 480;
int frame = 0;
v4lopen("/dev/video0",&device);//打开设备

//v4lgetcapability(&device);

int ret;
// read information in video_picture
memset(&(device.picture),0,sizeof(device.picture));
ret=ioctl(device.fd, VIDIOCGPICT, &(device.picture));
if (ret < 0) {
LOG("VIDIOCGPICT failed (%d)/n", ret);
return ret;
}
LOG("/n jaylin add original picture Informations:/n");
LOG(" depth: %d/n", device.picture.depth);
LOG(" palette: %d/n", device.picture.palette);


//set capture attributes
device.picture.palette = VIDEO_PALETTE_JPEG;//different camera has different palette
device.picture.depth = 8;
if(ioctl(device.fd,VIDIOCSPICT,&(device.picture)) == -1)
{
LOG("Cann't set the picture attributes!");
close(device.fd);
exit(6);
}

//read information in video_picture
ioctl(device.fd, VIDIOCGPICT, &(device.picture));
if (ret < 0) {
LOG("VIDIOCGPICT failed (%d)/n", ret);
return ret;
}
LOG("/n jaylin add after set pictures attributes Informations:/n");
LOG(" depth: %d/n", device.picture.depth);
LOG(" palette: %d/n", device.picture.palette);


v4lgrabinit(&device,width,height);//初始化设备,定义获取的影像的大小
v4lmmap(&device);//内存映射
v4lgrabstart(&device,frame);//开始获取影像
//while(1){
v4lsync(&device,frame);//等待传完一帧
frame = (frame+1)%2;//下一帧的frame
v4lcapture(&device,frame);//获取下一帧
buffer = (char*)v4lgetaddress(&device);//得到这一帧的地址
//buffer给出了图像的首地址,你可以选择将图像显示或保存......
//图像的大小为 width*height*2
long int size = 640*480*1;
dump_to_file(CAPTURE_FILE,buffer,size);
munmap(device.map, device.mbuf.size);
//}
}

 

Linux之多媒体应用接口v4l-utils及摄像头简单使用 链接: https://notes.z-dd.online/2024/06/06/Linux%E4%B9%8B%E5%A4%9A%E5%AA%92%E4%BD%93%E5%BA%94%E7%94%A8%E6%8E%A5%E5%8F%A3v4l-utils%E5%8F%8A%E6%91%84%E5%83%8F%E5%A4%B4%E7%AE%80%E5%8D%95%E4%BD%BF%E7%94%A8/v4l-utils 提供了一系列库和实用工具,用于控制各种多媒体设备。v4l-utils 组成。 阅读详情

相关推荐

v4l(video for Linux)使用摄像头实验的一点小感慨

v4l(video for Linux)使用摄像头实验的一点小感慨 前言     学习Linux快1个月了,Linux教学视频看完了,然后在虚拟机上装了个CentOS6.3把该做的实验大多也做了。突然就想玩玩刚买来的蓝魔USB摄像头(型号M2200),我给自己定了个计划,先写个摄像头驱动再写个应用层上面与图像有关的随便什么程序。   正文     1,先是驱动,我在想USB摄像头的话US

8694

Linux V4L2

V4L是 Video for Linux的缩写,它是Linux 内核中关于视频设备的子系统,它为linux 下的视频驱动提供了统一的接口,使得应用程序可以使用统一的API 函数操作不同的视频设备,极大地简化了视频系统的开发和维护。     由于早期的 V4L 有很多缺陷,Bill Dirks 等人对其进行了重新设计,并取名为Video for Linux  2(V4L2使用),最早出现于Linu

人工智能,深度学习,人脸识别 2504

Linux L4V2框架学习

这是一篇偏小白的学习向的文章,不涉及太多程序细节的解释(主要是笔者也是在学习阶段,理解还没有这么深入)。主要目的是梳理大概的应用框架,实现摄像头采集出图像的功能。简单来说就是,驱动程序从摄像头采数据,并填充缓冲区,之后缓冲区就被应用程序读取和处理。这个过程不断循环往复。

weixin_52755312的博客 1321

【Linux驱动】Linux--V4L2视频驱动框架

基于Linux5.4的V4L2视频驱动框架介绍分析,记录了最简单的视频驱动框架。

记录嵌入式技能成长的博客 2556

Linux摄像头(V4L2)代码,可直接使用

该代码实现了Linux下的USB摄像头原始数据采集,格式转换(rgb16/24)bmp,和图片压缩过程,安装JPEG库可直接使用。

Linux下V4L2编程小结.

Linux下V4L2编程小结.主要介绍在linux下关于图像采集v4l驱动的小结,如何通过调用函数,来实现图像采集

Linux V4L2子系统与视频编解码设备介绍

1.V4L2简介1.1 什么是V4L2V4L,其全称是Video4Linux(即Video for Linux),是Linux内核中关于视频设备的驱动框架,涉及开关视频设备,以及从该类设备采集并处理相关的音、视频信息。V4L从Linux2.1版本的内核中开始出现。现在Linux内核中用的是V4L2,即Video4Linux2(即Video for Linux Two),其是修改V4L相关...

内核工匠 5183

linux v4l2 视频编解码资料

介绍 video for linux two (V4L2) 驱动编写指南

linux 里的v4l函数,video for linux-----v4l v4l(VideoforLinux标准)

v4l是linux中提供的一个音视频接口规范,所有的音视频设备的驱动编写要用的这些接口Video4Linux其中用到的数据结构有:2 -28,I was sitting just by them.nothing romantic.what on hell happened?◆ video_capability 包含摄像头的基本信息设备名称 n a m e [ 32 ]最大最小分辨率信 m a x ...

weixin_42543046的博客 353

linux--V4l2

亲测 可以用 linux-V4l2 代码

CAB单片机开发指南

CAB单片机开发使用指南,IDE安装及烧录注意事项

Zoebuxiangtian的博客 1558

v4l-utils 包

v4l2-ctl是 Linux 下调试、配置视频设备(特别是摄像头)非常常用的命令行工具,它来自包。下面详细讲讲它的用法、常用选项、例子和注意事项。

is0815的博客 1445

PyTorch多机训练Loss不一致问题排查指南:基于算子级一致性验证

比较二次训练过程中所有算子的误差,定位存在一致性问题的pytorch算子

Hi20240217的博客 1158

Linux中与驱动相关的ioctl函数

 Linux中与驱动相关的ioctl函数一:    ioctl函数的作用    ioctl用于向设备发控制和配置命令,有些命令也需要读写一些数据,但这些数据是不能用read/write读写的,称为Out-of-band数据。也就是说,read/write读写的数据是in-band数据,是I/O操作的主体,而ioctl命令传送的是控制信息,其中的数据是辅助

mazidao2008的专栏 2231

adas硬件_ADAS智能辅助驾驶系统硬件在环(HIL)测试之硬件介绍

这篇主要分享的是ADAS融合系统的HIL测试系统的硬件结构及其作用,其主要包括上位机、机柜、雷达模拟器系统、雷达暗箱系统以及视频暗箱。 上位机 上位机主要运行HIL测试系统的相关软件,测试人员所有的前期准备工作与测试操作均在上面进行,并监控测试结果,其通过网口实现与NI实时机的通信,上位机将VeriStand项目工程下载至NI实时机运行。机柜 机柜主要由可编程电源...

weixin_39580748的博客 2242

头歌OpenGauss数据库 - 单表查询 答案

本关任务:用SELECT语句检索数据表中指定字段的数据;用SELECT语句检索数据表中所有字段的数据。为了完成本关任务,你需要掌握: 1.如何获取数据表中指定字段的数据;2.如何获取数据表中的所有数据。

d214493517的博客 5720

Linux下opencv通过V4L获取摄像头图像的底层源码icvRetrieveFrameCAM_V4L

以下是icvRetrieveFrameCAM_V4L(CvCaptureCAM_V4L* capture,int)的源码,在Opencv3.1.0源码中cap_v4l.cpp中第1438行,被cap_v4l.cpp中第1794行retrieveFrame(int)调用,retrieveFrame(int)被cap.cpp第100行cvRetrieveFrame( CvCapture* captur

jirryzhang的博客 3909

智能气象站:ESP32驱动的心知天气数据可视化实践

本文详细介绍了基于ESP32微控制器和心知天气API构建智能气象站的完整实践。通过Arduino开发环境,实现天气数据的获取、JSON解析与OLED屏可视化展示,涵盖硬件连接、API配置、低功耗优化及部署问题排查,为物联网开发者提供实用指南。

jump7的博客 210

V4L的使用

Video4Linux是Linux下用于获取视频和音频数据的API接口,在这篇文章中,着重阐述如何利用Video4Linux获取摄像头数据,以实现连续影像的播放。  1. 摄像头的安装  在Linux下常用的摄像头驱动是spca5xx, 这是一个通用驱动,读者可以在以下网站下到这个驱动 http://mxhaard.free.fr/download.html。这个网站还给出了这款驱动支持的

嵌入精灵 1214

[PCIE5.0] 4.2.3.2 Encoding of Presets

• 发射器预设:发射器预设值用4位二进制编码,表示不同的预设设置(P0 到 P10),这些设置定义了信号的传输特性。• 接收器预设提示:接收器预设提示是通过3位二进制编码告诉接收器建议的增益值,用于调整接收器的灵敏度(适用于8.0 GT/s数据速率)。

系统固件工程师 574

华为OD机考双机位C卷 - 员工派遣 (Java & Python& JS & C/C++ & GO )

华为OD机考双机位C卷 - 员工派遣 (OD上机考试双机位C卷)。提供在线OJ刷题。Java、C++、Python、GO语言、C语言、JavaScript题解,并提供完整思路讲解。

算法大师! 1034

video4linux(v4l)使用摄像头的实例基础教程与体会

1. video4linux基础相关   1.1  v4l的介绍与一些基础知识的介绍   I.首先说明一下video4linux(v4l)。         它是一些视频系统、视频软件、音频软件的基础,经常使用在需要采集图像的场合,如视频监控、webcam、可视电话,经常应用在embedded linux中,是linux嵌入式开发中经常使用的系统接口。

zhaohc_nj的专栏 2238

【同等学力】2025-数学✨

本文主要涵盖了谓词逻辑、集合论、图论和排列组合等多个数学领域的题目。在谓词逻辑部分,要求用全称量词和存在量词表达“没有两个人的指纹完全相同”。集合论部分涉及集合运算的证明,如证明(A-B)-C=(A-C)-(B-C)。图论部分包括计算给定10个点的联通图的边与面数。排列组合部分则要求计算从8个人中选6个并分为三组的不同方法。此外,还涉及偏序、长链、反链、二项式定理等相关内容,参考了多个优快云博客中的解题思路。

super_mochi1 676

linux下V4L视频采集总结

视频采集,调用V4L模块参数进行视频原始数据的采集。熟悉/include/linux/videodev.h,根据这个头文件来定义自己的video device的数据结构,下面是几个重要的数据结构,定义在videodev.h里    struct video_mmap vmmap;struct video_capability videocap;struct video_mbuf videombuf

奔跑 7722

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

V4L接口

v4l(VideoforLinux标准)v4l是linux中提供的一个音视频接口规范,所有的音视频设备的驱动编写要用的这些接口Video4Linux其中用到的数据结构有: 2 -28,I was sitting just by them.nothing romantic.what on hell happened? ◆ video_capability 包含摄像

bloghome的专栏 1801

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

上一篇: linux 下V4L2的使用例子
下一篇: 在ubuntu中安装 Source-Navigator及使用手册(zz)
jaylin2013
博客等级 码龄16年 12粉丝 15原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值