Server:
#include <cv.h> #include <cxcore.h> #include <highgui.h> #include<iostream> #include<WinSock2.h> #include<windows.h> #pragma warning(disable:4996) #pragma comment(lib,"ws2_32.lib") using namespace std; SOCKET listensocket, serversocket; sockaddr_in socketaddr; HANDLE event; HANDLE hHandle[3]; HANDLE getVideoHandle; DWORD WINAPI getVideoThread(LPVOID lpa); BOOL SetConsoleColor(WORD wAttributes) { HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE); if (hConsole == INVALID_HANDLE_VALUE) return FALSE; return SetConsoleTextAttribute(hConsole, wAttributes); } DWORD WINAPI AcceptThread(LPVOID lparam) { cout << "等待客户端连接... " << endl; while (true) { int len = sizeof(socketaddr); if ((listensocket = accept(serversocket, (struct sockaddr*)&socketaddr, &len)) != INVALID_SOCKET) { unsigned long cmd = 1; int nState; nState = ioctlsocket(listensocket, FIONBIO, &cmd); if (nState == SOCKET_ERROR) cout << "设置非阻塞模式失败!!" << endl; cout << "客户端已连接! " << endl; SetConsoleColor(FOREGROUND_RED | FOREGROUND_INTENSITY); SetEvent(event); return 0; } } } DWORD WINAPI RecvThread(LPVOID lparam) { char buf[1000]; int len = 0; memset(buf, 0, sizeof(char) * 1000); //WaitForSingleObject(event, INFINITE); while (TRUE) { len = recv(listensocket, buf, 1000, 0); if (len != -1) { SetConsoleColor(FOREGROUND_GREEN | FOREGROUND_INTENSITY); cout << "收到:" << buf << endl; SetConsoleColor(FOREGROUND_RED | FOREGROUND_INTENSITY); memset(buf, 0, sizeof(char) * 1000); len = -1; } } delete[]buf; return 0; } DWORD WINAPI SendThread(LPVOID lparam) { char buf[1000]; memset(buf, 0, 1000 * sizeof(char)); int len; WaitForSingleObject(event, INFINITE); while (true) { SetConsoleColor(FOREGROUND_RED | FOREGROUND_INTENSITY); cin >> buf; if (strcmp(buf, "openvideo") == 0) { getVideoHandle = CreateThread(NULL, 0,&getVideoThread, NULL, 0, NULL); len = send(listensocket, buf, 1000, 0); Sleep(300); break; } len = send(listensocket, buf, 1000, 0); memset(buf, 0, 1000 * sizeof(char)); } //delete[]buf; return 0; } DWORD WINAPI getVideoThread(LPVOID lpa) { CvCapture* capture = cvCreateCameraCapture(0);//初始化从摄像头中获取视频 cvNamedWindow("video");//创建一个窗口对象 //IplImage *tempImg = cvQueryFrame(capture1);//创建一个临时img IplImage *image_src = NULL; IplImage *image_dst = cvCreateImage(cvSize(640, 480), IPL_DEPTH_8U, 1); int i, j; char sendData[1000000] = ""; while (1) { image_src = cvQueryFrame(capture); cvCvtColor(image_src, image_dst, CV_RGB2GRAY); // cvCopy(image_src, image_dst); for (i = 0; i < image_dst->height; i++) { for (j = 0; j < image_dst->width; j++) { sendData[image_dst->width * i + j] = ((char *)(image_dst->imageData + i * image_dst->widthStep))[j]; } } send(listensocket, sendData, 1000000, 0); char c = cvWaitKey(33); if (c == 27) break; memset(sendData, 0, 1000000); } cvReleaseCapture(&capture); cvDestroyWindow("video"); hHandle[2] = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)&SendThread, NULL, 0, NULL); return 0; } int main(void) { char ip[20]; ZeroMemory(ip, 0, 20); cout << "输入ip" << endl; cin >> ip; system("cls"); WSADATA wsa; WSAStartup(MAKEWORD(2, 2), &wsa); memset((char*)&socketaddr, 0, sizeof(socketaddr)); socketaddr.sin_family = AF_INET; socketaddr.sin_addr.S_un.S_addr = inet_addr(ip);//sin_addr存储IP地址,使用in_addr这个数据结构 socketaddr.sin_port = htons(6000);//端口 if ((serversocket = socket(AF_INET, SOCK_STREAM, 0)) == INVALID_SOCKET) { cout << "创建套接字失败!" << endl; cerr << GetLastError() << endl; system("pause"); return 0; } if (bind(serversocket, (sockaddr*)&socketaddr, sizeof(socketaddr)) == SOCKET_ERROR) { cout << "绑定失败!!" << endl; cerr << GetLastError() << endl; system("pause"); return 0; } listen(serversocket, 10); hHandle[0] = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)&AcceptThread, NULL, 0, NULL); hHandle[1] = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)&RecvThread, NULL, 0, NULL); hHandle[2] = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)&SendThread, NULL, 0, NULL); event = CreateEvent(NULL, FALSE, FALSE, NULL); WaitForMultipleObjects(3, hHandle, TRUE, INFINITE); for (int I = 0; I< 3; I++) CloseHandle(hHandle[I]); CloseHandle(getVideoHandle); system("pause"); return 0; }
#include <cv.h> #include <cxcore.h> #include <highgui.h> #include<iostream> #include<WinSock2.h> #include<windows.h> #pragma warning(disable:4996) #pragma comment(lib,"ws2_32.lib") using namespace std; SOCKET sock; HANDLE hHandle[2]; HANDLE showVideo; DWORD WINAPI RecvThread(LPARAM lparam); BOOL SetConsoleColor(WORD wAttributes) { HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE); if (hConsole == INVALID_HANDLE_VALUE) return FALSE; return SetConsoleTextAttribute(hConsole, wAttributes); } DWORD WINAPI ShowVideoThread(LPVOID lpa) { char revData[1000000] = ""; IplImage *image = cvCreateImage(cvSize(640, 480), IPL_DEPTH_8U, 1); int i, j; cvNamedWindow("client"); while (true) { //接收数据 recv(sock, revData, 1000000, 0); for (i = 0; i < image->height; i++) { for (j = 0; j < image->width; j++) { ((char *)(image->imageData + i * image->widthStep))[j] = revData[image->width * i + j]; } } cvShowImage("client", image); char c = cvWaitKey(33); if (c == 27) break; //memset(revData, 0, 1000000); } cvDestroyWindow("client"); //closesocket(slisten); hHandle[1] = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)RecvThread, NULL, 0, NULL); return 0; } DWORD WINAPI RecvThread(LPARAM lparam) { char buf[1000]=""; int len = 0; memset(buf, 0, sizeof(char) * 1000); //WaitForSingleObject(event, INFINITE); while (TRUE) { len = recv(sock, buf, 1000, 0); if (len != -1) { SetConsoleColor(FOREGROUND_GREEN | FOREGROUND_INTENSITY); if (strcmp(buf, "openvideo") == 0) { showVideo = CreateThread(NULL, 0, ShowVideoThread, NULL, 0, NULL); return 0; } cout << "收到:" << buf << endl; SetConsoleColor(FOREGROUND_RED | FOREGROUND_INTENSITY); memset(buf, 0, sizeof(char) * 1000); len = -1; } } //delete[]buf; return 0; } DWORD WINAPI SendThread(LPARAM lpa) { char buf[1000]; memset(buf, 0, 1000 * sizeof(char)); int len; while (true) { SetConsoleColor(FOREGROUND_RED | FOREGROUND_INTENSITY); cin >> buf; len = send(sock, buf, 1000, 0); memset(buf, 0, 1000 * sizeof(char)); } delete[]buf; return 0; } int main(void) { char ip[20]; int port; memset(ip, 0, sizeof(char) * 20); cout << "输入IP地址: " << endl; cin >> ip; // cout << "输入端口号: " << endl; // cin >> port; WSADATA wsa; WSAStartup(MAKEWORD(2, 2), &wsa); sockaddr_in sockaddr; sockaddr.sin_addr.S_un.S_addr = inet_addr(ip); sockaddr.sin_family = AF_INET; sockaddr.sin_port = htons(6000); sock = socket(AF_INET, SOCK_STREAM, 0);//流式套接字 if (connect(sock, (struct sockaddr*)&sockaddr, sizeof(sockaddr)) != 0) { cout << "连接失败!" << endl; cerr << GetLastError() << endl; system("pause"); return -1; } else { cout << "连接服务器成功!!" << endl; hHandle[0] = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)SendThread, NULL, 0, NULL); hHandle[1] = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)RecvThread, NULL, 0, NULL); } WaitForMultipleObjects(2, hHandle, TRUE, INFINITE); system("pause"); return 0; }核心:
server端的IplImage*转char*
for (i = 0; i < image_dst->height; i++)
{
for (j = 0; j < image_dst->width; j++)
{
sendData[image_dst->width * i + j] = ((char *)(image_dst->imageData + i * image_dst->widthStep))[j];
}
}
Client:char*转IplImage*
for (i = 0; i < image->height; i++)
{
for (j = 0; j < image->width; j++)
{
((char *)(image->imageData + i * image->widthStep))[j] = revData[image->width * i + j];
}
}