OpenCV能够为我们带来便捷的图像处理接口,但是其处理速度在一块树莓派上肯定是不尽如人意的。尤其当我们想要使用复杂的算法时,只能把算法托到服务器上才有可能。这里介绍了一种方法,实现树莓派传输Mat至电脑。

准备工作

1、配置好树莓派上的OpenCV.

2、配置好电脑上的OpenCV.

思路

Socket实现方法较为简单,但在此处需要注意的是:

树莓派上的,是linux系统;而我电脑上是windows系统,需要注意这一点来进行编程。

代码

树莓派作为客户端,发送Mat.

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
#include <opencv2/opencv.hpp>
using namespace cv;
using namespace std; void error(const char *msg)
{
perror(msg);
exit(0);
} int main()
{
int sockfd, portno, n;
struct sockaddr_in serv_addr;
struct hostent *server; portno = atoi("8888");
sockfd = socket(AF_INET, SOCK_STREAM, 0);
if (sockfd < 0)
error("ERROR opening socket");
server = gethostbyname("10.138.216.104");//这里填IP地址
if (server == NULL) {
fprintf(stderr, "ERROR, no such host\n");
exit(0);
}
bzero((char *)&serv_addr, sizeof(serv_addr));
serv_addr.sin_family = AF_INET;
bcopy((char *)server->h_addr,
(char *)&serv_addr.sin_addr.s_addr,
server->h_length);
serv_addr.sin_port = htons(portno);
if (connect(sockfd, (struct sockaddr *) &serv_addr, sizeof(serv_addr)) < 0)
error("ERROR connecting"); VideoCapture cap(0);
Mat frame;
while (true)
{
cap >> frame;
cvtColor(frame, frame, CV_BGR2GRAY);
// Send data here
int bytes = send(sockfd, frame.data, frame.total()*frame.elemSize(), 0));
}
waitKey(0);
return 0;
}

服务器接收并显示

    #include <winsock2.h>
#include <opencv.hpp>
using namespace cv;
using namespace std;
#pragma comment(lib,"ws2_32.lib")
#define imgSize 307200 //这里需要算一下,因为Visual Studio不能支持用变量初始化数组
//imgSize=frame.total()*frame.elemSize();
//即:如果为灰度图:图像的宽*图像的高 这里是640*480 int main(int argc, char* argv[])
{
//初始化WSA
WORD sockVersion = MAKEWORD(2, 2);
WSADATA wsaData;
if (WSAStartup(sockVersion, &wsaData) != 0)
{
return 0;
}
//创建套接字
SOCKET slisten = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (slisten == INVALID_SOCKET)
{
printf("socket error !");
return 0;
}
//绑定IP和端口
sockaddr_in sin;
sin.sin_family = AF_INET;
sin.sin_port = htons(8888);
sin.sin_addr.S_un.S_addr = INADDR_ANY;
if (bind(slisten, (LPSOCKADDR)&sin, sizeof(sin)) == SOCKET_ERROR)
{
printf("bind error !");
} //开始监听
if (listen(slisten, 5) == SOCKET_ERROR)
{
printf("listen error !");
return 0;
} SOCKET sClient;
sockaddr_in remoteAddr;
int nAddrlen = sizeof(remoteAddr); cout << "Wait.." << endl;
do
{
sClient = accept(slisten, (SOCKADDR *)&remoteAddr, &nAddrlen);
} while (sClient == INVALID_SOCKET);
cout<<"Received Information come from"<< inet_ntoa(remoteAddr.sin_addr)<<endl; int bytes = 0;
while (1)
{
char socketData[imgSize]; for (int i = 0; i < imgSize; i += bytes) {
if ((bytes = recv(sClient, socketData + i, imgSize - i, 0)) == -1)
{
cout << "!Fault" << endl;
exit(-1);
}
} // change the last loop to below statement
Mat img(Size(640, 480), CV_8UC1, socketData);//根据摄像头大小自行修改
imshow("Face_Socket", img);
waitKey(1);
}
closesocket(slisten);
WSACleanup();
return 0;
}

先运行服务器,后运行客户端(其实无所谓),我们就可以在服务器上看到树莓派通过摄像头获取到的帧,那么就可以对齐进行很多操作了。

