Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sockets 使用opencv和socket的tcp流媒体_Sockets_Opencv - Fatal编程技术网

Sockets 使用opencv和socket的tcp流媒体

Sockets 使用opencv和socket的tcp流媒体,sockets,opencv,Sockets,Opencv,我已经完成了简单的tcp客户机/服务器程序,可以很好地处理字符串和字符数据…我想从网络摄像头中获取每个帧并将其发送到服务器。。以下是发生错误的客户端程序部分: line:66 if(send(sock, frame, sizeof(frame), 0)< 0) 行:66 if(发送(sock,frame,sizeof(frame),0)短节长度); server.sin_port=htons(5000); if(连接(sock,(struct sockaddr*)和服务器,sizeo

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

line:66   if(send(sock, frame, sizeof(frame), 0)< 0)
行:66 if(发送(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;
   }
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括“opencv2/objdetect.hpp”
#包括“opencv2/highgui.hpp”
#包括“opencv2/imgproc.hpp”
#包括
使用名称空间std;
使用名称空间cv;
int main(int argc,char*argv[])
{
int袜子;
服务器中的结构sockaddr_;
结构主机*hp;
字符buff[1024];
视频捕获;
垫架;
捕获。打开(1);
如果(!capture.isOpened()){printf(“-(!)打开视频捕获时出错,\n”);返回-1;}
开始:
捕获。读取(帧);
if(frame.empty())
{
printf(“--(!)未捕获帧--Break!”);
转到终点;
}
sock=socket(AF\u INET,sock\u STREAM,0);
if(短节地址,hp->短节长度);
server.sin_port=htons(5000);

if(连接(sock,(struct sockaddr*)和服务器,sizeof(服务器))由于TCP提供字节流,因此在通过TCP套接字发送内容之前,必须先合成要发送的确切字节。您使用的
sizeof
是不正确的。
sizeof
函数告诉您系统上需要多少字节来存储特定类型。这与字节数无关tes数据将需要通过TCP连接,这取决于您正在实施的TCP之上的特定协议,该协议必须指定如何在字节级别发送数据。

  • 正如david已经说过的,您的长度搞错了。sizeof()不会有帮助,您想要的可能是

    frame.total()*frame.channels()

  • 不能发送Mat对象,但可以发送像素(数据指针),因此:

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

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

    请看imencode/imdecode

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


那么,将图像转换为灰色,然后将像素值检索为单个整数数组,然后使用上述程序发送,怎么样?不过,网络摄像头应该进入服务器,而不是客户端。(您希望多个客户端能够观看同一流,不是吗?)