【问题标题】:streaming with tcp using opencv and socket使用 opencv 和 socket 使用 tcp 进行流式传输
【发布时间】:2013-09-22 05:41:02
【问题描述】:

我已经完成了简单的 tcp 客户端/服务器程序,可以很好地处理字符串和字符数据...我想获取每个帧(来自网络摄像头)并将其发送到服务器..这是客户端程序的错误部分发生了:

line:66   if(send(sock, frame, sizeof(frame), 0)< 0)

错误:

client.cpp:66:39:错误:无法将参数 '2' 的 'cv::Mat' 转换为 'const void*' 到 'ssize_t send(int, const void*, size_t, int)

我无法识别此错误....请帮助...以下完整的客户端程序:

#include<stdio.h>
#include<sys/types.h>
#include<sys/socket.h> 
#include<netinet/in.h>
#include<string.h>
#include<stdlib.h>
#include<netdb.h> 
#include<unistd.h>
#include "opencv2/objdetect.hpp"
#include "opencv2/highgui.hpp"
#include "opencv2/imgproc.hpp"
#include <iostream>

using namespace std;
using namespace cv;


int main(int argc,char *argv[])
{
    int sock;
struct sockaddr_in server;
struct hostent *hp;
char buff[1024];
VideoCapture capture;
    Mat frame;
capture.open( 1 );
    if ( ! capture.isOpened() ) { printf("--(!)Error opening video capture\n"); return -1; }

begin:
capture.read(frame);

if( frame.empty() )
    {
        printf(" --(!) No captured frame -- Break!");
        goto end;
    }

sock=socket(AF_INET,SOCK_STREAM,0);
if(sock<0)
{
    perror("socket failed");
    exit(1);
}

server.sin_family =AF_INET;

hp= gethostbyname(argv[1]);
if(hp == 0)
{
    perror("get hostname failed");
    close(sock);
    exit(1);
}

memcpy(&server.sin_addr,hp->h_addr,hp->h_length);
server.sin_port = htons(5000);

if(connect(sock,(struct sockaddr *) &server, sizeof(server))<0)
{
    perror("connect failed");
    close(sock);
    exit(1);
}
int c = waitKey(30);
    if( (char)c == 27 ) { goto end; }
if(send(sock, frame, sizeof(frame), 0)< 0)
{
    perror("send failed");
    close(sock);
    exit(1);
}
goto begin;
end:
printf("sent\n",);
close(sock);

    return 0;
   }

【问题讨论】:

    标签: sockets opencv


    【解决方案1】:

    因为 TCP 提供字节流,所以在您可以通过 TCP 套接字发送内容之前,您必须编写要发送的确切字节。您对sizeof 的使用不正确。 sizeof 函数告诉您系统需要多少字节来存储特定类型。这与数据通过 TCP 连接所需的字节数无关,这取决于您正在实现的 TCP 之上的特定协议,该协议必须指定如何在字节级别发送数据。

    【讨论】:

      【解决方案2】:
      • 就像大卫已经说过的那样,你弄错了长度。 sizeof() 无济于事,你想要的可能是

        frame.total() * frame.channels()

      • 你不能发送一个 Mat 对象,但你可以发送像素(数据指针),所以这将是:

        发送(sock, frame.data,frame.total() * frame.channels(), 0)

        但仍然是个坏主意。通过网络发送未压缩的像素?呸。

        请查看 imencode/imdecode

      • 我很确定,您在这里得到了相反的客户端/服务器角色。 通常,服务器保存要检索的信息(网络摄像头),客户端连接到该信息 并请求一张图片。

      【讨论】:

      • 那么如何将图像转换为灰色......并将像素值检索到单个整数数组,然后使用上述程序发送它??
      • 仍然,网络摄像头应该进入您的服务器,而不是客户端。 (您希望多个客户端能够观看同一个流,不是吗?)
      猜你喜欢
      • 1970-01-01
      • 2012-11-11
      • 1970-01-01
      • 1970-01-01
      • 2012-02-07
      • 2014-05-09
      • 2011-12-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多