#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;
|
}
|