5851|6

73

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

S3C6410 Camera接口获取图像成功,但是数据全是0.求助!!! [复制链接]

我用在WINCE 使用S3C6410的摄像头驱动,应用程序中使用DeviceIoControl来设置摄像头属性和获取一帧数据。
在驱动的程序中看到了它的控制代码如下:
// prepare  准备好DMA缓存,设置成 CAPTURE / VIDEO / PREVIEW 模式
#define                IOCTL_CAM_PREPARE                                0x0504
// stop     停止获取摄像头数据
#define                IOCTL_CAM_STOP                                0x0505
// Getting Buffer   获取一帧图像
#define                IOCTL_CAM_GETBUFFER                        0x0506
// Resume   唤醒
#define                IOCTL_CAM_RESUME                                0x050


(1)在应用程序中打开设备的时候代码如下:
// 1 创建一个CAM流设备文件
        m_hCam = NULL;
       
        m_hCam = CreateFile(
                                _T("CAM1:"),
                                GENERIC_READ | GENERIC_WRITE,
                                FILE_SHARE_READ | FILE_SHARE_WRITE,
                                NULL,
                                OPEN_EXISTING,
                                FILE_ATTRIBUTE_NORMAL,
                                NULL
                        );
        if (NULL == m_hCam)
        {
                AfxMessageBox(_T("open cam failed!"));
        }

结果是打开成功。
(2)然后是准备摄像头:
        // 1 准备摄像头信息
        if (!DeviceIoControl(
                                m_hCam,
                                IOCTL_CAM_PREPARE,
                                NULL,
                                0,
                                NULL,
                                0,
                                &dwByteTransfed,
                                NULL
                        )
           )
        {
                AfxMessageBox(_T("set camera parameter failed!"));
        }

通过成功。
(3)最后是通过按钮来响应获取一帧图像。
BYTE *pbuf = new BYTE[320*240*4];

        if (!DeviceIoControl(
                                m_hCam,
                                IOCTL_CAM_GETBUFFER,
                                NULL,
                                0,
                                 pbuf,
                                sizeof(pbuf),
                                 &dwByteTransfed,
                                NULL
                        )
           )
        {
                AfxMessageBox(_T("failed!"));
        }

        delete []pbuf;


缓存也是获取成功,pbuf在没有释放之前,我测试了里面的数据,不论怎么摆弄摄像头都是0数据,也就是初始化的数据。

通过跟踪驱动的代码,在驱动的PREVIEW中断IST中,有一行代码:
pfnCameraHandlePreviewFrame(dwCameraDriverContext);
它是为了满足DSHOW的架构,在接受完每一帧图像数据后,形成视频流。
跟踪这个函数,调用了CameraPreviewFrameCallback-》HandleCaptureInterrupt-》MDD_HandleIO-》HandlePinIO
-》PDDFillPinBuffer->PDD_FillBuffer-》CCameraPdd::FillBuffer,实际上处理的部分在Fillbuffer这个函数里面,
Fillbuffer关键代码如下:

// 1 获得当前完成的一帧图像的索引号, DMA缓存中总共有4帧 0,1,2,3
CurrentFrame = CameraGetCurrentFrameNum(PREVIEW_CAPTURE_BUFFER);

// 2 获得一帧图像的大小
dwRet = pCsVideoInfoHdr->bmiHeader.biSizeImage;

// 3 内存复制
memcpy(pImage, (void *)m_CameraHWPreviewBuffers[CurrentFrame].VirtAddr, dwRet);

其中的pImage 是我们外部传入的获取图像的指针,也就是DeviceIoControl中的pbuf,

m_CameraHWPreviewBuffers[CurrentFrame].VirtAddr 是 当前帧的虚拟地址,

dwRet 是图像的大小。

综上所述,我实验排除了硬件设备的问题(采用其他程序测试过,有图像,硬件没有问题),
但是最终memcpy出来的数据总是 0值,不知道那里错了,请大家帮助下,谢谢


最新回复

sizeof(pbuf) 这个行吗? 换成320*240*4试试  详情 回复 发表于 2010-6-21 17:58
点赞 关注

回复
举报

79

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
guanzhu
 
 

回复

80

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
是用DMA传数据吧,通了吗?可以判断一下是传到buffer的过程中错了,还是从buffer传到内存时出错。。。
 
 
 

回复

76

帖子

0

TA的资源

一粒金砂(初级)

4
 
目前,我也在做类似的项目,但是个新手,由于运用的摄像头厂方并没有提供摄像头,有没有高手能提供一些帮助??开发的方式最好不是Directshow的方式。
 
 
 

回复

89

帖子

0

TA的资源

一粒金砂(初级)

5
 
一不小心搜索到,学习下
 
 
 

回复

68

帖子

0

TA的资源

一粒金砂(中级)

6
 
好像没有最终的结论,怎么就给分了?
 
 
 

回复

75

帖子

0

TA的资源

一粒金砂(初级)

7
 
sizeof(pbuf)

这个行吗? 换成320*240*4试试
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/7 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表