C++

接收端

#include <iostream>
#include <opencv.hpp>
#include <WinSock2.h>
#pragma comment(lib,"WS2_32.lib")using namespace std;
using namespace cv;int main()
{WSADATA wsaData;if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0){printf("init windows socket error: errno %d\n",WSAGetLastError());return -1;}//创建初始化句柄SOCKET sockServe;if ((sockServe = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)) == INVALID_SOCKET)    //创建socket句柄,采用UDP协议{printf("create socket error: errno %d\n", WSAGetLastError());return -1;}sockaddr_in servaddr;servaddr.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");servaddr.sin_family = AF_INET;           //设置通信方式servaddr.sin_port = htons(8554);         //设置端口号if (::bind(sockServe, (const sockaddr*)&servaddr, sizeof(servaddr)) == SOCKET_ERROR){printf("bind socket  with IP error: errno %d\n", WSAGetLastError());return -1;}//绑定套接字listen(sockServe, 3);Mat image;int MAX_DGRAM = 65536;char buf[65536];while (true){std::vector<uchar> decode;int count;do{int nBytes = recv(sockServe, buf, sizeof(buf), 0);//接受缓存count = buf[0];for (int i = 1; i < nBytes; i++){decode.push_back(buf[i]);}cout << count << endl;} while (count > 1);image = imdecode(decode, cv::ImreadModes::IMREAD_COLOR);//图像解码cout<<image.size()<<endl;//在UDP传输的过程中,可能回发生丢包,因此需要对接受到的影像进行判断if (image.empty()){continue;}imshow("serve image", image);cv::waitKey(1);}closesocket(sockServe);WSACleanup();return 0;
}

发送端

#include <iostream>
#include <opencv.hpp>
#include <WinSock2.h>
#pragma comment(lib,"WS2_32.lib")
using namespace std;
using namespace cv;
#define MAX_DGRAM 65535int main()
{WSADATA wsaData;if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0){//errno 是error.h中定义的宏,表示的是程序运行是发生错误的错误代码//strerror定义在string.h中,用于打印错误代码对应的错误描述printf("init windows socket error:errno %d\n",WSAGetLastError());return -1;}//创建初始化句柄SOCKET clientSock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);if (clientSock == INVALID_SOCKET){printf("create client socket error:errno %d\n",WSAGetLastError());return -1;}//定义服务端的IP地址,向服务端发送请求sockaddr_in serveaddr;memset(&serveaddr, 0, sizeof(serveaddr));serveaddr.sin_family = AF_INET;serveaddr.sin_port = htons(8554);serveaddr.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");VideoCapture vCapture(0);while (true){if (!vCapture.isOpened()){break;}Mat image;bool flag = vCapture.read(image);if (!flag){break;}vector<uchar> imageBuf;int bufSize;imencode(".jpg", image, imageBuf);bufSize = imageBuf.size();char imageBlockBuf[65536];int count = ceil(1.0*bufSize / MAX_DGRAM);int start_index = 0, end_index;while (count){end_index = start_index + MAX_DGRAM;if (end_index > bufSize){end_index = bufSize;}imageBlockBuf[0] = count;int pos = 1;for (int i = start_index; i < end_index; i++){imageBlockBuf[pos] = imageBuf[i];pos++;}sendto(clientSock, imageBlockBuf, end_index-start_index+1, 0, (const sockaddr *)&serveaddr, sizeof(serveaddr));count--;start_index = end_index;}cv::imshow("client", image);cv::waitKey(1);}closesocket(clientSock);WSACleanup();return 0;
}

python

接收端

#!/usr/bin/env pythonfrom __future__ import division
import cv2
import numpy as np
import socket
import structMAX_DGRAM = 2**16def main():""" Getting image udp frame &concate before decode and output image """# Set up sockets = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)s.bind(('127.0.0.1', 8554))dat = b''while True:seg, addr = s.recvfrom(MAX_DGRAM)if struct.unpack("B", seg[0:1])[0] > 1:dat += seg[1:]else:dat += seg[1:]print(np.fromstring(dat, dtype=np.uint8))img = cv2.imdecode(np.fromstring(dat, dtype=np.uint8), 1)print(img)cv2.imshow('frame', img)if cv2.waitKey(1) & 0xFF == ord('q'):breakdat = b''cv2.destroyAllWindows()s.close()if __name__ == "__main__":main()

发送端

#!/usr/bin/env pythonfrom __future__ import division
import cv2
import numpy as np
import socket
import struct
import mathclass FrameSegment(object):"""Object to break down image frame segmentif the size of image exceed maximum datagram size"""MAX_DGRAM = 2**16MAX_IMAGE_DGRAM = MAX_DGRAM - 64 # extract 64 bytes in case UDP frame overflowndef __init__(self, sock:socket.socket, port, addr="127.0.0.1"):self.s = sockself.port = portself.addr = addrdef udp_frame(self, img):"""Compress image and Break downinto data segments"""compress_img = cv2.imencode('.jpg', img)[1]dat = compress_img.tostring()size = len(dat)print(size)count = math.ceil(size/(self.MAX_IMAGE_DGRAM))array_pos_start = 0while count:array_pos_end = min(size, array_pos_start + self.MAX_IMAGE_DGRAM)self.s.sendto(struct.pack("B", count) +dat[array_pos_start:array_pos_end],(self.addr, self.port))array_pos_start = array_pos_endcount -= 1def main():""" Top level main function """# Set up UDP sockets = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)port = 8554fs = FrameSegment(s, port)cap = cv2.VideoCapture(0)while (cap.isOpened()):_, frame = cap.read()fs.udp_frame(frame)cv2.imshow("client",frame)cv2.waitKey(1)cap.release()cv2.destroyAllWindows()s.close()if __name__ == "__main__":main()

