OpenCV + OpenWRT 无线摄像头监控和图像处理

来自https://www.hsli.top

第一次写这样类型的文章,不合规矩之处敬请大家多多包涵,闲话少说,直入正题

【OpenCV】

曾经用Matlab做过简单的图像识别处理,后来发现OpenCV更为成熟和易用,因此转投OpenCV。最近准备学校的科技创新大赛,打算做关于图像识别的东西,刚好又要学OpenCV,因此从这里入门

【OpenWRT】

OpenWRT是广泛使用的开源路由器操作系统,因为开源所以强大。

手头有一台MW151路由,据悉该路由与TP-Link 703n的区别只是USB口,改装升级内存和flash,刷上703n的OpenWRT固件,一台适宜开发的设备诞生了。

【步骤:路由】

路由器上的原材料:

703n固件

mjpeg-streamer软件

免驱摄像头(笔者使用的是某宝上淘来的东芝笔记本拆机摄像头)

首先要实现图像传输需要在路由上挂载USB摄像头

### 1.安装mjpeg-streamer讲软件解压,把其中的www目录放到路由器的www目录下,改名为camwww,向路由器上传文件可以用WinSCP,重启路由

图片1

### 2.插好摄像头开机,启动mjpeg-streamer,ssh登陆路由(可以用Putty软件ssh登录)输入以下命令

1
mjpg_streamer -i "input_uvc.so  -d /dev/video0" -o "output_http.so -p 8080 -w /www/camwww"

8080指视频流使用端口,可以自定义,其余选项为默认分辨率640x480,30fps

图片2

用户可以根据自己的需求自定义,例如

1
mjpg_streamer -i "input_uvc.so -f 15 -r 320*240 -d /dev/video0" -o "output_http.so -p 8080 -w /www/camwww"

表示分辨率320x240,15fps
这时候可以看到摄像头的LED被点亮,结束操作时按Ctrl+C键可退出mjpg-streamer

图片3

此时用浏览器(建议用火狐)连接路由器打开以下地址,可以查看摄像头的实时图像

1
http://192.168.10.1:8080/?action=stream

192.168.10.1是路由器地址,8080是刚才设置的stream端口

至此,OpenWRT已经实现挂载摄像头进行无线监控。

【步骤:OpenCV】

电脑是已经安装好Visual Studio 2013并配置好OpenCV 2.4.10

要用OpenCV对路由器传输的实时图像进行处理,只需要让程序从网页获取图像,在while循环里不断把采集的图像转换成Mat矩阵(新版本的OpenCV正在逐步淘汰IplImage结构体)既可,令人欣喜的是,OpenCV里的VideoCapture类本身就能从网页获取图像,因此带来了极大的方便,具体如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
#include "opencv2/highgui/highgui.hpp"  
#include "opencv2/imgproc/imgproc.hpp"
#include <iostream>
#include <stdio.h>
//头文件

using namespace std;
using namespace cv;

/** @function main */
int main(int argc, char** argv)
{
Mat src;
cv::VideoCapture vcap;

const string address = "http://192.168.10.1:8080/?action=stream?dummy=param.mjpg";

if (!vcap.open(address))
{
cout << "Error opening video stream" << endl;
return -1;
}

cout << "Stream opened" << endl;

while (1)
{

vcap >> src;
// your code here
/// Show your results
namedWindow("Cam", CV_WINDOW_AUTOSIZE);
imshow("Cam", src);
if (waitKey(2) == 27)
break;
// Press "Esc" to exit
}
return 0;
}

上文中如果address直接等于浏览器地址栏中输入的地址,将不能获取图像,一个解释是,需要让程序知道视频流是jpeg类型,因此“伪造”了一个jpeg文件名

下图是修改OpenCV官网的一个demo,亲测在路由上获取图像可行(分别从笔记本摄像头和路由器挂载的无线摄像头)

图片5

如果文章有用,请随意打赏