码蚁0817班级,AI项目,脸谱,双团队架构,赛马机制
编辑 | blame | 历史 | 原始文档
#include "stdafx.h"
#include 
#include 

#if defined(_WIN32)
#include 
#include 
#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 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;
}