嵌入式项目实战——基于QT的视频监控系统设计(三)

进入到五一假期第三天,继续我们的项目。本来五一假期还是想好好休息一下的,因为最近学习的状态不太好,刷题都没有思路了,但是身边的同学太卷了,不过我还是想放松一下,所以上午睡觉,下午复盘一下这个项目分享出来。等假期结束之后,再好好冲刺一波。

前两天分别介绍了QT的基本使用以及UDP网络编程,实现了用QT编写一个上位机与开发板进行数据传输。这些工作完成之后我们就可以开始关注在上位机中显示视频画面了,这里面涉及到开发板内核的视频画面获取与处理,然后通过UDP网络通信发送给上位机实时显示。

第三天:v4l2视频处理模块

首先介绍一下v4l2视频处理模块,V4L2是V4L的第二版,是Video For Linux的简称,V4L早在Linux 2.1中就已经被引入,到2.6.38时才有了V4L2的最终替代。V4L2是Linux视频处理模块的最新标准代码,包括对视频输入设备的处理,如高频(即、电视信号输入端子)或摄像头,还包括视频处理输出装置。一般来说,最常见的是使用V4L2来处理相机数据采集的问题。我们通常使用的相机实际上是一个图像传感器,将捕捉到的光线通过视频芯片处理后,编码成JPG/MJPG或YUV格式输出。我们可以很容易地通过V4L2与第一台摄像机设备“通信”,如设置或获取它们的工作参数。

在内核中,摄像头捕捉到的视频数据,我们可以使用一个队列来存储。我们做的工作大致是这样的:首先配置摄像头的相关参数,可以正常工作,然后申请一个号码的内核视频缓存,送他们到队列,像三个空盘子在传送带上。然后我们还需要三个内核缓存区域通过mmap函数映射到用户空间,这样我们就可以操作相机数据在用户层,然后我们可以启动相机开始数据采集,每一帧捕获数据我们可以做一个团队操作,读取数据,然后再阅读内核缓存的数据小组,依次循环。

下面是v4l2视频处理模块常用的函数:

linux_v4l2_device_init("/dev/video7");//利用v4l2初始化摄像头设备;
linux_v4l2_start_capturing();//启动摄像头
linus_v4l2_get_frame(&framebuf);//获取摄像头数据,并存放在freambuf中
linux_v4l2_stop_capturing();//停止摄像头
linux_v4l2_device_uinit();//卸载摄像头

这里又出现了一个重要的知识点,Framebuffer模块,简单介绍一些Framebuffer模块:Freambuffer简单来说就是一块内核中的内存,里面保存着一帧图像。

掌握这里知识点,我们就可以实现在上位机中实时显示摄像头拍摄的画面啦。

上位机我写的上位机程序里已经完成了显示图象的代码:

//头文件中声明
private:QPixmap pix;
//主函数中显示
//QPixmap类显示图片
pix.loadFromData((uchar *)data, ret);
pix = pix.scaled(ui->label->width(), ui->label->height());
ui->label->setPixmap(pix);

开发板中运行的服务器程序可以在上一节中介绍的Server.c程序中修改,我这里采用的是使用多线程编程,用一个线程来实现实时监控功能

