使用SOCKET TCP OPENCV 发送视频 mat格式及jpg格式

这篇具有很好参考价值的文章主要介绍了使用SOCKET TCP OPENCV 发送视频 mat格式及jpg格式。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

SERVER SEND jpg

//常头文件
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>

//socket相关头文件
#include <sys/socket.h>
#include <arpa/inet.h>
#include <csignal>
#include "Mat2Img.h"			//自编头文件,注意带上

//opencv相关头文件
#include <opencv2/opencv.hpp>


const int PORT = 5678;                //端口号,客户端应与之保持一致

struct sockaddr_in server_addr, client_addr; //定义服务端和客户端的地址结构体

const int Width = 640;  //图片的宽
const int Heigth = 480; //图片的高

int connectfd;      //用于传输的socketID
int sockfd;         //初始化socketID

int SendImage(const cv::Mat &mat, int sockfd); //发送图像

void InitAddr( );				//初始化函数

int main(int argc, char **argv)
{
   

    cv::VideoCapture capture(0);	//初始化摄像头
    cv::Mat cap;			//初始化摄像头mat数组
    cv::Mat image;			//初始化发送mat数组
    int ret=1;
    InitAddr(); //初始化TCP连接,并将地址结构体绑定到套接字上

    while (true)
    {
   
        capture >> cap;
        cv::resize(cap,image,cv::Size(Width,Heigth));	
        cv::imshow("local image", image);		//本地显示,可注释掉
        cv::waitKey(10);				//本地显示,可注释掉
        ret = SendImage(image,connectfd);		//发送图像
        if (ret == -1)					//如发送失败,关闭socket重新初始化
        {
   
		close(connectfd);
		InitAddr();
        }
    }
    return 0;
}

void InitAddr(void)
{
   
    char client_IP[1024];
    signal(SIGPIPE,SIG_IGN);
    //创建套接字
    sockfd = socket(AF_INET, SOCK_STREAM, 0); //TCP传输
    if (sockfd == -1)
    {
   
        perror("socket error");
        exit(EXIT_FAILURE);
    }

    bzero(&server_addr, sizeof(server_addr));
    server_addr.sin_family = AF_INET;
    server_addr.sin_port = htons(PORT);
    server_addr.sin_addr.s_addr = htonl(INADDR_ANY);

    //设置端口复用
    int opt = 1;
    setsockopt(sockfd, SOL_SOCKET, SO_REUSEPORT, &opt, sizeof(opt));

    //bind
    int ret = bind(sockfd, (struct sockaddr *)&server_addr, sizeof(server_addr));
    if (ret == -1)
    {
   
        perror("bind errno");
        exit(1);
    }

    //listen
    ret = listen(sockfd, 10);
    if (ret == -1)
    {
   
        perror("listen errno");
        exit(1);
    }

    //accept
    //阻塞等待客户端的连接请求
    bzero(&client_addr, sizeof(client_addr));
    socklen_t client_len = sizeof(client_addr);
    std::cout<<"wait"<<std::endl;
    connectfd = accept(sockfd, (struct sockaddr *)&client_addr, &client_len);
    if (connectfd == -1)
    {
   
        perror("accept errno");
        exit(1);
    }
    //打印客户端的IP地址和端口号
    printf("client ip:%s port:%d\n",
           inet_ntop(AF_INET, &client_addr.sin_addr.s_addr, client_IP, 1024),
           ntohs(client_addr.sin_port));

    //此时就可以读取connectfd中的数据
}


int SendImage(const cv::Mat &mat, int sockfd)
{
   
    // Mat 转化为jpg
	std::vector<unsigned char> buff_jpg;
	int ret = Mat2Img::MatToByteArray(mat, buff_jpg);
    // jpg 转化为Base64
	std::string str = ImageBase64::encode(buff_jpg.data(), buff_jpg.size());

    // 发送base64 长度  
    unsigned long count=0;
    count = str.size();
    int req = send (sockfd, &count, 4, MSG_NOSIGNAL);
    if(req == -1)
    {
   
        return -1;
    }
        
    // 发送base64 数据
    
    req = send (sockfd, str.c_str(), str.size(), MSG_NOSIGNAL);
    
    if(req == -1)
    {
   
        return -1;
    }
    return 1;
    
  
}

client receive jpg

//常用头文件
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>

//socket相关头文件
#include <sys/socket.h>
#include <arpa/inet.h>
#include "Mat2Img.h"			//自编jpg发送头文件,注意带上

//opencv相关头文件
#include <opencv2/opencv.hpp>

const int PORT = 5678;          	//端口号,应与server保持一致
const char *IP = "127.0.0.1"; 	//服务器IP地址,服务器在本机使用127.0.0.1
struct sockaddr_in server_addr;        //定义服务端的地址结构体

const int Width = 640;  //图片的宽 不需要
const int Heigth = 480; //图片的高 不需要


