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