2014-09-15 10 views
5

ancora abbastanza nuovo per OpenCV/C++ in modo prega di portare con me :)C++/OpenCV streaming fotocamera-video/immagini (MJPEG) dalla presa nel browser (Windows 8.1)

Attualmente sto cercando di trovare una buona (e possibilmente facile) per far scorrere i fotogrammi della mia videocamera in tempo reale (o quasi in tempo reale) dalla mia applicazione OpenCV in modo che possa aprire il mio browser, digitare l'IP e vedere l'immagine.

Finora ho eseguito il server utilizzando winsock2 (se qualcuno ha una buona alternativa multipiattaforma e può dirmi cosa è diverso, sarei abbastanza contento) e posso collegarmi ad esso tramite l'inserimento dell'IP nel mio browser.

incassato-/Server-Code:

//socket 
long rc; 
SOCKET acceptSocket; 
SOCKADDR_IN addr; 
WSADATA wsa; 
// initialize winsock 
rc=WSAStartup(MAKEWORD(2,0),&wsa); 

if(rc!=0) 
{ 
    printf("Error: startWinsock, Errorcode: %d\n",rc); 
    return 1; 
} 
else 
{ 
    printf("Winsock initialized!\n"); 
} 

// create Socket 
acceptSocket=socket(AF_INET,SOCK_STREAM,0); 

if(acceptSocket==INVALID_SOCKET) 
{ 
    printf("Error: Socket-Creation failed, Errorcode: %d\n",WSAGetLastError()); 
    return 1; 
} 
else 
{ 
    printf("Socket succesfully created!\n"); 
} 

memset(&addr,0,sizeof(SOCKADDR_IN)); 
addr.sin_family=AF_INET; 
addr.sin_port=htons(8080); 
addr.sin_addr.s_addr=ADDR_ANY; 
rc=bind(acceptSocket,(SOCKADDR*)&addr,sizeof(SOCKADDR_IN)); 

if(rc==SOCKET_ERROR) 
{ 
    printf("Error: bind, Errorcode: %d\n",WSAGetLastError()); 
    return 1; 
} 
else 
{ 
    printf("Socket bound to port 8080\n"); 
} 
rc=listen(acceptSocket,10); 

if(rc==SOCKET_ERROR) 
{ 
    printf("Error: listen, Errorcode: %d\n",WSAGetLastError()); 
    return 1; 
} 
else 
{ 
    printf("acceptSocket is now in listen mode...\n"); 
} 

SOCKET connectedSocket=accept(acceptSocket,NULL,NULL); 

if(connectedSocket==INVALID_SOCKET) 
{ 
    printf("Error, Errorcode: %d\n",WSAGetLastError()); 
    return 1; 
} 
else 
{ 
    printf("New connection accepted!\n"); 
} 

Per quanto riguarda la parte di invio Ho provato ad utilizzare la macchina fotografica-frame direttamente e salvarlo come jpg + ricaricare la jpg finora:

 char filename[128]; 
     frame_count++; 
     if (frame_count%50 == 0) 
     { 
     sprintf(filename, "frame_%06d.jpg", index); 
     imwrite(filename, camera1_undist); 
     Mat image = imread(filename, CV_LOAD_IMAGE_COLOR); 
     send(connectedSocket, (const char *) image.data, image.total()*image.elemSize(), 0); 
     frame_count = 0; 
     index++; 
     } 

1) L'immagine non viene visualizzata come immagine ma come numeri/simboli (HEX/ASCII? marchi e cose). Come devo convertire/cambiare ciò che invio per mostrare effettivamente l'immagine?

2) Ho letto su MJPEG e ho trovato un modo per salvare l'output ma non ho idea di come utilizzare quel file di output oltre ogni atm. Come si usa senza MJPEG-Streamer (in quanto è solo Linux)

Grazie

risposta

6

mi sono fatto io stesso ora, stava facendo qualche errore qua e là.

La parte più importante per ottenere l'immagine di presentarsi è stato

a) per ottenere un colpo di testa html che viene inviato prima di inviare l'immagine reale in modo mio browser sa che cosa sta andando essere inviato

b) usa l'imencode per salvare l'immagine in un buffer e invia quel buffer anziché l'immagine stessa

Inoltre non salvare il frame da nessuna parte, ma lo prendo direttamente dall'ingresso della mia videocamera, in modo che accada anche .

per farlo fare con mjpegs ho dovuto aggiungere un altro intestazione prima, che racconta il "cliente" che ci sta andando essere più immagini di essere inviati, separati da un certo confine:

sprintf(head, "HTTP/1.1 200 OK\r\nContent-Type: multipart/x-mixed-replace;boundary=informs\r\n\r\n"); 
send(socket,head,strlen(head), 0); 

Questo ha aiutato piccolo, esp. con l'intestazione-parte:. http://nakkaya.com/2011/03/23/streaming-opencv-video-over-the-network-using-mjpeg/ (anche se mi ha irritato a causa prima' Non ho mai usato né visto prima clojure

Anche questo è stato davvero utile: http://answers.opencv.org/question/6976/display-iplimage-in-webbrowsers/