2014-09-15 8 views
5

Jeszcze całkiem nowy OpenCV/C++, więc proszę nosić ze mną :)C++/OpenCV Streaming Camera-Video/Images (MJPEG) z gniazda do wyszukiwarki (Windows 8.1)

Jestem obecnie próbuje znaleźć dobry (i możliwie łatwo) sposób na przesyłanie klatek z kamer w czasie rzeczywistym (lub prawie w czasie rzeczywistym) z mojej aplikacji OpenCV, dzięki czemu mogę otworzyć przeglądarkę, wpisać adres IP i zobaczyć obraz.

Do tej pory dostałem serwer za pomocą winsock2 (jeśli ktoś ma dobrą, wieloplatformową alternatywę i może mi powiedzieć, co jest inne, byłbym bardzo zadowolony) i może połączyć się z nim poprzez wprowadzenie adresu IP w mojej przeglądarce.

socket-/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"); 
} 

chodzi o wysyłanie części I próbuje za pomocą kamery bezpośrednio ramkę i zapisanie go jako jpg + przeładowywania jpg tej pory:

 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++; 
     } 

Pytania:

1) Obraz nie jest wyświetlany jako obraz, ale jako liczby/symbole (HEX/ASCII? Głównie czarne pytania znaczniki i inne). Jak muszę przekonwertować/zmienić to, co wysyłam, aby wyświetlić obraz?

2) Czytałem o MJPEG i znalazłem sposób na zapisanie wyniku, ale nie mam pojęcia, jak użyć tego pliku wyjściowego w jeszcze innym banku centralnym. Jak używać go bez MJPEG-Streamer (jak to jest tylko Linux)

Dzięki

Odpowiedz

6

mam to zrobić sobie teraz, robił kilka błędów tu i tam.

Najważniejszą częścią uzyskać obraz, aby pokazać się było

a) aby uzyskać nagłówek HTML, który jest wysyłany przed wysłaniem rzeczywisty obraz tak moja przeglądarka wie, co zamierzam zostać wysłany

b) użyj kodu imencode, aby zapisać obraz w buforze i wyślij ten bufor zamiast samego obrazu.

Również nie zapisuję ramki w dowolnym miejscu, ale po prostu zabieram ją z kamery, żeby ją skrócić. .

Aby zrobić to z mjpegs po prostu musiałem dodać kolejny nagłówek wcześniej, że mówi się „klient”, że nie będzie wielu obrazów są wysyłane, oddzielone pewnej granicy:

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); 

ten pomógł mało, szczególnie. z nagłówka-części. http://nakkaya.com/2011/03/23/streaming-opencv-video-over-the-network-using-mjpeg/ (choć zrobiło mi podrażniona w pierwszej Bo nigdy nie używane, ani widoczne clojure przed

Także to było bardzo pomocne: http://answers.opencv.org/question/6976/display-iplimage-in-webbrowsers/

Powiązane problemy