• 5483阅读
  • 0回复

QT4.7.0开发ZC301摄像头应用问题! [复制链接]

上一主题 下一主题
离线tangquanming
 
只看楼主 倒序阅读 楼主  发表于: 2011-06-27

我想用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  

这个问题和驱动版本不同有关系吗?
快速回复
限100 字节
 
上一个 下一个