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;
}
}
}
@mahikaajain
Copy link

mahikaajain commented Oct 18, 2019

no i didn't modify the code.for other codes the camera is working for example for capturing video through opencv the camera works fine.

@ujjwalgoyal65
Copy link

image
please tell me the solution for this error

@ujjwalgoyal65
Copy link

it runs only for single thread and then exit.

@mandrelbrotset
Copy link

Yes sorry on the server side the camera is'nt opening.when i run the code web camera light gets on for 1 sec without opening of camera and then turns off. And there is nothing recorded. Atlast its also not working on different machines idk why.

For it to work on different machines, instead of using 127.0.0.1(localhost), you have to use the ip address of the machine running the server.

@mandrelbrotset
Copy link

image
please tell me the solution for this error

Hi @ujjwalgoyal65,

Those are just warnings, you can ignore them. C++ just doesn't like the way the variable is being converted.

@mandrelbrotset
Copy link

Screenshot from 2019-10-18 22-27-21
I installed opencv4.1.1 and everything works for me.
At this point I'm not sure what's wrong.

@ujjwalgoyal65
Copy link

can u plz mail me the client and server code .
emial id:- ujjwalgoyal65@gmail.com

@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