1. 分段传输

代码说明:

首先,图像的大小为640*480,但是图像是三通道的彩色图像,每一列都有3个小列,所以每一行的像素个数为640*3;
其次,图像的高为480,也就是有480行,这里为了避免数组过大,所以传送时每一次传送15行,一共传送480/32=15次;
然后,传送时先用ptr指针找到每一行的首地址,在对每一行的像素进行遍历,依次把每行的640*3个像素点赋值给buf数组;
.h头文件中定义BUFFER_SIZE为640*480*3/32,每一行像素为640*3,每一轮传送15行,buf的大小为640*3/15
  • 发送方:
int transmit(cv::Mat image)
{if (image.empty()){printf("empty image\n\n");return -1;}for (int k = 0; k < 32; k++){int num1 = IMG_HEIGHT / 32 * k;for (int i = 0; i < IMG_HEIGHT / 32; i++){int num2 = i * IMG_WIDTH * 3;uchar* ucdata = image.ptr<uchar>(i + num1);for (int j = 0; j < IMG_WIDTH * 3; j++){data.buf[num2 + j] = ucdata[j];}}if (k == 31)data.flag = 2;elsedata.flag = 1;if (send(sockClient, (char *)(&data), sizeof(data), 0) < 0){printf("send msg error: %s(errno: %d)\n", strerror(errno), errno);return -1;}}
}
  • 接收方:
