Sockets 使用opencv和socket的tcp流媒体
我已经完成了简单的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
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
- 我很确定,这里的客户机/服务器角色是相反的。
通常,服务器保存要检索的信息(网络摄像头),客户端连接到该服务器
并请求一个图像
那么,将图像转换为灰色,然后将像素值检索为单个整数数组,然后使用上述程序发送,怎么样?不过,网络摄像头应该进入服务器,而不是客户端。(您希望多个客户端能够观看同一流,不是吗?)