C++ Opencv结合socket进行视频传输
时间: 2023-08-04 19:22:14 浏览: 212
C++OpenCv利用Socket通讯类传输图片或者视频
5星 · 资源好评率100%
好的,下面是C++ Opencv结合socket进行视频传输的示例代码,仅供参考:
发送端代码:
```c++
#include <iostream>
#include <opencv2/opencv.hpp>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
using namespace std;
using namespace cv;
int main()
{
// 建立socket连接
int sockfd = socket(AF_INET, SOCK_STREAM, 0);
sockaddr_in servaddr;
memset(&servaddr, 0, sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_addr.s_addr = inet_addr("127.0.0.1");
servaddr.sin_port = htons(8000);
connect(sockfd, (sockaddr*)&servaddr, sizeof(servaddr));
// 读取本地视频文件
VideoCapture cap("test.mp4");
if (!cap.isOpened()) {
cout << "Failed to open video file!" << endl;
return -1;
}
while (true) {
// 读取视频帧数据
Mat frame;
cap >> frame;
if (frame.empty()) {
break;
}
// 将视频帧数据转换为字节流数据
vector<uchar> buf;
imencode(".jpg", frame, buf);
int length = buf.size();
// 发送字节流数据
send(sockfd, (char*)&length, sizeof(length), 0);
send(sockfd, (char*)&buf[0], length, 0);
}
// 关闭连接
cap.release();
close(sockfd);
return 0;
}
```
接收端代码:
```c++
#include <iostream>
#include <opencv2/opencv.hpp>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
using namespace std;
using namespace cv;
int main()
{
// 建立socket连接
int listenfd = socket(AF_INET, SOCK_STREAM, 0);
sockaddr_in servaddr;
memset(&servaddr, 0, sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
servaddr.sin_port = htons(8000);
bind(listenfd, (sockaddr*)&servaddr, sizeof(servaddr));
listen(listenfd, 1);
// 等待客户端连接
cout << "waiting for connection..." << endl;
int connfd = accept(listenfd, (sockaddr*)NULL, NULL);
cout << "connected!" << endl;
// 创建Opencv窗口
namedWindow("video", WINDOW_NORMAL);
while (true) {
// 接收字节流数据
int length;
if (recv(connfd, (char*)&length, sizeof(length), 0) <= 0) {
break;
}
vector<uchar> buf(length);
if (recv(connfd, (char*)&buf[0], length, 0) <= 0) {
break;
}
// 将接收到的字节流数据转换为视频帧数据
Mat frame = imdecode(buf, IMREAD_COLOR);
// 显示视频帧数据
imshow("video", frame);
if (waitKey(1) == 'q') {
break;
}
}
// 关闭连接
destroyAllWindows();
close(connfd);
close(listenfd);
return 0;
}
```
注意:以上代码仅为示例代码,需要根据自己的实际需求进行修改和优化。同时,需要注意视频帧数据的大小和帧率对于网络传输的影响。
阅读全文