73

帖子

0

TA的资源

一粒金砂(初级)

21
 
我也是新手,把我想到的告诉你吧,不一定对。

首先是调用CAM_IOCTL_GET_LATEST_FRAME,调用这个则会执行Copy_Cam_Image,这里面就是把你得到图像存到你指定的buffer里。你没说你用的平台是什么,应该就是三星的芯片吧。那么一般默认是输出ycbcr格式的,你可以把这个采集到的图像转为rgb在加个头,就生成bmp。至于死机的问题,这个不太清楚,还是建议你好好看看Copy_Cam_Image里的代码,肯定是这里的问题。


其次,你说你得到的是噪声,第一要看看你采集到的是不是rgb的图像,这个你可以直接把采集到的grb图像用UE打开,直接添加文件头,看有没有图想,就知道正确与否了。
然后看你的头文件那个函数家的对不对,下面是我用的函数,已经验证过了,是好用的。

就这些啦  好运吧




   unsigned char *WRGB;
   WRGB = (unsigned char*)malloc(BytePerLine*height+54);
  
    unsigned char* WRGB_Start=NULL;
   
//   unsigned char* rgb=new U8[3*ImgSize+54] ;
   
    memset(WRGB, 0, BytePerLine*height+54);
    RETAILMSG(MSG_EN_1,(TEXT("5\r\n")));
    //BMP头
    WRGB[0] = 'B';
    WRGB[1] = 'M';
    *((unsigned int*)(WRGB+2)) = BytePerLine*height+54;
    *((unsigned int*)(WRGB+10)) = 54;
    *((unsigned int*)(WRGB+14)) = 40;
    *((unsigned int*)(WRGB+18)) = width;
    *((unsigned int*)(WRGB+22)) = height;
    *((unsigned short*)(WRGB+26)) = 1;
    *((unsigned short*)(WRGB+28)) = 16;
    *((unsigned int*)(WRGB+34)) = BytePerLine*height;

     
//     for(i=0;i<54;i++,WRGB++)  RETAILMSG(MSG_EN_1,(TEXT(" 0x%X "),*WRGB));



    WRGB_Start = WRGB + 54;

    for(y=height-1,j=0; y > 0; y--,j++)
    {   //RETAILMSG(MSG_EN_1,(TEXT("height=%d  ,y=   %d  \r\n"),height,y));
        for(x=0,i=0; x         {//RETAILMSG(MSG_EN_1,(TEXT("width=%d  ,x=   %d  \r\n"),width,x));
            WRGB_Start[y*BytePerLine+i++] = B[j*width+x];
            WRGB_Start[y*BytePerLine+i++] = G[j*width+x];
            WRGB_Start[y*BytePerLine+i++] = R[j*width+x];
        }
    }

回复

80

帖子

0

TA的资源

一粒金砂(中级)

22
 
程序忘加了个BytePerLine = width*3
         U32 ImgSize = width*height
 
 

回复

72

帖子

0

TA的资源

一粒金砂(初级)

23
 
感谢hitszj604的回复,死机的问题已经找到了,我在调用CAM_IOCTL_GET_LATEST_FRAME时传入的地址是直接定义的数组,而不是用new或者malloc动态分配的,因为驱动dll与应用程序不是同一个地址空间,不能共用栈,只能用堆内存。现改正后正常了。
现在剩下的问题是YUV420转为RGB的问题,快试出来了,很快就要结贴了,感谢大家的帮助。做好后我会上传源码的。
 
 
 

回复

66

帖子

0

TA的资源

一粒金砂(初级)

24
 
YUV转RGB搞定了
http://topic.eeworld.net/u/20080303/20/60e42929-8f24-40e1-98cc-55083089a3b1.html
 
 
 

回复

68

帖子

0

TA的资源

一粒金砂(初级)

25
 
帮顶
 
 
 

回复

66

帖子

0

TA的资源

一粒金砂(初级)

26
 
lz,等待中....
 
 
 

回复

63

帖子

0

TA的资源

一粒金砂(初级)

27
 
终于搞定了,这里总结一下我的心得
1. 在2440板中,BSP提供的驱动程序源代码为camera.cpp文件,其中实现了对相机的控制和外部程序调用的接口;
2. 正如各位老大的说明,驱动程序在CIS_IOControl接口函数中实现外部程序调用的功能,包括开始、停止和获取最新帧数据等;
3. 应用程序需要使用相机时,调用CreateFile(_T("CIS1:"), GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_EXISTING,0,0); 函数获取控制相机的句柄;
4. 调用DeviceIoControl(m_hCameraFile,CAM_IOCTL_MOVIE_START,NULL,0,NULL,0,&dwBytesReceive,NULL); 来启动相机采集;
5. 调用DeviceIoControl(m_hCameraFile,CAM_IOCTL_MOVIE_STOP,NULL,0,NULL,0,&dwBytesReceive,NULL); 来停止采集数据;
6. 调用 DeviceIoControl(m_hCameraFile,   
                            CAM_IOCTL_GET_LATEST_FRAME,   
                            NULL,   
                            0,   
                            m_pYUVBuffer,   
                            (CIF_XSIZE*CIF_YSIZE+CIF_XSIZE*CIF_YSIZE/2+sizeof(YUVINFO)),                              
                            &dwBytesReceive,   
                            NULL);   函数来获取最新一帧的图像数据,数据为YUV420结构,如需显示,需调用rgb420_to_rgb24函数转换为RGB格式,然后用StretchDIBits来绘制位图,或者存为位图图片;
7. 可定时调用6中的函数并绘制出来实现图片预览,可以方便地控制频率和预览位置,但是比调用驱动中的预览功能慢一些,CPU占用也多一些;
8. 调用驱动的预览功能使用   DeviceIoControl(m_hCameraFile,   
                    IOCTL_CAM_SETGAMMA,   
                    NULL,   
                    0,   
                    &chPrevEnable,   
                    1,   
                    &dwBytesReceive,   
                    NULL);   函数来实现。
9. 厂家给我的BSP源码里面相机的驱动程序源代码camera.cpp代码组织极烂,不知道是没责任心还是咋回事,如果有清晰的结构,简单扼要的注释将对初学者有莫大的帮助。
10. 正如各位老大所说的,多看驱动源代码是很有帮助的,看懂了还可以自己重写一下,可以实现很多特别的功能。

总结就这么多了,能够搞到这个样子与各位的帮助是分不开的,在此感谢各位了;另外如今网络很发达,多用搜索引擎会有意想不到的好处;
到目前,遗留的问题还很多,听说通过调用CAM_IOCTL_SAMSUNG_CAM_PR可以直接获取到RGB数据,还没有试通,如果真能直接得到RGB数据将大大提高效率,留待后续研究。。。
 
 
 

回复

66

帖子

0

TA的资源

一粒金砂(初级)

28
 
学习了  
 
 
 

回复

69

帖子

0

TA的资源

一粒金砂(初级)

29
 
为什么2440 camera  wince 5.0下取的YCBCR420数据转成RGB会错位呢?整了一个多星期了,请问各位大侠是什么问题呢?
 
 
 

回复

63

帖子

0

TA的资源

一粒金砂(初级)

30
 
顶一下
 
 
 

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

查找数据手册?

EEWorld Datasheet 技术支持

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

 
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
快速回复 返回顶部 返回列表