码蚁0817班级,AI项目,脸谱,双团队架构,赛马机制
zh_What
2024-12-05 f9f7ee1b63e6009e0f67ec62ddffd5b6447cb2e1
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;
}