【发布时间】:2012-12-20 01:24:24
【问题描述】:
我正在尝试从通过 USB 连接到 Raspberry Pi 的 Logitech HD cam 捕获帧,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;
}
这是我在服务器上接收数据的方式:
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/modules/core/src/array.cpp,line 2482
Qt 已经捕获了一个事件处理程序抛出的异常。投掷 Qt 不支持来自事件处理程序的异常。您必须 重新实现 QApplication::notify() 并在那里捕获所有异常
在抛出一个实例后调用终止 'cv::Exception',error:(-206) 无法识别或不支持的数组类型 函数 cvGetMat。
有谁知道如何解决这个问题??
提前致谢。
【问题讨论】:
-
这个 strcpy(buffer,frame->imageData);看起来不对。 strcpy() 在第一个 '\0' 字节处停止。
-
感谢布赖恩,但您认为替代方案是什么??
-
@brianbeuning 这不是错误,我尝试在不使用缓冲区的情况下发送 frame->imageData (write(sockfd,frame->imageData,frame->imageSize);) 并出现相同的错误.
-
树莓派是ARM?另一台机器是什么?它们是字节序兼容的吗?
-
在图像数据上使用 strlen()肯定是个问题。它可能不是唯一的。