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