Ahmed Kato
Ahmed Kato

Reputation: 1707

sending Iplimage using sockets

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

Upvotes: 2

Views: 2054

Answers (1)

Nikolai Fetissov
Nikolai Fetissov

Reputation: 84189

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.

Upvotes: 2

Related Questions