使用TCP发送Iplimage错误



我试图通过usb从连接到树莓派的罗技术高清摄像头捕获帧,RP运行arch linux,我使用OpenCV C api和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 portn",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 HOSTn");
        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("%sn",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/模块/核心/src/array.cpp,第2482行

Qt捕获了从事件处理程序抛出的异常。扔在qt中不支持来自事件处理程序的异常重新实现QApplication::notify()并捕获所有异常

的实例抛出后被调用'cv::异常',错误:(-206)中无法识别或不支持的数组类型函数cvGetMat。

有谁知道如何解决这个问题吗?

我认为问题是你正在使用strlen(buffer) -这个函数返回第一个''字节的位置,而不是缓冲区的长度。尝试使用一些用于内存复制的函数来复制缓冲区(如windows上的memcpy),并使用frame->imageSize作为缓冲区长度。不要忘记在服务器上设置图像的imageSize、宽度和高度。一般来说,我建议在第一帧之前发送所有重要信息(如图像宽度,高度等),然后在不更改的情况下使用此标题

相关内容

  • 没有找到相关文章

最新更新