cv::Mat GetImage(

文章来源地址https://www.toymoban.com/news/detail-428810.html

到了这里,关于使用SOCKET TCP OPENCV 发送视频 mat格式及jpg格式的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 视频监控/视频汇聚/安防视频监控平台EasyCVR如何将默认快照的raw格式改为jpg/base64格式?

    视频监控/视频汇聚/安防视频监控平台EasyCVR可拓展性强、视频能力灵活、部署轻快,可支持的主流标准协议有国标GB28181、RTSP/Onvif、RTMP等,以及支持厂家私有协议与SDK接入,包括海康Ehome、海大宇等设备的SDK等。视频云存储EasyCVR平台能在复杂的网络环境中,将分散的各类视频

    2024年02月09日
    浏览(36)
  • 在IOS上YUV NV21格式的CVPixelBufferRef转opencv的RGB格式cv::Mat的方法

    因为业务需要,要做这样一个转换。目前写了两种转换方法。 在iphonex真机上运行,一种方法需要24ms一帧,CPU占用率85%,另一种需要17ms一帧,CPU占用率140%。下面就来详细说说。 转换思路是CVPixelBufferRef-UIImage-cv::Mat的路线。 直接上方法: 先是CVPixelBufferRef-UIImage的方法 然后是

    2024年02月12日
    浏览(29)
  • 如何在Java实现TCP方式发送和接收Socket消息(多线程模式)

    在Java编程中,使用TCP协议进行Socket通信是非常常见的场景。本文将详细介绍如何在Java中实现TCP方式发送和接收Socket消息,并且利用多线程模式来提高通信效率。 首先,我们需要创建一个Server端来处理接收到的Socket连接请求。以下是实现的步骤: 创建一个ServerSocket对象,并指

    2024年02月12日
    浏览(27)
  • c++ 之 socket udp与tcp client server实现

    socket起源于Unix,而Unix/Linux基本哲学之一就是“一切皆文件”,都可以用打开open – 读写write/read – 关闭close模式来操作。Socket就是该模式的一个实现,socket即是一种特殊的文件,一些socket函数就是对其进行的操作(读/写IO、打开、关闭). 说白了Socket是应用层与TCP/IP协议族通

    2023年04月15日
    浏览(29)
  • C++ 使用 GDI+ 实现格式为bmp的图像内存转为jpg格式,并且可以实现旋转保存

    将获取的bmp内存数据,经过转换成jpg格式,根据自己的需求可以对图像先做旋转,再进行保存,主要用到的是GDI+工具。 函数的说明 /// /获取的图像内存数据 /// /图像的像素位数 /// /图像的宽度 /// /图像的高度 /// /图像保存的路径 /// /图像保存的路径加图像名称 ///

    2024年02月16日
    浏览(29)
  • creating server tcp listening socket 127.0.0.1:6379: bind No error

    window下启动redis服务报错: creating server tcp listening socket 127.0.0.1:6379: bind No error 解决方案如下按顺序输入如下命令即可连接成功 redis-cli.exe shutdown exit 运行:redis-server.exe redis.windows.conf shutdown出现以下错误,请exit退出 执行:D:devRedis-3.2.100redis-cli.exe -h 127.0.0.1 -p 6379 -a 123456,其

    2024年02月04日
    浏览(38)
  • Redis启动时提示Creating Server TCP listening socket *:6379: bind: No error

    启动redis-server时需要走配置文件,所以编写了bat脚本启动。 这样就不用每次都输命令了。 但是某次在双击Bat脚本之后,命令框一闪而过。 此时在redis-server.exe所在的目录下打开cmd,输入redis-server.exe redis.windows.conf 会提示: Creating Server TCP listening socket *:6379: bind: No error 注: 博

    2023年04月14日
    浏览(35)
  • Warning: Could not create server TCP listening socket Cannot assign request

    一、问题:docker部署redis时发现docker ps命令查看redis端口号为空  二、原因:在网上查找基本都是6379端口被占用 三、解决方法 1、先docker stop停掉redis容器 2、通过修改redis挂载在linux上的redis.conf文件,将bind 127.0.0.1ip地址放开,之前注释掉了。 bind 127.0.0.1 这个是绑定了我们的主

    2024年02月03日
    浏览(48)
  • 04- OpenCV:Mat对象简介和使用

    目录 1、Mat对象与IplImage对象 2、Mat对象使用 3、Mat定义数组 4、相关的代码演示 1、Mat对象与IplImage对象 先看看Mat对象:图片在计算机眼里都是一个二维数组; 在OpenCV中, Mat 是一个非常重要的类,用于表示图像或矩阵数据。 (1)Mat对象OpenCV2.0之后引进的图像数据结构、 自动

    2024年01月20日
    浏览(34)
  • 启动redis出现Creating Server TCP listening socket 127.0.0.1:6379: bind: No error异常

    1.进入redis安装目录,地址栏输入 cmd 2.输入命令 redis启动失败 解决,输入命令 显示以下图标即成功

    2024年02月02日
    浏览(36)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包