0

USB経由でRaspberryPiに接続されたLogitechHDカメラからフレームをキャプチャしようとしています。RPはarchlinuxを実行しており、OpenCVCapiとTCPクライアントを使用しています。

TCPサーバーはubuntuでc++(QT)を実行しています。

これが私のclient.cコードです

#include <opencv/cv.h>
 #include <opencv/highgui.h>
 #include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>


void error(char *msg)
{
    perror(msg);
    exit(0);
}

int main(int argc,char *argv[])
{

int sockfd,portno,n;
    struct sockaddr_in serv_addr;
    struct hostent *server;
    char buffer[999999];

    if(argc <3)
    {
        fprintf(stderr,"usage %s hostname portname port\n",argv[0]);
        exit(0);
    }

    portno = atoi(argv[2]);
    sockfd = socket(AF_INET , SOCK_STREAM,0);

    if(sockfd < 0)
    {
        error("ERROR OPENING SOCKET");
    }

    server = gethostbyname(argv[1]);
    if(server == NULL)
    {
        fprintf(stderr,"ERROR,NO SUCH HOST\n");
        exit(0);
    }

    bzero((char*)&serv_addr,sizeof(serv_addr));
    serv_addr.sin_family = AF_INET; 

    bcopy((char*)server->h_addr,(char*)&serv_addr.sin_addr.s_addr,server->h_length);
    serv_addr.sin_port = htons(portno);

    if(connect(sockfd,&serv_addr,sizeof(serv_addr)) < 0)
    {
        error("ERROR CONNECTING");
    }
    CvCapture *capture = cvCaptureFromCAM(1);
       // capture from cam
        int i =1;

       while ( 1 ) {
         // Get one frame
         IplImage* frame = cvQueryFrame( capture );
         if ( !frame ) {
           //fprintf( stderr, "ERROR: frame is null...\n" );
           getchar();
           break;
         }else
         {
             i++;
         }
         bzero (buffer,999999);
         strcpy(buffer,frame->imageData);
    n=write(sockfd,buffer,strlen(buffer));
    if(n <0)
    {
        error("ERROR READING FROM SOCKET");
    }
    //printf("%s\n",buffer);


    }
return 0;
}

これは私がサーバーでデータを受け取る方法です:

void HostConnector::readyRead()
{
    QByteArray Data = socket->readAll();

    IplImage* frame = new IplImage();
    frame->imageData = Data.data();

    cvShowImage( "mywindow", frame ); //show the frame in a window

}

しかし、私はこのエラーを受け取ります:

OpenCVエラー:cvGetMat、ファイル/home/kato/GP/src/OpenCV-2.4.2/modules/core/src/array.cpp、line 2482の不正なフラグ(パラメーターまたは構造体フィールド)(認識されない、またはサポートされていない配列タイプ)

Qtは、イベントハンドラーからスローされた例外をキャッチしました。イベントハンドラからの例外のスローはQtではサポートされていません。QApplication::notify()を再実装し、そこですべての例外をキャッチする必要があります。

'cv :: Exception'、error:(-206)関数cvGetMatで認識されないまたはサポートされていない配列型のインスタンスをスローした後に呼び出された終了。

誰かがこの問題を解決する方法を知っていますか?

前もって感謝します。

4

1 に答える 1

2

問題は、使用していることだと思います。strlen(buffer)この関数は'\0'、バッファの長さではなく、最初のバイトの位置を返します。(Windowsのように)メモリコピー用の関数を使用してバッファをコピーしてみてください。memcpyバッファ長としてはを使用してframe->imageSizeください。サーバー上の画像でimageSize、width、heightを設定することを忘れないでください。通常、最初のフレームの前にすべての重要な情報(画像の幅、高さなど)を送信し、このヘッダーを変更せずに使用することをお勧めします。

于 2013-01-06T01:43:16.913 に答える