我想用QT开发一个摄像头应用程序,把从摄像头上采集的图像实时显示到液晶屏上。但是在编译后的程序在PC机上运行正常。但是移植到S3C2440上后,初始化摄像头失败,希望高手指点一下!!
我的开发环境如下:
PC系统:redhat,内核版本2.6.18
开发板系统:Linux2.6.32.2,CPU:S3C2440
QT版本:QT4.7.0
USB摄像头:ZC301
应用程序采集摄像头图像后,显示到液晶屏上。程序在PC机上运行正常,图像可以显示。但是交叉编译后,在开发板上初始化摄像头时出错,无法工作。
内核启动后挂载友善之臂的Qtopia版本的USB摄像头动态预览程序,图像显示正常,说明内核的摄像头驱动也没问题。下面是摄像头的初始化程序,在S3C2440上运行时if(0 == ioctl(fd, VIDIOC_CROPCAP, &cropcap))始终为假,无法通过。
int VideoDevice::init_device()
{
v4l2_capability cap;
v4l2_cropcap cropcap;
v4l2_crop crop;
if(-1 == ioctl(fd, VIDIOC_QUERYCAP, &cap))
{
if(EINVAL == errno)
{
emit display_error(tr("%1 is no V4l2 device").arg(dev_name));
}
else
{
emit display_error(tr("VIDIOC_QUERYCAP: %1").arg(QString(strerror(errno))));
}
return -1;
}
printf( "driver=%s,card=%s,businfo=%s\nversion=%x,cap=%x\n"
"res:%x,%x,%x,%x\nVIDIOC_QUERYCAP=%x\n",
cap.driver,cap.card,cap.bus_info,cap.version,cap.capabilities,
cap.reserved[0],cap.reserved[1],cap.reserved[2],cap.reserved[3],VIDIOC_QUERYCAP);
if(!(cap.capabilities & V4L2_CAP_VIDEO_CAPTURE))
{
emit display_error(tr("%1 is no video capture device").arg(dev_name));
return -1;
}
if(!(cap.capabilities & V4L2_CAP_STREAMING))
{
emit display_error(tr("%1 does not support streaming i/o").arg(dev_name));
return -1;
}
CLEAR(cropcap);
cropcap.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
printf( "VIDIOC_CROPCAP=%x\n",VIDIOC_CROPCAP);
/***************************************************************************
在arm上运行时,下面的ioctl始终返回-1,无法通过
**************************************************************************/
if(0 == ioctl(fd, VIDIOC_CROPCAP, &cropcap))
{
CLEAR(crop);
crop.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
crop.c = cropcap.defrect;
if(-1 == ioctl(fd, VIDIOC_S_CROP, &crop))
{
if(EINVAL == errno)
{
// emit display_error(tr("VIDIOC_S_CROP not supported"));
}
else
{
emit display_error(tr("VIDIOC_S_CROP: %1").arg(QString(strerror(errno))));
return -1;
}
}
}
else
{
emit display_error(tr("12VIDIOC_CROPCAP: %1").arg(QString(strerror(errno))));
//return -1;
}
.......
}
cap在pc和arm上的值分别为:pc上运行摄像头驱动信息:
driver=zc301,
card=ZX301[P] PC Camera,businfo=usb-0000:00:1d.0-2
version=10005,
cap=5000001
res:0,0,0,0
arm上运行摄像头驱动信息:
driver=zc3xx,card=PC Camera,
businfo=usb-s3c24xx-1.2
version=20700,cap=5000001
res:0,0,0,0
这个问题和驱动版本不同有关系吗?