当前位置: 代码迷 >> WinCE >> OV9650摄像头抓取一帧,该怎么处理
  详细解决方案

OV9650摄像头抓取一帧,该怎么处理

热度:35   发布时间:2016-04-28 13:09:00.0
OV9650摄像头抓取一帧
各位大侠,求帮助啊,我用网上提供的抓取一帧的示例代码,在我的板子上测试,我用的是TQ2440开发板,OV9650的摄像头,WinCE5.0的系统,结果保存下来的bmp图总是错位的,不知道为什么..代码没有改动过..

代码如下:
C/C++ code
    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>640)        width=640;    if(height>480)        height=480;    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,(void *)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;



------解决方案--------------------
也有可能是硬件的问题,ov9650的I2C总线如果线太长就不能正常完成设置,出来的图像就有可能有错,另外看一下你BSP中对图像preview的宽高设置跟应用程序是否一致
------解决方案--------------------
楼主问题解决了吗,我也弄这个,一起讨论下吧
QQ272685110