int receive(cv::Mat& image)
{cv::Mat img(IMG_HEIGHT, IMG_WIDTH, CV_8UC3, cv::Scalar(0));int needRecv = sizeof(recvbuf);  //28804int count = 0;extern int errno;while (1){for (int i = 0; i < 32; i++){int pos = 0;int len0 = 0;while (pos < needRecv){len0 = recv(sockConn, (char*)(&data) + pos, needRecv - pos, 0);if (len0 < 0){printf("Server Recieve Data Failed!\n");return -1;}pos += len0;}count = count + data.flag;int num1 = IMG_HEIGHT / 32 * i;for (int j = 0; j < IMG_HEIGHT / 32; j++){int num2 = j * IMG_WIDTH * 3;uchar* ucdata = img.ptr<uchar>(j + num1);for (int k = 0; k < IMG_WIDTH * 3; k++){ucdata[k] = data.buf[num2 + k];}}if (data.flag == 2){if (count == 33){image = img;return 1;count = 0;}else{count = 0;i = 0;}}}}
}
  1. 解码传输
  • 发送方:
 Mat image;VideoCapture capture(0);vector<uchar> data_encode;while (1){if (!capture.read(image)) break;imencode(".jpg", image, data_encode);int len_encode = data_encode.size();string len = to_string(len_encode);int length = len.length();for (int i = 0; i < 16 - length; i++){len = len + " ";}//发送数据send(sockClient, len.c_str(), strlen(len.c_str()), 0);char send_char[1];for (int i = 0; i < len_encode; i++){send_char[0] = data_encode[i];send(sockClient, send_char, 1, 0);}//接收返回信息char recvBuf[32];if(recv(sockClient, recvBuf, 32, 0))printf("%s\n", recvBuf);}
  • 接收方:
 while (1){if (recv(conn, recvBuf, 16, 0)){for (int i = 0; i < 16; i++){if (recvBuf[i]<'0' || recvBuf[i]>'9') recvBuf[i] = ' ';}data.resize(atoi(recvBuf));for (int i = 0; i < atoi(recvBuf); i++){recv(conn, recvBuf_1, 1, 0);data[i] = recvBuf_1[0];}printf("Image recieved successfully!\n");send(conn, "Server has recieved messages!", 29, 0);img_decode = imdecode(data, CV_LOAD_IMAGE_COLOR);imshow("server", img_decode);if (waitKey(30) == 27) break;}}

参考链接:
1.摄像头监控视频传输实现(C++)
2.网络编程:基于TCP的socket网络传输视频(C++, python)

Linux下基于TCP的视频传输(c++ )相关推荐

  1. 利用tcp完成文件传输linux,Linux下基于TCP的文件传输

    服务器: #include #include #include #include #include #include #include #define SERVER_PORT 6666 #define ...

  2. Linux下基于TCP的简易文件传输(socket编程)

    Linux下基于TCP的简易文件传输(socket编程) OSI和TCP/IP: 关于TCP/IP协议 关于TCP协议 TCP编程的一般步骤[^2] TCP文件传输实现 功能概述 服务器编程 客户端编 ...

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

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

  4. 嵌入式Linux下基于FFmpeg的视频硬件编解码

    嵌入式Linux下基于FFmpeg的视频硬件编解码[图] http://www.c114.net ( 2012/3/1 15:41 ) 摘要: 对FFmpeg多媒体解决方案中的视频编解码流程进行研究. ...

  5. 嵌入式Linux下基于FFmpeg的视频硬件编解码[图]

    转自:http://tech.c114.net/167/a674033.html 摘要: 对FFmpeg多媒体解决方案中的视频编解码流程进行研究.结合对S3C6410处理器视频硬件编解码方法的分析,阐 ...

  6. linux tcp文件分包_在Linux下基于TCP协议的文件传输程序.

    [设计目的] 通过 Linux C 编程,设计一个基于 TCP/IP 的文件传输系统,实现网络文件的收发 [设计环境] Ubuntu 12.04 [设计方案] ( 1 )文件读写 任意文件都可以二进制 ...

  7. linux 下基于jrtplib库的实时传送实现

    linux 下基于jrtplib库的实时传送实现 一.RTP 是进行实时流媒体传输的标准协议和关键技术 实时传输协议(Real-time Transport Protocol,PRT)是在 Inter ...

  8. linux下基于jrtplib库的实时传送实现

    linux 下基于jrtplib库的实时传送实现 一.RTP 是进行实时流媒体传输的标准协议和关键技术  实时传输协议(Real-time Transport Protocol,PRT)是在 Inte ...

  9. Linux下基于GTK人脸识别界面设计

    Linux下基于GTK人脸识别界面设计 1.人脸识别简介   人脸识别,是基于人的脸部特征信息进行身份识别的一种生物识别技术.用摄像机或摄像头采集含有人脸的图像或视频流,并自动在图像中检测和跟踪人脸, ...

  10. Linux下各类TCP网络服务器的实现源代码 转

    大家都知道各类网络服务器程序的编写步骤,并且都知道网络服务器就两大类:循环服务和并发服务.这里附上源代码来个小结吧. 首先,循环网络服务器编程实现的步骤是这样的: 这种服务器模型是典型循环服务,如果不 ...

最新文章

  1. 2020考研 管理类联考数学 【题型分析及解题思路】
  2. json vue 对象转数组_vue 基础入门(一)修改
  3. Log4j扩展使用--自定义输出
  4. 如何修改root目录内容后打包
  5. (十四)nodejs循序渐进-高性能游戏服务器框架pomelo之开发Treasures游戏
  6. 软件数控编程_这么多CNC数控编程软件, 你觉得哪个好?
  7. 计算几何--二维几何前置基础知识
  8. web python template injection_XCTF Web_python_template_injection
  9. Android Stduio启动模拟器运行项目时做了什么
  10. 第三季-第11课-进程控制理论
  11. Java项目经验相关常见面试题
  12. bbys_tu_2016
  13. AI经典书单:入门人工智能该读哪些书?
  14. Scrapy是什么?Scrapy怎么用?Scrapy进阶使用[链接提取器、自动登录、图片(文件)下载器](基于scrapy2.0+编写) ๑乛◡乛๑ Scrapy框架使用方法
  15. 优化网站如何看待纯文本外链的作用
  16. 微信食堂就餐人数统计小程序开发,微信饭堂报餐人数,怎样统计公司每日就餐人数,就餐人数不固定如何统计,制作报餐微信小程序
  17. oracle spool设置字符集,spool出来的文件格式一个是UTF8一个是ASCII ??
  18. 【SpringBoot】SpringBoot+Zookeeper+Dubbo整合
  19. pageinspect
  20. html2canvas 图片文字模糊

热门文章

  1. 什么是内存对齐以及作用
  2. pip 更新python -m pip install --upgrade pip 报错
  3. 大学毕业必须知道的东西:三方协议、报到证(派遣证)、干部身份
  4. 易班轻应用授权开发与AES解密
  5. vue时钟+vue旋转特效
  6. SpringMVC 406状态码
  7. 实际使用Windows 7中的Readyboost功能
  8. 八:Webpack的加载器
  9. umts是移动还是联通_网络模式中的UMTS是什么意思?
  10. 包含类别变量的中介模型检验方法