【发布时间】:2014-09-18 20:16:15
【问题描述】:
对 openCV/C++ 还是很陌生,所以请多多包涵 :)
我目前正在尝试找到一种好的(并且可能很简单)的方法来从我的 OpenCV 应用程序实时(或几乎实时)流式传输我的相机帧,以便我可以打开我的浏览器,输入 IP 并查看图像。
到目前为止,我使用 winsock2 完成了服务器(如果有人有一个好的跨平台替代方案并且可以告诉我有什么不同,我会很高兴)并且可以通过在我的浏览器中输入 IP 来连接到它。
套接字-/服务器-代码:
//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");
}
至于发送部分,我尝试直接使用相机框架并将其保存为 jpg + 到目前为止重新加载 jpg:
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) 图像不显示为图像,而是显示为数字/符号(HEX/ASCII?主要是黑色问号和其他东西)。 如何转换/更改我发送的内容以实际显示图像?
2) 我阅读了 MJPEG 并找到了一种保存输出的方法,但我不知道如何在 atm 中进一步使用该输出文件。我如何在没有 MJPEG-Streamer 的情况下使用它(因为它仅适用于 Linux)
谢谢
【问题讨论】:
标签: c++ sockets opencv streaming mjpeg