视频监控项目--友善之臂---阿里云---QT---mjpg-streamer

一.项目流程

1.工作流程

简言之:我们使用的是开源库mjpg-streamer.摄像头采集的数据会保存在/dev/video0目录下,然后输入进tcp服务器,在浏览器开始访问。

我们要做的就是讲tcp服务器数据进行读取,然后建立自己的客户端,通过客户端将数据发送阿里云,通过上位或者手机查看。

2.具体步骤

摄像头---云服务器

1).本地创建客户端

2).客户端与云服务器建立TCP连接,将摄像头信息通过json-c发送给云服务器,云服务器创建链表记录摄像头信息(客户端id,摄像头id),同时启动udp socket,并将创建绑定的ip地址和端口号通过json格式TCP发送给客户端。

3).客户端---->发送请求给mjpg-streamer服务器---->服务器收到请求后将摄像头数据发送给客户端

4).摄像头创建udp socket向服务器发送视频数据.

5).服务器收到数据以后,读取保存。

APP---云服务器(获取视频数据)

1).上位机通过TCP连接云服务器,发送获取数据请求给服务器

2).服务器收到请求后,创建udp socket,通过json--tcp将ip和端口号返回给上位机

3).上位机收到服务器信息后,创建udp socket发送信息给服务器准备开始接受数据。

4).服务器收到来自上位机udp信息后,返回视频数据(从内存加锁读取)

APP---云服务器(旋转舵机)

1).APP发送数据:{"cmd":"control", "action":"left", "appid":"1000", "deviceid":"0001"}---TCP
2).服务器收到数据解析deviceid 
3).遍历链表 找到对应摄像头的 fd 向 fd 发送数据
4).摄像头收到数据 解析 action 并且做出响应

二.NanoPi Duo2

1.根据友善官方教程烧固件,连接wifi,建立ssh连接最后通过xshell进行编写代码

NanoPi Duo2/zh

登录账户:root 

密码:fa

1).ping开发板ip地址ping不通

解决:关闭Linux 防火墙:ufw disable

          关闭电脑防火墙:控制面板---系统安全  (记住杀毒软件也要关闭)

          查看路由器设置(可以用手机热点测试)

Linux开发环境搭建与使用——Linux必备软件之SSH

三.mjpg-streamer(适用于摄像头v4l2框架)   

mjpg-stream源码

1.启动

直接运行开发板自带的mjpg-streamer,./start.sh运行,在start.sh更改参数

打开浏览器,输入ip和默认端口号

四.访问gpio口

安装wiringNP

然后找到PWM示例’

五.搭建交叉编译环境

我们使用的ubuntu是x86-64位架构,而开发板使用的是arm架构,将ubuntu上的二进制文件拷贝到开发板上是运行不通的。

开发板一般不具备编译器的,因为占用大内存,所以一般不在开发板直接写程序。

所以需要在服务器上安装交叉编译器,使得编译好的文件可以再不通架构上运行

解压完毕后

打开环境变量vim /root/.bashrc,将安装交叉编译器的路径添加到环境变量里边

运行 source /root/.bashrc

注意:编译器只支持64位系统。需要安装64位Ubuntu。所以会提示格式错误

编译通过后:

将本机的可执行文件发送到 开发板---xshell

六.摄像头主程序

1.交叉编译json-c(注意版本不同函数不同)

写程序前需要json-c,如果用linux:apt get得到的是x86的json,我们需要64位json,下载地址   github

下载完毕后移入项目工程文件夹,打开json的readme,按照执行要求

安装插件

apt-get install shtool

执行脚本后,会生成这个文件,configure可以检查编译环境,如果没有问题,则会生成makefile

执行configure

make install

编译

打开json-c vim config.h.in

x因为config配置文件更改,需要重新编译生成makefile

然后打开makefile,把-werro删除

make install

在重新编译我们自己的makefile

示例:

创建Tcp连接---连接阿里云服务器---主线程通过json 发送数据{"cmd":"info", "deviceid":"0001"}  ,立即返回{"cmd":"info", "port":"0001"}
struct json_object *obj
创建json类-- obj = json_object_new_object()
{"cmd":"info", "deviceid":"0001"}  json_object_object_add(obj,"cmd",json_object_new_string("info"))
                json_object_object_add(obj,"deviceid",json_object_new_string("0001"))
将obj类转换成字符串const char *json_object_to_json_string(obj)
解析字符串数据 obj = json_tokener_parse(buff)
从json类获取获取cmd下的数据struct json_object *cmd =  json_object_object_get( obj,“cmd”)
从json类获取解析cmd下的字符串数据char *s = json_object_get_string(cmd)
从json类获取解析cmd下的整形数据int a = json_object_get_int(deviceid)

2.大体流程:

1.创建socket套接字,连接阿里云服务器,ip地址选用公网ip(端口号不能使用8080,8080数据mjpg)

2.发送json-c数据{"cmd":"info", "deviceid":"0001"}给服务器

3.服务器收到数据后解析保存fd,deviced

4.服务器发送json数据{"cmd":"port_info", "port":9000}给客户端,同时启动UDP sock

5.客户端解析数据,根据收到port创建UDP线程,发送摄像头数据

5.主线程通过tcp接收QT发送的指令。

七.获取并转发视频数据

在udp线程里获取摄像头数据,编程思路查看mjpg-streamer源码http.c,按照向http发送数据请求的格式推导出如何接每一帧数据。

