码蚁0817班级,AI项目,脸谱,双团队架构,赛马机制
zh_What
2024-12-05 f9f7ee1b63e6009e0f67ec62ddffd5b6447cb2e1
考勤识别与管理文档
1个文件已修改
2个文件已添加
122 ■■■■■ 已修改文件
GroupB_马喜龙/Client/周浩/code/存放代码.txt 122 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
GroupB_马喜龙/Client/周浩/document/考勤识别与管理.docx 补丁 | 查看 | 原始文档 | blame | 历史
GroupB_马喜龙/Server/卢飞鹏/document/~$志封装、生成.docx 补丁 | 查看 | 原始文档 | blame | 历史
GroupB_ÂíϲÁú/Client/ÖܺÆ/code/´æ·Å´úÂë.txt
@@ -0,0 +1,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;
}
GroupB_ÂíϲÁú/Client/ÖܺÆ/document/¿¼ÇÚʶ±ðÓë¹ÜÀí.docx
Binary files differ
GroupB_ÂíϲÁú/Server/¬·ÉÅô/document/~$Ö¾·â×°¡¢Éú³É.docx
Binary files differ