运行

两种不同语言的接收端和服务端可以混合使用

OpenCV 网络视频传输 C++ 和 python实现相关推荐

  1. 智能终端会议系统(20)---网络视频传输协议--RTP/RTCP/RTSP/SIP/SDP 之间关系

    网络视频传输协议--RTP/RTCP/RTSP/SIP/SDP 之间关系 RTP/RTCP/RTSP/SIP/SDP 关系 1. RTP Real-time Transport Protocol,是用 ...

  2. 基于NS-2的网络视频传输仿真平台的建立

    基于NS-2的网络视频传输仿真平台的建立   ----网络视频传输仿真平台的建立 摘 要 随着Internet和多媒体技术的迅猛发展, Internet已逐步从单一的数据传送网向数据.语音.图像等多媒 ...

  3. mini2440 网络视频传输试验

    Mjpeg‐stream 是一个开源软件,用于把mjpeg格式的文件变成流媒体输出. 1.  环境平台 目标板:mini2440 开发板上运行的系统: 内核 Linux‐2.6.32.2, 默认文件系 ...

  4. 简单了解音视频传输协议SDP、RTP、RTMP、SIP等

    SDP 会话描述协议(SDP)为会话通知.会话邀请和其它形式的多媒体会话初始化等目的提供了多媒体会话描述.参考RFC2327(Request For Comments(RFC),是一系列以编号排定的文 ...

  5. 基于嵌入式技术的网络视频监控系统

    随着计算机技术及网络技术的迅猛发展,世界掀起一股强大的数字化.网络化浪潮,对于公安.安防行业的发展,必须经历模拟数字混合的阶段,但是最终的趋势必然是全面数字化,即视频在前端进行数字化.网络化,采用嵌入 ...

  6. 中国网络视频行业发展战略预测及未来发展趋势展望报告2021-2027年

    第1章:中国网络视频行业发展概述 1.1 网络视频行业的界定 1.1.1 网络视频的定义 1.1.2 网络视频行业界定 1.1.3 网络视频的分类 1.2 网络视频行业特性分析 1.2.1 网络视频行 ...

  7. 使用Python,OpenCV读取视频的每一帧,修改后写入视频

    使用OpenCV 3将视频写入文件,并保存在自己的磁盘上 尝试支持avi.MP4文件格式的写入,俩种文件的编码格式不一致 codec: MJPG output: example.avi codec: ...

  8. python传输视频文件_Python视频传输

    ubuntu16.04+python2+opencv (一) 开发前的准备工作 sudo apt-get install python-pip pip install numpy pip instal ...

  9. python 通过socket通讯实现实时摄像头视频传输

    话不多说,直接上代码: 这是服务端代码: import socket import cv2 import numpy as npsk = socket.socket() # sk.setsockopt ...

  10. python opencv 录制视频_如何使用OpenCV、Python和深度学习在图像和视频中实现面部识别?...

    Face ID 的兴起带动了一波面部识别技术热潮.本文将介绍如何使用 OpenCV.Python 和深度学习在图像和视频中实现面部识别,以基于深度识别的面部嵌入,实时执行且达到高准确度. 以下内容由 ...

最新文章

  1. 动态链接库dll,静态链接库lib, 导入库lib
  2. Codeforces Beta Round #19 D. Points
  3. 迈达斯cdn使用说明_快速了解CDN是什么
  4. [原创]如何培养孩子的自信
  5. 蓝桥杯 C语言 试题 历届试题 格子刷油漆
  6. linux安装开发工具
  7. Windows下安装Redis图文教程
  8. C# 后端代码中使用事务
  9. 对数幅度谱图像matlab,fft2绘制图像的对数幅度谱,比较图像旋转平移和缩放后的频谱.doc...
  10. linux截图翻译,图片实时识别翻译大师
  11. Python 之多元线性回归分析
  12. html5课程总结500字,月考总结500字作文5篇
  13. Android Studio连接海马玩模拟器
  14. 使用Docker发布DNC项目
  15. c语言课英语单词,课程英语单词大全:英语单词32个课程加翻译
  16. [ICPC USA]Faulty Robot
  17. CS5213芯片|HDMI to VGA转换头芯片资料分享
  18. 推荐几款主流好用的远程终端连接管理软件
  19. cc链2(小宇特详解)
  20. 华为云硬盘备份(VBS)服务

热门文章

  1. NB-IOT模块学习
  2. python UI自动化无界面运行
  3. Alex 的 Hadoop 菜鸟教程: 第20课 工作流引擎 Oozie
  4. 苹果sf字体_字体基础知识
  5. 软件项目管理的重点知识
  6. 京东自动签到领京豆软件_京东618来了,合法又简单的自动领京豆的技能要get一下吗?...
  7. 产品必备-产品FDD模板(PRD)
  8. 【Scratch案例实操】scratch大鱼吃小鱼(完整详案) scratch编程案例教学 scratch创意编程 少儿编程教案
  9. 三角网导线平差实例_三角网闭合导线平差计算表0
  10. Chrome插件:OneNote Web Clipper 搜集和整合碎片信息的神器