Skip to content

Instantly share code, notes, and snippets.

@SteveRuben
Created October 21, 2015 08:30
Show Gist options
  • Save SteveRuben/2a15909e384b582c51b5 to your computer and use it in GitHub Desktop.
Save SteveRuben/2a15909e384b582c51b5 to your computer and use it in GitHub Desktop.
Multiple streaming in c++ using opencv; OpenCV video streaming over TCP/IP
/**
* OpenCV video streaming over TCP/IP
* Client: Receives video from server and display it
* by Steve Tuenkam
*/
#include "opencv2/opencv.hpp"
#include <sys/socket.h>
#include <arpa/inet.h>
#include <unistd.h>
using namespace cv;
int main(int argc, char** argv)
{
//--------------------------------------------------------
//networking stuff: socket , connect
//--------------------------------------------------------
int sokt;
char* serverIP;
int serverPort;
if (argc < 3) {
std::cerr << "Usage: cv_video_cli <serverIP> <serverPort> " << std::endl;
}
serverIP = argv[1];
serverPort = atoi(argv[2]);
struct sockaddr_in serverAddr;
socklen_t addrLen = sizeof(struct sockaddr_in);
if ((sokt = socket(PF_INET, SOCK_STREAM, 0)) < 0) {
std::cerr << "socket() failed" << std::endl;
}
serverAddr.sin_family = PF_INET;
serverAddr.sin_addr.s_addr = inet_addr(serverIP);
serverAddr.sin_port = htons(serverPort);
if (connect(sokt, (sockaddr*)&serverAddr, addrLen) < 0) {
std::cerr << "connect() failed!" << std::endl;
}
//----------------------------------------------------------
//OpenCV Code
//----------------------------------------------------------
Mat img;
img = Mat::zeros(480 , 640, CV_8UC1);
int imgSize = img.total() * img.elemSize();
uchar *iptr = img.data;
int bytes = 0;
int key;
//make img continuos
if ( ! img.isContinuous() ) {
img = img.clone();
}
std::cout << "Image Size:" << imgSize << std::endl;
namedWindow("CV Video Client",1);
while (key != 'q') {
if ((bytes = recv(sokt, iptr, imgSize , MSG_WAITALL)) == -1) {
std::cerr << "recv failed, received bytes = " << bytes << std::endl;
}
cv::imshow("CV Video Client", img);
if (key = cv::waitKey(10) >= 0) break;
}
close(sokt);
return 0;
}
/**
* OpenCV video streaming over TCP/IP
* Server: Captures video from a webcam and send it to a client
* by Isaac Maia
*/
#include "opencv2/opencv.hpp"
#include <iostream>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <sys/ioctl.h>
#include <net/if.h>
#include <unistd.h>
#include <string.h>
using namespace cv;
void *display(void *);
int capDev = 0;
VideoCapture cap(capDev); // open the default camera
int main(int argc, char** argv)
{
//--------------------------------------------------------
//networking stuff: socket, bind, listen
//--------------------------------------------------------
int localSocket,
remoteSocket,
port = 4097;
struct sockaddr_in localAddr,
remoteAddr;
pthread_t thread_id;
int addrLen = sizeof(struct sockaddr_in);
if ( (argc > 1) && (strcmp(argv[1],"-h") == 0) ) {
std::cerr << "usage: ./cv_video_srv [port] [capture device]\n" <<
"port : socket port (4097 default)\n" <<
"capture device : (0 default)\n" << std::endl;
exit(1);
}
if (argc == 2) port = atoi(argv[1]);
localSocket = socket(AF_INET , SOCK_STREAM , 0);
if (localSocket == -1){
perror("socket() call failed!!");
}
localAddr.sin_family = AF_INET;
localAddr.sin_addr.s_addr = INADDR_ANY;
localAddr.sin_port = htons( port );
if( bind(localSocket,(struct sockaddr *)&localAddr , sizeof(localAddr)) < 0) {
perror("Can't bind() socket");
exit(1);
}
//Listening
listen(localSocket , 3);
std::cout << "Waiting for connections...\n"
<< "Server Port:" << port << std::endl;
//accept connection from an incoming client
while(1){
//if (remoteSocket < 0) {
// perror("accept failed!");
// exit(1);
//}
remoteSocket = accept(localSocket, (struct sockaddr *)&remoteAddr, (socklen_t*)&addrLen);
//std::cout << remoteSocket<< "32"<< std::endl;
if (remoteSocket < 0) {
perror("accept failed!");
exit(1);
}
std::cout << "Connection accepted" << std::endl;
pthread_create(&thread_id,NULL,display,&remoteSocket);
//pthread_join(thread_id,NULL);
}
//pthread_join(thread_id,NULL);
//close(remoteSocket);
return 0;
}
void *display(void *ptr){
int socket = *(int *)ptr;
//OpenCV Code
//----------------------------------------------------------
Mat img, imgGray;
img = Mat::zeros(480 , 640, CV_8UC1);
//make it continuous
if (!img.isContinuous()) {
img = img.clone();
}
int imgSize = img.total() * img.elemSize();
int bytes = 0;
int key;
//make img continuos
if ( ! img.isContinuous() ) {
img = img.clone();
imgGray = img.clone();
}
std::cout << "Image Size:" << imgSize << std::endl;
while(1) {
/* get a frame from camera */
cap >> img;
//do video processing here
cvtColor(img, imgGray, CV_BGR2GRAY);
//send processed image
if ((bytes = send(socket, imgGray.data, imgSize, 0)) < 0){
std::cerr << "bytes = " << bytes << std::endl;
break;
}
}
}
@BOUROUINA
Copy link

BOUROUINA commented Jun 2, 2020

Hi everyone
please I have a question regarding video savage at the client level, that it is sent from a server. You can tell me which lines of code to add

@SteveRuben
Copy link
Author

Hi everyone
please I have a question regarding video savage at the client level, that it is sent from a server. You can tell me which lines of code to add

*void send_data(void ptr)

@nonlinearjunkie
Copy link

this code work very well , but when one thread end , the streaming stop for all others threads

Can you share the makefile or CMAkeLists.txt file to run the above scripts?

@Anjaneyakarjigi
Copy link

Hi,
thanks for your code, to change this code to UDP, what should we do?

just replace SOCK_STREAM to SOCK_DGRAM, It works I tested
Thanks

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment