ZeroMQ+OpenCV实现视频网络传输

服务器端

从摄像头捕获图像,并发送数据

#include <zmq.hpp>
#include <iostream>
#include <opencv2/highgui.hpp>
#include <opencv2/opencv.hpp>

int main()
{
	zmq::context_t context(1);
	zmq::socket_t socket(context, zmq::socket_type::pub);
	socket.bind("tcp://*:5555");


	cv::VideoCapture cap(0);
	if (cap.isOpened())
	{
		std::cout << "摄像头已打开" << std::endl;
		std::cout << "图像宽度" << cap.get(cv::CAP_PROP_FRAME_WIDTH) << std::endl;
		std::cout << "图像高度" << cap.get(cv::CAP_PROP_FRAME_HEIGHT) << std::endl;
	}
	else
		return -1;

	cv::Mat frame;

	while (cap.read(frame))
	{
		cv::Size dstSize = cv::Size(1280,960);
		cv::Mat dstFrame;
		cv::resize(frame, dstFrame, dstSize);

		std::vector<uint8_t> imageBuffer;
		std::vector<int> compress_params;
		compress_params.push_back(cv::IMWRITE_JPEG_QUALITY);
		compress_params.push_back(40);//压缩为原图像的x%,x in [0,100]
		cv::imencode(".jpg", dstFrame, imageBuffer, compress_params);
		
		//send img
		zmq::message_t msg(imageBuffer.size());
		memcpy(msg.data(), imageBuffer.data(), imageBuffer.size());
		socket.send(msg, zmq::send_flags::dontwait);

		std::cout<<"send image, len:"<<imageBuffer.size() << std::endl;
		cv::imshow("pub", dstFrame);
		cv::waitKey(1000 / cap.get(cv::CAP_PROP_FPS));
	}
	return 0;
}

客户端

接受数据并显示

#include <zmq.hpp>
#include <opencv2/highgui.hpp>
#include <iostream>


int main(int argc, char* argv[])
{
    zmq::context_t context(1);
    zmq::socket_t socket(context, zmq::socket_type::sub);
    socket.connect("tcp://localhost:5555");
    socket.set(zmq::sockopt::subscribe, "");//设置过滤条件,这里为空,表示接收所有信息

    cv::Mat frame;
    while (true) 
    {
        zmq::message_t msg;
        auto ok = socket.recv(msg, zmq::recv_flags::dontwait);
        if (ok) 
        {
            std::vector<uint8_t> buffer;
            buffer.resize(msg.size());
            memcpy(buffer.data(), msg.data(), msg.size());

            std::cout<<"receive image, len:"<<msg.size() << std::endl;
            //decode
            frame = cv::imdecode(buffer, cv::IMREAD_COLOR);
            
            cv::imshow("sub", frame);
            //cv::imwrite("receive.jpg", frame);
            cv::waitKey(1);
        }
    }
    return 0;
}
  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
ZeroMQ是一个高性能、异步消息传输库,它提供了多种通信模式和协议,可以用于构建分布式系统和网络应用程序。而加密传输是指在数据传输过程中对数据进行加密,以保证数据的安全性和机密性。 在ZeroMQ中,可以通过使用加密算法和协议来实现数据的加密传输。一种常见的方式是使用Transport Layer Security (TLS)协议来进行加密传输。TLS是一种常用的安全协议,它可以在通信双方之间建立安全的连接,并对数据进行加密和身份验证。 要在ZeroMQ实现加密传输,可以按照以下步骤进行操作: 1. 生成证书和私钥:首先需要生成用于加密传输的证书和私钥。证书用于验证通信双方的身份,私钥用于对数据进行加密和解密。 2. 配置TLS上下文:在ZeroMQ中,可以使用OpenSSL库来配置TLS上下文。通过设置TLS上下文的参数,可以指定使用的加密算法、证书和私钥等信息。 3. 配置ZeroMQ套接字:在创建ZeroMQ套接字时,可以通过设置套接字的选项来启用TLS加密传输。可以指定使用的TLS上下文和验证模式等参数。 4. 进行加密传输:一旦配置完成,就可以使用ZeroMQ套接字进行加密传输了。数据在传输过程中会被自动加密和解密,确保数据的安全性和机密性。 总结一下,ZeroMQ可以与TLS协议结合使用,通过配置TLS上下文和套接字选项来实现加密传输。这样可以保证数据在传输过程中的安全性和机密性。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值