码蚁0817班级,AI项目,脸谱,双团队架构,赛马机制
mf
2024-12-10 4b847d2ad24fad3fdffe7f6c34a90cc6e081766c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
#include "stdafx.h"
#include <iostream>
#include <opencv2/opencv.hpp>
 
#if defined(_WIN32)
#include <winsock2.h>
#include <ws2tcpip.h>
#pragma comment(lib, "ws2_64.lib")  
#endif
 
// 捕获摄像头图像
cv::Mat captureImage() {
    cv::VideoCapture cap(0);  // 打开默认摄像头,可按需更改参数选择其他摄像头
    if (!cap.isOpened()) {
        std::cerr << "无法打开摄像头" << std::endl;
        return cv::Mat();
    }
    cv::Mat frame;
    cap >> frame;
    cap.release();
    return frame;
}
 
// 连接服务端函数
bool connectToServer(SOCKET& clientSocket) {
    // 配置服务端地址信息
    sockaddr_in serverAddr;
    serverAddr.sin_family = AF_INET;
    serverAddr.sin_port = htons(8888);  // 端口号8888,可按需修改
 
                                        // 使用inet_pton替换inet_addr
    char ipAddress[] = "127.0.0.1";  // 本地回环地址,也可替换为真实IP,这里定义为字符数组
    int inetResult = inet_pton(AF_INET, ipAddress, &serverAddr.sin_addr);
    if (inetResult <= 0) {
        std::cerr << "IP地址转换失败" << std::endl;
        return false;
    }
 
    // 创建套接字
    clientSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    if (clientSocket == INVALID_SOCKET) {
        std::cerr << "创建套接字失败" << std::endl;
#if defined(_WIN32)
        WSACleanup();
#endif
        return false;
    }
 
    // 连接服务端
    if (connect(clientSocket, (sockaddr*)&serverAddr, sizeof(serverAddr)) == SOCKET_ERROR) {
        std::cerr << "连接服务端失败" << std::endl;
#if defined(_WIN32)
        closesocket(clientSocket);
        WSACleanup();
#endif
        return false;
    }
    return true;
}
 
// 将图片数据发送到服务端函数
void sendImage(SOCKET socket, const cv::Mat& image) {
    std::vector<uchar> buffer;
    cv::imencode(".jpg", image, buffer);  // 将图像编码为 JPEG 格式,方便传输
                                          // 发送数据长度信息(假设服务端按这个约定来接收)
    int bufferSize = buffer.size();
    send(socket, (const char*)&bufferSize, sizeof(bufferSize), 0);
    // 发送图像数据本身
    send(socket, (const char*)buffer.data(), buffer.size(), 0);
}
 
// 从服务端接收消息函数
std::string receiveMessage(SOCKET socket) {
    const int bufferSize = 1024;
    char buffer[bufferSize];
    int bytesReceived = recv(socket, buffer, bufferSize - 1, 0);
    if (bytesReceived > 0) {
        buffer[bytesReceived] = '\0';  // 添加字符串结束符
        return std::string(buffer);
    }
    return "";
}
 
int main() {
#if defined(_WIN32)
    // 初始化Winsock库
    WSADATA wsaData;
    int result = WSAStartup(MAKEWORD(2, 2), &wsaData);
    if (result != 0) {
        std::cerr << "WSAStartup 失败: " << result << std::endl;
        return -1;
    }
#endif
 
    SOCKET clientSocket;
    if (!connectToServer(clientSocket)) {
        return -1;
    }
 
    cv::Mat image = captureImage();
    if (image.empty()) {
        // 关闭套接字并清理(Windows下)
#if defined(_WIN32)
        closesocket(clientSocket);
        WSACleanup();
#endif
        return -1;
    }
 
    sendImage(clientSocket, image);
    std::string receiveResult = receiveMessage(clientSocket);
    std::cout << "打卡结果: " << receiveResult << std::endl;
 
    // 关闭套接字并清理(Windows下)
#if defined(_WIN32)
    closesocket(clientSocket);
    WSACleanup();
#else
    close(clientSocket);
#endif
    return 0;
}