0

私は単純なtcpクライアント/サーバープログラムを実行し、文字列と文字データでうまく機能しました...各フレームを(Webカメラから)取得してサーバーに送信したかった..エラーが発生したクライアントプログラムの部分は次のとおりです。

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

エラー:

client.cpp:66:39: エラー: 引数 '2' の 'cv::Mat' を 'const void*' に変換できません 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;
   }
4

2 に答える 2

1

TCP はバイト ストリームを提供するため、TCP ソケット経由で何かを送信する前に、送信する正確なバイトを構成する必要があります。の使い方sizeofが間違っています。このsizeof関数は、特定のタイプを格納するためにシステムに必要なバイト数を示します。これは、データがバイトレベルで送信される方法を指定する必要がある、実装している TCP の上に階層化された特定のプロトコルに依存する TCP 接続を介してデータが必要とするバイト数とは関係ありません。

于 2013-09-22T05:50:00.270 に答える
0
  • デビッドがすでに言ったように、あなたは長さを間違えました。sizeof() は役に立たないでしょう、あなたが望むのはおそらく

    frame.total() * frame.channels()

  • Mat オブジェクトを送信することはできませんが、ピクセル (データ ポインター) を送信できるため、次のようになります。

    send(sock, frame.data,frame.total() * frame.channels(), 0)

    しかし、それでも悪い考えです。ネットワーク経由で圧縮されていないピクセルを送信しますか? ああ。

    imencode/imdecode を見てください

  • ここでは、クライアント/サーバーの役割が逆になっていると確信しています。通常、サーバーは取得する情報 ( webcam ) を保持し、クライアントはそれに接続して画像を要求します。

于 2013-09-22T08:31:19.900 に答える