sending Iplimage using sockets

試著忘記壹切 提交于 2020-02-28 08:21:49

问题


I am trying to capture frames from a Logitech HD cam connected to a Raspberry Pi through usb, the RP is running arch linux and I am using OpenCV C api and a TCP client.

The TCP server is running c++(QT) under ubuntu.

I am storing the frame->imageData in a buffer and then send the data in the buffer.

this is a proof of concept that I can save a frame to a buffer then reconstruct a new frame which is tmpbuffer from the buffer,actually this code is running perfectly:

CvCapture *capture = cvCaptureFromCAM(1);
cvNamedWindow( "mywindow", CV_WINDOW_AUTOSIZE );
    int i =1;

   while ( 1 ) {
     // Get one frame
     IplImage* frame = cvQueryFrame( capture );
     CvSize size;
     size.height = 480;
  size.width = 640;
     IplImage* tmpframe = cvCreateImageHeader(size, IPL_DEPTH_8U, 3); //create a new frame
     if ( !frame ) {
       //fprintf( stderr, "ERROR: frame is null...\n" );
       getchar();
       break;
     }else
     {
         //std::cout<<i<<std::endl;
         char buffer[frame->imageSize];
         snprintf(buffer,frame->imageSize,"%s",frame->imageData);
         //printf("frame->height= %s\n",buffer);

         tmpframe->imageData = buffer;
         printf("data %s\n",tmpframe->imageData);

         //snprintf(IDbuffer,10,"%d",frame->ID);
         //printf("frame->ID= %s\n",IDbuffer);
         i++;
     }
     cvShowImage( "mywindow", tmpframe );

Here is my client.c file:

#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;


 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);
       // Show the image captured from the camera in the window and repeat
        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++;
         }

         char *msg = frame->imageData;
         char buffer[frame->imageSize];
         bzero (buffer,frame->imageSize);
         snprintf(buffer,frame->imageSize,"%s",msg);
 n=write(sockfd,buffer,frame->imageSize);
 if(n <0)
 {
  error("ERROR READING FROM SOCKET");
 }
 //printf("%s\n",buffer);


 }
return 0;
}

and this is how I am receiving data on my server:

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

    CvSize size;
    size.height = 480;
    size.width = 640;
    IplImage *frame = cvCreateImageHeader(size, IPL_DEPTH_8U, 3);


    frame->imageData = Data.data();
    cvShowImage( "mywindow", frame );

}

But the server is crashing !! a segmentation fault at

cvShowImage( "mywindow", frame );

回答1:


Two issues I see without real close examination of the code:

  • You are using printf(3)-style functions to format binary data. That is wrongTM. The length of the resulting string would not be the same as the length of the image, and binary data might have zero bytes in the middle, or not have zero terminator.
  • You are using temporary buffer (char buffer[frame->imageSize]) outside of its scope - that is probably the cause of the segmentation fault.


来源:https://stackoverflow.com/questions/14200631/sending-iplimage-using-sockets

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!