Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/148.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
C++ 使用TCP发送Iplimage时出错_C++_C_Qt_Opencv_Tcp - Fatal编程技术网

C++ 使用TCP发送Iplimage时出错

C++ 使用TCP发送Iplimage时出错,c++,c,qt,opencv,tcp,C++,C,Qt,Opencv,Tcp,我正在尝试从一个通过usb连接到Raspberry Pi的Logitech高清摄像头捕获帧,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> #inc

我正在尝试从一个通过usb连接到Raspberry Pi的Logitech高清摄像头捕获帧,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 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;
}
但我收到了这个错误:

OpenCV错误:错误标志(参数或结构字段)(无法识别或 cvGetMat文件中不支持的数组类型) /home/kato/GP/src/OpenCV-2.4.2/modules/core/src/array.cpp,第2482行

Qt捕获了从事件处理程序引发的异常。投掷 Qt中不支持事件处理程序的异常。必须 重新实现QApplication::notify()并捕获其中的所有异常

在抛出的实例后调用terminate “cv::Exception”,错误:(-206)中的数组类型无法识别或不受支持 函数cvGetMat

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


提前感谢。

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

此strcpy(缓冲区、帧->图像数据);看起来不对。strcpy()在第一个“\0”字节处停止。谢谢brian,但您认为替代方法是什么???@brianbeuning这不是错误,我尝试在不使用缓冲区的情况下发送帧->图像数据(write(sockfd,frame->imageData,frame->imageSize);),出现了相同的错误。覆盆子PI是ARM吗?另一台机器是什么?它们是否兼容endian?在图像数据上使用strlen()肯定是个问题。它可能不是唯一的一个。
void HostConnector::readyRead()
{
    QByteArray Data = socket->readAll();

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

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

}