基于socket(TCP)和opencv的实时视频传输
生活随笔
收集整理的這篇文章主要介紹了
基于socket(TCP)和opencv的实时视频传输
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
基于socket的實(shí)時(shí)視頻傳輸大概需要以下基本函數(shù):
**在服務(wù)端:建立socket-bind-listen-accept
在客戶端:建立socket-connect
通俗看來(lái)說(shuō)就是在創(chuàng)建socket后服務(wù)端的作用是連接服務(wù)端的IP,端口然后聆聽(tīng)等待客戶端的連接之后接受服務(wù)端的數(shù)據(jù),而客戶端創(chuàng)建socket后就是連接服務(wù)端,傳送數(shù)據(jù)。話不多說(shuō)先上代碼
SERVER:
#include "stdafx.h" #include <stdio.h> #include <winsock2.h> #include <cv.h> #include <opencv2/core/core.hpp> #include <opencv2/highgui/highgui.hpp> #include <opencv2/imgproc/imgproc.hpp>#pragma comment(lib,"ws2_32.lib")int main(void) {//初始化WSAWORD sockVersion = MAKEWORD(2, 2);//使用的是WINSOCK 2版本WSADATA wsaData;if (WSAStartup(sockVersion, &wsaData) != 0){return 0;}SOCKET slisten = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);if (slisten == INVALID_SOCKET){printf("socket error !");return 0;}sockaddr_in sin;sin.sin_family = AF_INET;sin.sin_port = htons(8888);//連接端口sin.sin_addr.S_un.S_addr = INADDR_ANY;//可接受所有IPif (bind(slisten, (LPSOCKADDR)&sin, sizeof(sin)) == SOCKET_ERROR){printf("bind error !");}if (listen(slisten, 5) == SOCKET_ERROR)// 監(jiān)聽(tīng)5代表著最大等待長(zhǎng)度{printf("listen error !");return 0;}SOCKET sClient;sockaddr_in remoteAddr;int nAddrlen = sizeof(remoteAddr);printf("等待連接...\n");do{sClient = accept(slisten, (SOCKADDR *)&remoteAddr, &nAddrlen);} while (sClient == INVALID_SOCKET);printf("接受到一個(gè)連接:%s \r\n", inet_ntoa(remoteAddr.sin_addr)); // 以上都是創(chuàng)建socket通信的通常步驟也就是我開(kāi)頭所說(shuō)的流程所需要的,如有不懂可以查看這幾個(gè)函數(shù)得具體功能。char recvData[1000000] = "";//接受客戶端發(fā)送數(shù)據(jù)的緩存IplImage *image_src = cvCreateImage(cvSize(640, 480), 8, 1);//接受到的圖片是640*480int i, j;int ret;cvNamedWindow("server", 1);while (true){//接收客戶端的數(shù)據(jù)ret = recv(sClient, recvData, 1000000, 0);if (ret > 0){for (i = 0; i < image_src->height; i++){for (j = 0; j < image_src->width; j++){((char *)(image_src->imageData + i * image_src->widthStep))[j] = recvData[image_src->width * i + j];}}//以上就是傳送一張圖片的過(guò)程ret = 0;}cvShowImage("server", image_src);//顯示圖片cvWaitKey(1);}cvDestroyWindow("server");closesocket(slisten);WSACleanup();return 0; }Client:
#include "stdafx.h" #include <WINSOCK2.H> #include <iostream> #include <stdio.h> #include <cv.h> #include <opencv2/core/core.hpp> #include <opencv2/highgui/highgui.hpp> #include <opencv2/imgproc/imgproc.hpp> using namespace cv;#pragma comment(lib,"ws2_32.lib")int main(int argc, char* argv[]) {WORD sockVersion = MAKEWORD(2, 2);WSADATA data;if (WSAStartup(sockVersion, &data) != 0){return 0;}SOCKET sclient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);if (sclient == INVALID_SOCKET){printf("invalid socket !\n");return 0;}sockaddr_in serAddr;serAddr.sin_family = AF_INET;serAddr.sin_port = htons(8888);serAddr.sin_addr.S_un.S_addr = inet_addr("127.0.0.1"); //這里可以改成服務(wù)端的IP,若是都在一臺(tái)電腦就不用改變if (connect(sclient, (sockaddr *)&serAddr, sizeof(serAddr)) == SOCKET_ERROR){printf("connect error !\n");closesocket(sclient);return 0;}VideoCapture capture(0);//打開(kāi)攝像頭,cvQueryFrame這個(gè)函數(shù)并不能打開(kāi)我的攝像頭,好像是因?yàn)楹瘮?shù)版本太低,我的是VS2017+opencv3.3.0,若是可以使用cvQueryFrame那么就不用進(jìn)行下面的圖片拷貝以及轉(zhuǎn)換if (!capture.isOpened()){printf("攝像頭打開(kāi)失敗,請(qǐng)檢查設(shè)備!\n");}int i, j;char sendData[1000000] = "";// 存放要輸出去的數(shù)據(jù)cvNamedWindow("client", 1);Mat frame; //定義一個(gè)Mat類(lèi)的framewhile (1){capture >> frame;// 將攝像頭拍攝的每一幀圖片都放進(jìn)frameIplImage* img = &IplImage(frame);IplImage *image_src = cvCloneImage(img);//這是一個(gè)深拷貝講Mat類(lèi)變成IplImage類(lèi),若是上面打開(kāi)攝像頭的cvQueryFrame函數(shù)可以用那么就不用轉(zhuǎn)換for (i = 0; i < image_src->height; i++){for (j = 0; j < image_src->width; j++){sendData[image_src->width * i + j] = ((char *)(image_src->imageData + i * image_src->widthStep))[j];}}cvShowImage("client",image_src);cvWaitKey(3);send(sclient, sendData, 1000000, 0);}cvReleaseImage(&image_dsrc);cvDestroyWindow("client");closesocket(sclient);WSACleanup();return 0; }以上就是我可以把自己電腦攝像頭拍攝的視頻實(shí)時(shí)傳輸給服務(wù)端的代碼,親測(cè)有用,也希望能夠幫助大家。本人也是剛開(kāi)始學(xué)習(xí)這個(gè),希望能與大家一起交流
總結(jié)
以上是生活随笔為你收集整理的基于socket(TCP)和opencv的实时视频传输的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 在VMware Workstation中
- 下一篇: 将心比心,换位思考