编写wince+EVC+ov9650应用程序时遇到的问题

duanzw102 2011-03-01 08:46:52
我在开发一个能够进行预览和拍照的应用程序,编译能够通过,可是在板子上跑的时候不能拿到图像数据。用DNW观察显示如下信息:
SENDING command id 0x8003 to CShexiangView target.
CAMERA: CIS_Open
CAM_IOCTL_SAMSUNG_CAM_PR
Data Abort: Thread=836a0ce0 Proc=80426ae0 'shexiang.exe'
AKY=00000401 PC=03fc3fbc(coredll.dll+0x00053fbc) RA=00011c94(shexiang.exe+0x00001c94) BVA=160e4000 FSR=00000007
请问我错在哪里?刚开始学习摄像头编程,希望能够详细指点。另外,我这样读摄像头的思想对吗?先用CreateFile打开摄像头,然后DeviceIoControl(m_hled,CAM_IOCTL_SAMSUNG_CAM_PR,NULL,NULL,(PBYTE)&image,NULL,NULL,NULL)获得存储图像的首地址,最后用memcpy把数据从摄像头缓冲区拷贝出来?谢谢指点!
程序如下:
void CShexiangView::OnYuLan()
{
// TODO: Add your command handler code here
HANDLE m_hled=CreateFile(_T("CIS1:"),GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_EXISTING,0,0);
PINGPONG_PR image;
WORD width=GetSystemMetrics(SM_CXSCREEN);
WORD height=GetSystemMetrics(SM_CYSCREEN);
BOOL ret;
BYTE* DDBdata=new BYTE[width*height*2];
BYTE* DIBdata;
if(width>320)
width=320;
if(height>240)
height=240;
ret=DeviceIoControl(m_hled,CAM_IOCTL_SAMSUNG_CAM_PR,NULL,NULL,(PBYTE)&image,NULL,NULL,NULL);

if(!ret)
AfxMessageBox(_T("读取图片失败!"));
else
{

SetKMode(TRUE);
memcpy(DDBdata,(BYTE *)image.rgb_address,width*height*2);
SetKMode(FALSE);
CBitmap bitmap;
HBITMAP dstBmp;
bitmap.CreateBitmap(width,height,1,16,DDBdata);
HDC hdcSrc = CreateCompatibleDC(NULL);
HDC hdcDst = CreateCompatibleDC(NULL);
BITMAPINFOHEADER bih = {0};//位图信息头
bih.biBitCount = 16;//每个像素字节大小
bih.biCompression = BI_RGB;
bih.biHeight = height;//高度
bih.biPlanes = 1;
bih.biSize = sizeof(BITMAPINFOHEADER);
bih.biSizeImage = 0;// width*height*2;//图像数据大小
bih.biWidth = width;//宽度
BITMAPFILEHEADER bfh = {0};//位图文件头
bfh.bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER);//到位图数据的偏移量
bfh.bfSize = bfh.bfOffBits + width*height*2;//文件总的大小
bfh.bfType = (WORD)0x4d42;
BITMAPINFO bi={0};
bi.bmiHeader=bih;
dstBmp=CreateDIBSection(hdcDst, (BITMAPINFO*)&bi, DIB_RGB_COLORS, (void **)&DIBdata, NULL, 0);
SelectObject(hdcDst, dstBmp);
SelectObject(hdcSrc, bitmap);
BitBlt(hdcDst, 0, 0, width, height, hdcSrc, 0, 0, SRCCOPY);
CFile file(_T("image.bmp"),CFile::modeCreate|CFile::modeReadWrite);
file.Write(&bfh,sizeof(bfh));
file.Write(&bih,sizeof(bih));
file.Write(DIBdata,width*height*2);
file.Close();
}
delete []DDBdata;
}
...全文
184 9 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
riccdw421 2011-03-05
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 liangxd09 的回复:]
1、确认出来的数据是RGB数据,而不是yuv的数据?yv12的数据长度width*height*3/2

2、DeviceIoControl(m_hled,CAM_IOCTL_SAMSUNG_CAM_PR,NULL,NULL,(PBYTE)&image,NULL,NULL,NULL);
取到指针?我曾做过的是要把一个new过的内存放过去,这跟驱动有关。

3、应该调用Device……
[/Quote]

我也正在做Camera相关的工作,不过是底层驱动,liangxd09的回复,分析的挺到位的
1:Camera一般都会有个默认分辨率的,这个需APP在运行前去取,如果不是自己需要的分辩率,需APP设置。
这将直接影响你下步预览时,取数据的Buffer,即地址越界现象。
2:Camera驱动如果是按MS的构架来做的,很有可能需要你应用分配一个内存即&给驱动,驱动中有一个fill_buffer_yv12()就是直接Memcpy数据到APP传下去的地址。

借楼主的帖子,问下我自已相关的问题帖子“Camera截图分层或叠加问题”,谢谢
liangxd09 2011-03-05
  • 打赏
  • 举报
回复
还有改用vs2005吧,evc旧了。 调试进去看看哪步出错~~
liangxd09 2011-03-05
  • 打赏
  • 举报
回复
1、确认出来的数据是RGB数据,而不是yuv的数据?yv12的数据长度width*height*3/2

2、DeviceIoControl(m_hled,CAM_IOCTL_SAMSUNG_CAM_PR,NULL,NULL,(PBYTE)&image,NULL,NULL,NULL);
取到指针?我曾做过的是要把一个new过的内存放过去,这跟驱动有关。

3、应该调用DeviceIoControl设置下camera的长宽吧~~ 要是默认小于320的数据,一样越界
「已注销」 2011-03-02
  • 打赏
  • 举报
回复
你自己的这些代码运行在用户态,驱动运行在内核态,这里的切换是系统完成的。
你拿到的指针image.rgb_address不是物理内存的地址,是用户态的虚拟内存
duanzw102 2011-03-02
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 crystal28 的回复:]
SetKMode(TRUE);就不用了吧。
驱动已经确认写好了吗?应用层这样写应该可以,你要看一下哪一行代码导致程序出错,可以用写日志的办法
[/Quote]
摄像头的数据不是在内核区吗?不需要从用户态切换到内核态进行数据读写吗?另外驱动用的是OK2440开发板提供的,目前还不会测试驱动
duanzw102 2011-03-02
  • 打赏
  • 举报
回复
我在源码中又加了调试信息,并事先对image结构体赋值image.rgb_address=1,image.flag=1,
发现image.rgb_address的值根本没有改变,而image.flag变化了,并且ret返回错误,CAMERA:Ioctl code = 0x10303ff。
请问这是什么原因?DNW调试信息如下:
CAMERA: CIS_Open
CAM_IOCTL_SAMSUNG_CAM_PR
image.rgb_address:1,image.flag:0
ret:-2092285952
CAMERA:Ioctl code = 0x10303ff
duanzw102 2011-03-02
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 91program 的回复:]
一般来说,是地址越界了
[/Quote]
为什么会越界呢?应该是320*240个RGB565像素啊,每个像素占两个字节?能否具体的谈一下?
「已注销」 2011-03-02
  • 打赏
  • 举报
回复
SetKMode(TRUE);就不用了吧。
驱动已经确认写好了吗?应用层这样写应该可以,你要看一下哪一行代码导致程序出错,可以用写日志的办法
91program 2011-03-01
  • 打赏
  • 举报
回复
一般来说,是地址越界了

19,520

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 嵌入开发(WinCE)
社区管理员
  • 嵌入开发(WinCE)社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