在http.c中,摄像头发送数据给web流程:

1.web先发送“GET /?action=stream”给摄像头

2.web发送任意两个字节(读取user agent)

3.wed接受一次信息

while(1)

{

4.读取头部信息

5.读取一帧数据(注意解析帧长度)------Sscanf

6.读取尾部信息

}

示例:

八.交叉编译wiringPi

在Ubuntu终端输入:git clone https://github.com/friendlyarm/WiringNP即可安装

安装以后找到Makefile,修改36:gcc ---- arm-linux-gcc

make

因为我们编译的时候需要加-L,目的是需寻找动态库,而文件中只有

需要建立软连接:

make的时候默认相对路径 -L指定库路径 -I指定头文件

为什么要建立连接? 

为了解决文件共享使用问题,带来了隐藏文件路径、增加权限安全及节省存储等好处。这是cp /lib无法具备的

语法:ln [-s/p] source_file target_file

                   -s:建立软链接 特点:如果删除源文件,则软连接文件失效

                   -P:建立硬链接 特点:如果删除源文件,则硬连接文件正常

软链接与硬链接的区别?

在LInux系统中,文件有文件名和数据。而数据在Linux被分成两部分:用户数据 元数据

用户数据:文件数据块,数据块是基类文件真实内容的地方。

元数据:文件的属性 如:文件大小、创建时间、所有者等信息

Linux中inode编号是文件的唯一标识符。软连接是一个单独的文件(独立的inode编号,数据块存放的是源文件的文件名),硬连接与源文件共享inode编号

1.出现了git is currently not installed.

$ sudo add-apt-repository ppa:git-core/ppa
$ sudo apt-get update
$ sudo apt-get install git


$ git --version

git version 2.21.0

 

2.尝试了很多次子coding和github网站上均无法实现git clone命令时时,确认自己已经在本机上生成了ssh key,也已经将SSH 公钥添加到coding或者是github中,需要注意自己有没有在ubuntu系统中安装ssh服务,以及有没有开启SSH服务。

输入 $ ssh localhost

显示:ssh: connect to host localhost port 22: Connection refused 表示没有安装ssh server,通过如下命令安装

$ sudo apt-get install openssh-server

安装完成后启动服务

$ sudo /etc/init.d/ssh start

然后进行git clone 就可以了

九.阿里云服务器配置

将json安装包安装进去,然后sh autogen.sh,提示缺几个安装工具就安装上

./configure会提示-Werror,在Makefile中去掉-Werror(不能更改json原码,会出问题)

重新make

make install

在json_object.h 加入include “stdint.h”

编写完毕后在编译的的时候发现这个问题

 

先将本地本间上传

因为是动态链接,所以动态库路径需要修改。

需要将.so.0拷贝到根目录下的lib

十.QT端

QT创建TCp客户端和UDP客户端,TCP客户端发送命令(JSon数据包),UDP客户端获取图像数据

涉及到的类:

QTcpSocket、QJsonObject、QByteArray、QPixmap、QImage

 

 

 

  • 2
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
首先,你需要安装mjpg-streamer到你的树莓派上,可以通过以下命令进行安装: ``` sudo apt-get update sudo apt-get install subversion libjpeg-dev imagemagick libv4l-dev svn co https://svn.code.sf.net/p/mjpg-streamer/code/mjpg-streamer mjpg-streamer cd mjpg-streamer/mjpg-streamer make sudo make install ``` 安装完毕后,你需要下载并安装OpenCV,可以通过以下命令进行安装: ``` sudo apt-get install libopencv-dev python-opencv ``` 现在,你已经准备好开始使用mjpg-streamer和OpenCV来实现人形检测了。以下是一些基本步骤: 1. 启动mjpg-streamer ``` cd /usr/local/share/mjpg-streamer/ ./mjpg_streamer -i "input_uvc.so" -o "output_http.so -w ./www" ``` 这将启动mjpg-streamer并将其绑定到默认的视频设备(通常是/dev/video0)。现在你可以在浏览器中输入你的树莓派IP地址和端口号(默认为8080)来查看摄像头的实时视频流。 2. 导入OpenCV 在Python中,你需要导入OpenCV库来处理视频流和图像: ``` import cv2 ``` 3. 检测人形 以下是一个简单的示例代码,用于从mjpg-streamer视频流中检测人形: ``` import cv2 cap = cv2.VideoCapture('http://localhost:8080/?action=stream') while True: ret, frame = cap.read() if not ret: break gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) # 使用OpenCV的人形分类器进行检测 face_cascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml') faces = face_cascade.detectMultiScale(gray, scaleFactor=1.5, minNeighbors=5) # 在图像上绘制检测到的人形 for (x, y, w, h) in faces: cv2.rectangle(frame, (x, y), (x+w, y+h), (0, 255, 0), 2) cv2.imshow('frame', frame) if cv2.waitKey(1) == ord('q'): break cap.release() cv2.destroyAllWindows() ``` 在这个示例中,我们从mjpg-streamer视频流中读取每一帧,并将其转换为灰度图像。然后,我们使用OpenCV的人形分类器来检测人形,然后在图像上绘制矩形来标识检测到的人形。最后,我们在窗口中显示标记的图像。 请注意,这只是一个简单的示例,你可以根据自己的需求进行自定义。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值