Reputation: 1707
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
Reputation: 84189
Two issues I see without real close examination of the code:
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.char buffer[frame->imageSize]
) outside of its scope - that is probably the cause of the segmentation fault.Upvotes: 2