FrameBuffer freambuf;//声明一个FrameBuffer结构体,存放视频数据
void *Jpg_Real_Time(void *arg)  //实时监控功能代码
{/* 初始化摄像头设备*/linux_v4l2_device_init("/dev/video7");  /* 启动摄像头*/linux_v4l2_start_capturing(); while(1){// 实时监控/* 获取摄像头数据      存放jpg文件流*/linux_v4l2_get_fream(&freambuf);          /* 显示摄像头图像*/lcd_draw_jpg(80, 0, NULL, freambuf.buf, freambuf.length, 0);/* WiFi发送摄像头图像*/sendto(Socket_fd, freambuf.buf, freambuf.length, 0, (struct sockaddr *)&Phone_ipaddr, addrlen);}    /* 停止摄像头*/linux_v4l2_stop_capturing();  /* 卸载摄像头*/linux_v4l2_device_uinit();
}

初始化UDP通信的网络接口

const char* ip = "192.168.5.100";
void Udp_Init() //创建UDP套接字。Bind指定的IP和端口号
{Socket_fd = socket(AF_INET, SOCK_DGRAM, 0);if(Socket_fd < 0){perror("socket failed");return ;}Arm_ipaddr.sin_family = AF_INET;Arm_ipaddr.sin_port   = htons(2234);inet_pton(AF_INET, ip, &Arm_ipaddr.sin_addr);    addrlen = sizeof(struct sockaddr_in);int ret = bind(Socket_fd, (struct sockaddr *)&Arm_ipaddr, addrlen);if(ret < 0){perror("bind failed");return ;}
}

在主线程中需要完成的就是接收上位机发送过来的信息,并解析保存上位机的IP地址和端口号,线程Jpg_Real_Time( )得到上位机的IP地址和端口号之后,就可以将采集到视频数据通过UDP传输给上位机显示。

int main(int argc,char**argv)
{//0,初始化udp网络通信Udp_Init();//1,创建一条线程去实现实时监控pthread_t tid;pthread_create(&tid, NULL, Jpg_Real_Time, NULL);//2,主线程接受手机端发送的数据char buf[128];char ip_addr[20] = {0};while(1){bzero(buf, sizeof(buf));recvfrom(Socket_fd, buf, sizeof(buf), 0,(struct sockaddr *)&Phone_ipaddr, &addrlen);printf("from:%s port:%d recvbuf:%s\n", inet_ntop(AF_INET, &Phone_ipaddr.sin_addr, ip_addr, sizeof(ip_addr)), ntohs(Phone_ipaddr.sin_port), buf); }return 0;
}

到这里就全部完成了所有的程序设计,下面就需要在Ubuntu中编译要在开发板中运行的服务器程序了。使用如下命令编译程序。因为我们需要显示的是jpeg格式的图片数据,所以需要在编译文件路径下包含jpeg解码包。如果你用的YUYV格式的摄像头,还需要将采集到的图片转换成jepg格式的图片才能显示。

arm-linux-gnueabi-gcc realtime_video.c -o realtime_video -I ./libjpeg -L ./libjpeg -lapi_v4l2_arm -lpthread -ljpeg

解释一下上面的内容

-I./libjpeg : 指定动态库头文件位置
-L./libjpeg : 指定动态库,库文件位置
-ljpeg : 指定动态库名

之后在开发板上插入摄像头,运行程序,打开上位机,点击摄像头按钮,就可以显示摄像头采集的数据了

至此这个项目需要掌握的知识点基本上算是讲完了,后面无非就是对上位机的美化与重新设计了,牵扯到的还是网络编程,来发送数据的问题。

完整代码我会贴在公众号中,需要完整代码的关注公众号回复视频监控第三讲获取。有什么问题也可以在下方留言,我看到之后会回复你。

我是河边小乌龟爬,学习嵌入式软件开发路上的一名小学生,欢迎大家相互交流哇。公众号:河边小乌龟爬。

(群名称:嵌入式软件开发交流群;群 号:1004953094)

嵌入式项目实战——基于QT的视频监控系统设计(三)相关推荐

  1. 嵌入式项目实战——基于QT的视频监控系统设计(二)

    嵌入式项目实战--基于QT的视频监控系统设计(二) 昨天我分享了关于QT的基本使用方法,掌握了这些基本的方法就可以设计一个简单的视频监控界面.下面我们开始分享完成这个嵌入式项目同样重要的知识点--UD ...

  2. 嵌入式项目实战——基于QT的视频监控系统设计(四)

    嵌入式项目实战--基于QT的视频监控系统设计(四) 进入到五一假期的第四天,通过前三天的分享,相信你应该已经掌握了QT的基本使用.UDP网络编程.v4l2视频处理模块.多线程编程等基本的知识点.其实昨 ...

  3. 嵌入式项目实战——基于QT的视频监控系统设计(一)

    嵌入式项目实战--基于QT的视频监控系统设计(一) 这个五一因为疫情,只能待在家里,想了想不如将我之前做的一个小的嵌入式的练习项目分享出来,供入门嵌入式的同学们学习.基于QT的视频监控系统设计虽然是个 ...

  4. Linux下基于qt的视频监控系统

    目录 一.原始需求 二.环境安装 2.1 qt安装 2.2 opencv安装 三.系统设计 3.1. 整体流程设计 3.2 .数据传输交互流程 3.3 .数据库设计 四.关键代码 4.1.如何实现通信 ...

  5. 项目:基于QT的智能家居系统设计

    项目内容涉及QT.数据库.服务器.网关.协调器.传感器等! 邮箱:Zhangyc_Engineer@qq.com(需要的朋友联系我邮箱即可)

  6. QT5/C++项目:基于QT的跨平台网络对战象棋(一)(推荐★★★★)

    QT5/C++项目:基于QT的跨平台网络对战象棋(一)(推荐★★★★) 文章目录 QT5/C++项目:基于QT的跨平台网络对战象棋(一)(推荐★★★★) 本篇副标题: 本篇博客讲了什么or解决了什么问 ...

  7. RAM嵌入式项目实战开发

    对于有嵌入式技术基础的初学者来说,嵌入式项目实战是具有很大吸引力和挑战性的.同时,通过项目实践可以快速提升自己的实战技术,编程能力和项目开发能力.为了记录自己的学习历程,特写此文以回顾. (一)arm ...

  8. aiku大神归来!送给初学者嵌入式项目实战开发

    aiku大神归来!送给初学者嵌入式项目实战开发 aiku嵌入式视频教程 地址:[创科之龙]基于安卓(android)Linux3.x平台下设备树专题 https://pan.baidu.com/s/1 ...

  9. QT5/C++项目:基于QT的跨平台网络对战象棋(三)(推荐★★★★)

    QT5/C++项目:基于QT的跨平台网络对战象棋(三)(推荐★★★★) 文章目录 QT5/C++项目:基于QT的跨平台网络对战象棋(三)(推荐★★★★) 本篇副标题: 本篇博客讲了什么or解决了什么问 ...

最新文章

  1. 接口测试和单元测试的区别
  2. 5月第2周编辑部标题训练:寻找读者最关注的新闻点
  3. C# 移除数组中重复项
  4. C++中的继承(二)
  5. 分享自己写的一个贪吃蛇的游戏(Linux)
  6. flash动画制作作品_flash施工动画制作应该展现哪些内容
  7. 判断玫瑰花数c语言程序设计教程课后答案,编写程序判断某个四位整数是否为玫瑰花数(用自定义函数)...
  8. 安卓开发之android使用webview时按后退会退出而不是回退的问题
  9. (四)将容器部署到Azure上的Kubernetes
  10. 河北金融学院计算机与科学,河北金融学院计算机科学与技术专业2016年在河北理科高考录取最低分数线...
  11. BZOJ 3251: 树上三角形
  12. numpy—np.nan_to_num
  13. java几种远程服务调用协议的比较
  14. Spring注解扫描原理浅析
  15. SpringBoot 集成 ES 7.6.2 并对字段进行中文和拼音分词处理
  16. C++——set基本操作总结
  17. android MVP——mvp架构的应用和优化
  18. python 多mic录音WASAPI
  19. 基于诺诺电子发票平台开发开具电子发票
  20. Qt学习之QMainWindow(一)QMainWindow简介

热门文章

  1. 画一幅表现压力的抽象画,我是这样画的
  2. 4G+GPS天线+MQTT连接湖畔云,上传GPS信息
  3. 【技术类】【了解金字塔】金字塔是什么
  4. 【解决方案】EasyNVR视频边缘计算网关如何实现智慧消防?
  5. 后端学习关卡三习题归纳及问题解决1
  6. vs2010配置python_win7 环境安装Python + IDE(vs2010)开发
  7. 计算机切换输入法Word关闭,电脑office编辑文字输入法快捷键不能切换怎么办
  8. 【论文笔记】A Multi-Task Learning Formulation for Predicting Disease Progression
  9. cocos2dx3.X shader使图片置灰
  10. 软考高级系统架构设计师系列之:详细整理高级系统架构设计师核心知识点