C++/OpenCV流媒体摄像机视频/图像(MJPEG)从套接字进入浏览器(Windows 8.1)
C++/OpenCV Streaming Camera-Video/Images (MJPEG) from Socket into Browser (Windows 8.1)
对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: %dn",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: %dn",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: %dn",WSAGetLastError());
return 1;
}
else
{
printf("Socket bound to port 8080n");
}
rc=listen(acceptSocket,10);
if(rc==SOCKET_ERROR)
{
printf("Error: listen, Errorcode: %dn",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: %dn",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的文章,找到了一种保存输出的方法,但我不知道如何进一步使用该输出文件。如何在没有MJPEG Streamer的情况下使用它(因为它只是Linux)
感谢
我现在自己完成了,在这里和那里犯了一些错误。
使图像显示出来的最重要的部分是
a)获取在发送实际图像之前发送的html标头,以便我的浏览器知道将发送什么
b)使用imencode将图像保存在缓冲区中,并发送该缓冲区而不是图像本身
我也不把帧保存在任何地方,而是直接从相机输入中取出,这样也会缩短它。
为了完成mjpegs,我之前只需要添加另一个标题,这告诉"客户端"将发送多个图像,并用某个边界分隔:
sprintf(head, "HTTP/1.1 200 OKrnContent-Type: multipart/x-mixed-replace;boundary=informsrnrn");
send(socket,head,strlen(head), 0);
这有点帮助,尤其是在标题部分:http://nakkaya.com/2011/03/23/streaming-opencv-video-over-the-network-using-mjpeg/(尽管一开始我很生气,因为我以前从未使用过clojure,也从未见过clojure
这也很有帮助:http://answers.opencv.org/question/6976/display-iplimage-in-webbrowsers/
- 如何在CPP中创建应该在Windows和Linux上运行的套接字?
- Raspbian-Windows openCV videostream之间的套接字
- Windows 2012 R2 closesocket()挂在侦听套接字上
- 用于线程间通信的 Windows 套接字
- Windows 套接字和身份验证构建在包含 Poco-Library 时失败
- 使用 UDP 协议从 Windows 套接字发送到 Qt 套接字的网络数据包上的结构编码和解码
- Windows 套接字接收标志
- Windows 套接字编程 - 错误代码 0
- MS Windows套接字示例对我不起作用
- 加速和 Windows 套接字 - 正确处理 TCP 客户端断开连接方案
- Windows 套接字 accept() 返回错误的值
- 使用 Windows 套接字进行蓝牙编程 - 范围内的设备
- 读取Windows套接字上的SIO_KEEPALIVE_VALS字段(用于保持空闲和间隔时间)
- 正在处理windows套接字错误
- C++Windows套接字-在程序退出时关闭套接字
- 如何检查准备从windows套接字读取的字节是否超过1个
- 在Windows套接字编程中,Ioctlsocket或recv需要更多的时间来执行
- Windows套接字api绑定函数编译问题
- 使用windows套接字(c++)接收网页,但得到一些意想不到的单词
- Windows套接字无法绑定VPN IP地址