粤嵌gec6818开发板-驱动usb摄像头

        前段时间做了一个项目,用到了linux环境下gec6818开发板驱动usb摄像头,在这里给大家分享一下。

        摄像头的操作步骤

1)打开设备
2)配置设备(采集的频率、图像宽高、图像格式)
3)在内核空间申请缓冲区队列
4)把申请好的缓冲列表----映射到用户空间
5)开始采集
6)从队列中拿出一个缓冲区
7)从用户空间中把缓冲区的数据取走
8)把缓冲区放回队列
9)停止采集
10)释放资源设备节点文件:/dev/video7视频捕捉库:libapi_v4l2_arm.so相关函数://初始化摄像头设备int linux_v4l2_device_init(const char *dev);->打开文件,查找属性参数: const char *dev -》 文件名返回值: 失败-1//启动摄像头int linux_v4l2_start_capturing();//停止摄像头int linux_v4l2_stop_capturing();//卸载摄像头设备int linux_v4l2_device_uinit();//获取摄像头数据(存放jpg文件流:存放到freambuf)int linux_v4l2_get_fream(FrameBuffer *freambuf);//jpg文件流结构体
typedef struct Frame_Buffer{char buf[1843200];            //图片数据缓冲区int length;                    //图片数据长度(字节)}FrameBuffer;

        下面是代码示例

#include "main.h"//设置摄像头启动变量
int video_show_flag = 0;
//设置抓拍变量
int take_photo_flag = 0;
//声明函数pthread_create
extern int pthread_create(pthread_t *thread, const pthread_attr_t *attr, void *(*start_routine) (void *), void *arg);int photo_num = 0;void *real_time_video()
{//定义存储摄像头数据的jpg缓冲区struct jpg_data video_buf;//1.初始化摄像头设备linux_v4l2_yuyv_init("/dev/video7");//2.启动摄像头linux_v4l2_start_yuyv_capturing();char photo_name[20] = {0};//循环采集数据与输出while(1){//3.获取摄像头数据(存放jpg文件流:存放到video_buf)linux_v4l2_get_yuyv_data(&video_buf);//4.把摄像头数据显示到LCD上lcd_draw_camera(0, 0, 700, 480, video_buf.jpg_data, video_buf.jpg_size);sprintf(photo_name,"photo%d.jpg",photo_num);if(take_photo_flag == 1)	//进行抓拍{//创建一个新的文件//spritf();int fd = open(photo_name,O_RDWR|O_CREAT,0777);if(fd == -1){perror("拍照失败");continue;}//将图片数据写入文件中write(fd,video_buf.jpg_data,video_buf.jpg_size);//关闭文件保存close(fd);//清空抓拍的标志位take_photo_flag = 0;photo_num++;if(photo_num > 4)photo_num = 0;}if(video_show_flag == 0)break;}//4.停止摄像头linux_v4l2_yuyv_quit();return NULL;
}int cam(void)
{//打开lcd屏幕lcd_open();lcd_clear();//创建一条线程实时监控pthread_t pid;int album_falg=0;int cam_flag=0;int x,y;int yanshi_flag=1;char yanshi_buff[20];cam_flag=1;printf("打开摄像头\n");pthread_create(&pid,NULL,real_time_video,NULL);video_show_flag = 1;while(1){sprintf(yanshi_buff,"/cam%d.bmp",yanshi_flag);show_location_bmp(yanshi_buff,700,0,100,480,FB);get_xy(&x,&y);if(x > 718 && x < 800 && y > 5 && y < 70 && cam_flag==0 && yanshi_flag == 1){				cam_flag=1;printf("打开摄像头\n");pthread_create(&pid,NULL,real_time_video,NULL);video_show_flag = 1;}else if(x > 718 && x < 800 && y > 100 && y < 170 && cam_flag==0&& yanshi_flag == 1){cam_flag=1;printf("打开摄像头\n");pthread_create(&pid,NULL,real_time_video,NULL);video_show_flag = 1;}else if(x > 718 && x < 800 && y > 209 && y < 264&& yanshi_flag == 1){take_photo_flag = 1;	printf("抓拍\n");}else if(x > 718 && x < 800 && y > 311 && y < 367&& yanshi_flag == 1){video_show_flag = 0;printf("相册\n");album_falg=album_cam(0);if(album_falg==2) break;if(album_falg==1){printf("打开摄像头\n");pthread_create(&pid,NULL,real_time_video,NULL);video_show_flag = 1;cam_flag=1;}}else if(x > 718 && x < 800 && y > 404 && y < 473 && yanshi_flag == 1){printf("关闭摄像头\n");video_show_flag = 0;break;}else if(x > 0 && x < 700 && y > 0 && y < 480){yanshi_flag++;if(yanshi_flag ==2)yanshi_flag = 0;}if(yanshi_flag==0){if(x > 714 && x < 798 && y > 16 && y < 116)//延时{}if(x > 714 && x < 798 && y > 168 && y < 212)//开始{sleep(3);take_photo_flag = 1;	printf("抓拍\n");}if(x > 714 && x < 798 && y > 264 && y < 312)//相册{yanshi_flag=1;sprintf(yanshi_buff,"/cam%d.bmp",yanshi_flag);show_location_bmp(yanshi_buff,700,0,100,480,FB);video_show_flag = 0;printf("相册\n");album_falg=album_cam(0);if(album_falg==2) break;if(album_falg==1){printf("打开摄像头\n");pthread_create(&pid,NULL,real_time_video,NULL);video_show_flag = 1;cam_flag=1;}}if(x > 714 && x < 798 && y > 365 && y < 410)//关闭{printf("关闭摄像头\n");video_show_flag = 0;break;}}printf("x=%d,y=%d\n",x,y);}// //关闭lcd屏幕// lcd_close();return 0;
}int cam_touch(void)
{//打开lcd屏幕lcd_open();lcd_clear();//创建一条线程实时监控pthread_t pid;int touch_flag=0;int album_falg=0;int cam_flag=0;cam_flag=1;printf("打开摄像头\n");pthread_create(&pid,NULL,real_time_video,NULL);video_show_flag = 1;while(1){show_location_bmp("/cam1.bmp",700,0,100,480,FB);touch_flag = iic();if(touch_flag == 5){take_photo_flag = 1;	printf("抓拍\n");}else if((touch_flag == 3 ||touch_flag==4) && video_show_flag ==0){cam_flag=1;printf("打开摄像头\n");pthread_create(&pid,NULL,real_time_video,NULL);video_show_flag = 1;}else if(touch_flag == 9){printf("关闭摄像头\n");video_show_flag = 0;usleep(100000);break;}else if(touch_flag == 7){video_show_flag = 0;printf("相册\n");album_falg=album_cam(1);if(album_falg==2) break;if(album_falg==1){printf("打开摄像头\n");pthread_create(&pid,NULL,real_time_video,NULL);video_show_flag = 1;cam_flag=1;}}}// //关闭lcd屏幕// lcd_close();return 0;
}

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

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

相关文章

[蓝桥杯2024]-PWN:fd解析(命令符转义,标准输出重定向,利用system(‘$0‘)获取shell权限)

查看保护 查看ida 这里有一次栈溢出&#xff0c;并且题目给了我们system函数。 这里的知识点没有那么复杂 方法一&#xff08;命令转义&#xff09;&#xff1a; 完整exp&#xff1a; from pwn import* pprocess(./pwn) pop_rdi0x400933 info0x601090 system0x400778payloa…

78、贪心-跳跃游戏

思路 方法1: canJump01 - 使用递归&#xff08;回溯法&#xff09; 这个方法是通过递归实现的&#xff0c;它从数组的第一个位置开始&#xff0c;尝试所有可能的跳跃步数&#xff0c;直到达到数组的最后一个位置或遍历完所有的可能性。 思路&#xff1a; 如果数组为空或者长…

【docker】docker compose 搭建私服

安装 Docker Registry 创建目录 mkdir -pv /usr/local/docker/registrymkdir -pv /usr/local/docker/data 创建 docker-compose.yml文件 进入目录创建docker-compose.yml cd /usr/local/docker/registrytouch docker-compose.yml 编辑docker-compose.yml vim docker-compo…

2024年【起重机械安全管理】考试内容及起重机械安全管理操作证考试

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 起重机械安全管理考试内容根据新起重机械安全管理考试大纲要求&#xff0c;安全生产模拟考试一点通将起重机械安全管理模拟考试试题进行汇编&#xff0c;组成一套起重机械安全管理全真模拟考试试题&#xff0c;学员可…

52.HarmonyOS鸿蒙系统 App(ArkTS)配置文件添加多个权限方法

52.HarmonyOS鸿蒙系统 App(ArkTS)配置文件添加多个权限方法 module.json5

VS2022 嘿嘿

还是大二的时候就开始用这个&#xff0c;但居然是为了用PB&#xff0c;-_-|| 用了段时间换成了C#&#xff0c;依稀还记得大佬们纠正我的读法&#xff0c;别读C井&#xff0c;应该读C夏普。。。 安装过程其实也没啥&#xff0c;就是关键Key得花时间找&#xff0c;我好不容易搞…

Concise CoT(CCoT)提示词工程

原文地址&#xff1a;concise-chain-of-thought-ccot-prompting 2024 年 1 月 24 日 传统的 CoT 是以增加输出令牌使用为代价的&#xff0c;CCoT 提示是一种提示工程技术&#xff0c;旨在减少 LLM 响应的冗长和推理时间。 基于LLMs的生成式人工智能应用程序必须使用多管齐下的方…

【Linux】理解 Ubuntu 中的 kill 和 killall 命令

我把我唱给你听 把你纯真无邪的笑容给我吧 我们应该有快乐的 幸福的晴朗的时光 我把我唱给你听 用我炙热的感情感动你好吗 岁月是值得怀念的留恋的 害羞的红色脸庞 谁能够代替你呀 趁年轻尽情的爱吧 最最亲爱的人啊 路途遥远我们在一起吧 &#x1f3b5; 叶…

php使用Canal监听msyql

canal需要java8 去官网下载java8 安装JAVA #创建目录 mkdir -p /usr/local/java/ #解压到目录 tar zxvf jdk-8u411-linux-x64.tar.gz -C /usr/local/java/配置环境变量在 /etc/profile 最后加入 export JAVA_HOME/usr/local/java/jdk1.8.0_411 export CLASSPATH.:$JAVA_HOM…

【ZZULIOJ】1092: 素数表(函数专题)(Java)

目录 题目描述 输入 输出 样例输入 Copy 样例输出 Copy code 题目描述 输入两个正整数m和n&#xff0c;输出m和n之间的所有素数。 要求程序定义一个prime()函数和一个main()函数&#xff0c;prime()函数判断一个整数n是否是素数&#xff0c;其余功能在main()函数中实现。…

牛客NC320 装箱问题【中等 动态规划,背包问题 C++/Java/Go/PHP】

题目 题目链接&#xff1a; https://www.nowcoder.com/practice/d195a735f05b46cf8f210c4ad250681c 几乎完全相同的题目&#xff1a; https://www.lintcode.com/problem/92/description 思路 动态规划都是递归递推而来。php答案是动态规划版本&#xff0c;递归版本有 测试用…

uint32_t与int区别与联系

1.背景介绍 在一些程序中经常看到uint8_t uint32_t等数据类型&#xff0c;那么它与我们常见的int类型有什么区别呢。 2.协议介绍 stdint.h头文件是为了代码的可移植性而推出的&#xff0c;C99中就已经规范了。 3.代码可移植性 3.1 数据类型的差异 大部分的32位系统采用的…

基于Java+SpringBoot+Mybaties-plus+Vue+elememt+hadoop + redis 医院就诊系统 设计与实现

一.项目介绍 前端&#xff1a;患者注册 、登录、查看首页、医生排班、药品信息、预约挂号、就诊记录、电子病历、处方开药、我的收藏 后端分为&#xff1a; 医生登录&#xff1a;查看当前排班信息、查看患者的挂号情况、设置患者就诊记录、电子病历、给患者开药和个人信息维护 …

公共交通无障碍设施:科技翅膀助力盲人出行新飞跃

在城市的脉络中&#xff0c;公共交通扮演着连接每一个角落的重要角色。然而&#xff0c;对于视力受限的盲人朋友而言&#xff0c;这幅繁忙而复杂的交通网络往往隐藏着诸多不易察觉的障碍。值得庆幸的是&#xff0c;随着公共交通无障碍设施的不断完善&#xff0c;以及高科技辅助…

20240502给NanoPi的NEO core开发板编译移远的4G模块的上网程序quectel-CM

20240502给NanoPi的NEO core开发板编译移远的4G模块的上网程序quectel-CM 2024/5/2 16:29 1、默认编译为AMD64/INTEL的x64架构的可执行文件&#xff1a; rootrootrootroot-ThinkBook-16-G5-IRH:~$ rootrootrootroot-ThinkBook-16-G5-IRH:~$ unzip Quectel_QConnectManager_Lin…

CSS-复合选择器

作用&#xff1a; 后代选择器&#xff1a; 子代选择器 并集选择器 用逗号隔开&#xff0c;在style里面写的时候&#xff0c;每一个标签空一行。 <title>Document</title><style>p,div,span{color: aqua;}</style> </head> <body><p>…

C语言——队列的实现

队列按照先进先出&#xff08;FIFO&#xff0c;First In First Out&#xff09;的原则管理数据。这意味着最先进入队列的元素会被最先移出&#xff0c;类似于排队等候服务的情况。队列通常有两个主要操作&#xff1a;入队&#xff08;enqueue&#xff09;&#xff0c;将元素添加…

python - 3D图表绘制

Pyecharts 和 3D 图表绘制 Pyecharts 是一个用于生成各种图表的 Python 库&#xff0c;它基于 Echarts&#xff0c;支持大量的图表类型&#xff0c;非常适合用于数据分析和可视化。Pyecharts 主要优点是易于使用&#xff0c;可以直接在 Python 环境中绘制富有交互性的图表&…

ES练习项目-酒店搜索

目录 1 需求分析2 酒店搜索和分页2.1 请求和响应分析2.2 定义实体类&#xff0c;接收请求参数的JSON对象2.3 编写controller&#xff0c;接收页面的请求2.4 编写业务实现&#xff0c;利用RestHighLevelClient实现搜索、分页 3. 酒店结果过滤3.1 请求和响应分析3.2 修改请求参数…

【Python快速上手(十)】

目录 Python快速上手&#xff08;十&#xff09;Python3 作用域和OS 文件/目录方法Python3 作用域1. 内置作用域&#xff08;Built-in Scope&#xff09;2. 全局作用域&#xff08;Global Scope&#xff09;3. 嵌套作用域&#xff08;Enclosing Scope&#xff09;4. 局部作用域…