OpenCV与Socket实现树莓派获取摄像头视频至电脑的更多相关文章

  1. [OpenCV]获取摄像头视频

    环境:Windows 8 64bit + VS2012 X64 + OpenCV 2.4.7 摄像头的捕捉使用VideoCapture类 Class VideoCapture    [OpenCV文档 ...

  2. python opencv3 获取摄像头视频

    git:https://github.com/linyi0604/Computer-Vision # coding:utf8 import cv2 """ 捕获摄像头10 ...

  3. 树莓派自身摄像头的opencv调用

    很多人知道,opencv不能直接对树莓派原装摄像头进行调用,因为raspicam不是V4L驱动,怎样才能使用树莓派原装摄像头,它可比多数usb摄像头清晰和小巧. 具体方法,给树莓派原装摄像头安装一个可 ...

  4. Opencv+MFC获取摄像头数据,显示在Picture控件

    分为两步:OpenCV获取摄像头数据+图像在Picture上显示 第一步:OpenCV获取摄像头数据 参考:http://www.cnblogs.com/epirus/archive/2012/06/ ...

  5. python之OpenCv(五)---抓取摄像头视频图像

    OpenCV 可以通过 头videoCapture()方法打开摄像 摄像头变量 = cv2.VideoCapture(n)   n为整数,内置摄像头为0,若有其他摄像头则依次为1,2,3,4,... ...

  6. Opencv保存摄像头视频&&各种编码器下视频文件占用空间对比

    打开视频文件或摄像头视频需要使用Opencv中的VideoCapture类,保存视频或摄像头视频到本地磁盘,需要使用Opencv中的VideoWriter类,使用都很简单,这篇文章就记录一下Video ...

  7. 【opencv】VideoCapture打不开本地视频文件或者网络IP摄像头

    1.前提:成功打开本地USB摄像头 // 创建VideoCapture对象 VideoCapture vc = new VideoCapture(); // 可以成功打开本地USB摄像头 // 参数可 ...

  8. [转载]树莓派新版系统上使用mjpg-streamer获取USB摄像头和树莓派专用摄像头RaspiCamera图像

    树莓派新版系统上使用mjpg-streamer获取USB摄像头和树莓派专用摄像头RaspiCamera图像 网上有很多关于mjpg-stream移植到树莓派的文章,大部分还是使用的sourceforg ...

  9. OpenCV 编程简单介绍(矩阵/图像/视频的基本读写操作)

    PS. 因为csdn博客文章长度有限制,本文有部分内容被截掉了.在OpenCV中文站点的wiki上有可读性更好.而且是完整的版本号,欢迎浏览. OpenCV Wiki :<OpenCV 编程简单 ...

随机推荐

  1. 网页里如何使用js禁用F12事件

    接上一篇,突然想起来,类似于网页里如何使用js禁用鼠标右击事件,还有禁用F12事件也可以禁用一下,总所周知,对于Web开发人员来说,常常要进行界面的调试.使用F12调试工具能够很方便地进行调试,查看h ...

  2. Camera Calibration 相机标定:原理简介(一)

    1 相机标定常见方法 广义来说,相机标定不单包括成像过程的几何关系标定,还包括辐射关系的标定,本文只探讨几何关系.相机标定是3D计算机视觉(Computer Vision)里从2D图像中提取量测信息的 ...

  3. Qt之QNetworkProxy(网络代理)

    简述 QNetworkProxy类提供了一个网络层代理. QNetworkProxy提供了配置网络层代理支持Qt网络类的方法.目前支持的类有QAbstractSocket.QTcpSocket.QUd ...

  4. POJ 2739 Sum of Consecutive Prime Numbers(素数)

    POJ 2739 Sum of Consecutive Prime Numbers(素数) http://poj.org/problem? id=2739 题意: 给你一个10000以内的自然数X.然 ...

  5. mysql-联结

    一.联结 联结是利用SQL的select能执行的最重要的操作. 1.关系表:假如有一个包含产品目录的数据库表,其中每个类别的物品占一行.对于每种物品要求存储的信息包括产品描述和价格,以及生产该产品的供 ...

  6. sicily 1000. LinkedList

    Description template <typename E> class LinkedList { private:     // inner class: linked-list ...

  7. 日志文件支持unicode字符的做法

    作者:朱金灿 来源:http://blog.csdn.net/clever101 开发的程序兼容多字节字符集和unicode字符集,最近发现一个问题,在unicode字符集下输出的日志文件是乱码的.显 ...

  8. sql 的几种常用方法

    第一个项目总结基类:database:主要是定义有关数据库的方法: 1.打开数据库 public static void Open() { ( "server=.\\sqlexpress;d ...

  9. HDU 1240 Asteroids!【BFS】

    题意:给出一个三维的空间,给出起点和终点,问是否能够到达终点 和上一题一样,只不过这一题的坐标是zxy输入的, 因为题目中说的是接下来的n行中分别是由n*n的矩形组成的,所以第一个n该是Z坐标,n*n ...

  10. hp服务器安装exsi5.5

    启动按f8进入raid制造页面: 1.  插入exsi5.5光盘 2.  按下开机键(开机比较慢需要等待一段时间) 3.  进入启动项目界面(插入光盘后启动会让你选择启动项.选择1光盘启动) 接下来按 ...