【问题标题】:C++/OpenCV Streaming Camera-Video/Images (MJPEG) from Socket into Browser (Windows 8.1)C++/OpenCV 将相机视频/图像 (MJPEG) 从套接字流式传输到浏览器 (Windows 8.1)
【发布时间】: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


    【解决方案1】:

    我现在自己完成了,在这里和那里犯了一些错误。

    要显示图片最重要的部分是

    a) 获取在发送实际图像之前发送的 html 标头,以便我的浏览器知道要发送的内容

    b) 使用 imencode 将图像保存在缓冲区中并发送该缓冲区而不是图像本身

    我也没有将帧保存在任何地方,而是直接从我的相机输入中获取它,这样也可以缩短它。

    要使用 mjpegs 完成它,我只需要在之前添加另一个标题,它告诉“客户端”将发送多个图像,并由某个边框分隔:

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

    这有点帮助,尤其是。带有标题部分:http://nakkaya.com/2011/03/23/streaming-opencv-video-over-the-network-using-mjpeg/ (虽然一开始我很生气,因为我以前从未使用过也没有见过clojure。

    这也很有帮助:http://answers.opencv.org/question/6976/display-iplimage-in-webbrowsers/

    【讨论】:

      猜你喜欢
      • 2016-05-30
      • 1970-01-01
      • 2012-02-17
      • 2019-08-18
      • 2012-03-15
      • 2015-05-22
      • 2018-03-13
      • 2014-11-10
      • 2017-02-10
      相关资源
      最近更新 更多