完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
` 使用USB摄像头应该如何呢? 1.支持UVC(免驱), 2.YUV2 或者 MJPEG 格式输出。 摄像头支持驱动类型参照:WEEBE的配置说明: 1. 在 linux 类操作系统下插入 USB 摄像头,用 dmesg 打印信息 #dmesg uvcvideo: Found UVC 1.00 device USB2.0 UVC PC Camera [ 8705.867695] uvcvideo: UVC non compliance - GET_DEF(PROBE) not supported. Enabling workaround. [ 8705.886554] uvcvideo: Found UVC 1.00 device USB2.0 Camera (1e4e:0102) [ 8705.888801] uvcvideo: UVC non compliance - GET_DEF(PROBE) not supported. Enabling workaround. [8705.889829] input: USB2.0 Camera as /devices/pci0000:00/0000:00:1a.7/u***1/1-1/1-1:1.0/input/input12 [ 8705.890440] u***core: registered new interface driver uvcvideo [ 8705.890446] USB Video Class driver (1.1.1) [ 8827.856129] pool[5982]: segfault at 0 ip (null) sp afabc0ec error 14 in gnome-screenshot[8048000+12000] 第一个 UVC 1.00 device USB2.0 UVC PC Camera 是笔记本自带的摄像头 它的 VID:PID 是 174f:5931;第二个 UVC 1.00 device USB2.0 Camera 也就是 我们插入的 USB 摄像头他的 VID:PID 是 1e4e:0102。这里的 ID 号可以在下一 步 UVC 官方的文档中进一步确定是否被支持。 2. 用 ls /dev/video* 查看设备节点、 3. 配置内核 4编译内核 #make uImage 5.编译模块并拷贝下面三个 ko 文件到文件系统下 #make modules # cp ./drivers/media/v4l2-core/videobuf2-memops.ko /nfs/ko # cp ./drivers/media/v4l2-core/videobuf2-vmalloc.ko /nfs/ko #cp ./drivers/media/u***/uvc/uvcvideo.ko /nfs/ko 把生成的./arch/arm/boot/uImage 烧进开发板,重新启动,进行下一步。 1. 重启开发板,加载模块。 #cd ./ko #insmod videobuf2-memops.ko #insmod videobuf2-vmalloc.ko #insmod uvcvideo.ko 出现如下信息 2. 2.插入 USB 摄像头到板子上,出现如下信息 ls /dev/video* ,如图出现 video0 3. 3. 执行 qt 测试程序 这文件夹下有两个 qt 程序: qt_camera_yuv_ts 和 qt_camera_mjpeg_ts。 4. 先拷贝生成的 qt_camera_mjpeg_ts 文件到 QT 文件系统下,再执行。 # ./ qt_camera_mjpeg_ts -qws 出现图像: 这样,我们的 u*** 摄像头实验现象就出来了。 对于 qt 应用程序,除了做开启 v4l2 视频设备的一些初始化工作外,还要注 意到一个编码转化的问题。 如果是 YUV 输出的话, 这里的转码是 YUV422 转RGB888, 如果是 MJPE 的话,则不需要这个函数。 14.5.1 YUV 格式输出 VideoDevice *vd; /* 初始化一个 VideoDevice 设备 */ void ProcessImage::paintEvent(QPaintEvent *) { /*捕获图片*/ rs = vd->get_frame((void **)&p,&len); /*将 yuv442 转为 rgb24 码*/ convert_yuv_to_rgb_buffer(p,pp,WIDTH,HEIGHT/*QWidget::width(),QWi dget::height()*/); frame->loadFromData((uchar *)pp,/*len*/WIDTH * HEIGHT * 3 *sizeof(char)); /*用 label 控件将图片显示于 LCD*/ label->setPixmap(QPixmap::fromImage(*frame,Qt::AutoColor)); // label->show(); rs = vd->unget_frame(); // label->drawFrame(); } 这里要科普一下 YUV 与 RGB 编码的相关知识。 YUV 是编译 true-color 颜色空间( color space)的种类, Y'UV, YUV, YCbCr, YPbPr 等专有名词都可以称为 YUV,彼此有重叠。“ Y”表示明亮度( Luminance、 Luma),“ U”和“ V”则是色度、浓度( Chrominance、 Chroma), Y'UV, YUV, YCbCr, YPbPr 常常有些混用的情况,其中 YUV和 Y'UV通常用来描述模拟信号, 而相反的 YCbCr 与 YPbPr 则是用来描述数位的影像信号,例如在一些压缩格式 内 MPEG、 JPEG 中,但在现今, YUV 通常已经在电脑系统上广泛使用。 RGB 颜色模型或红绿蓝颜色模型,是一种加色模型,将红( Red)、绿( Green)、 蓝( Blue)三原色的色光以不同的比例相加,以产生多种多样的色光。 RGB24(or RGB888)每像素 24 位(比特 s per pixel, bpp)编码的 RGB 值:使 用三个 8 位无符号整数( 0 到 255)表示红色、绿色和蓝色的强度。这是当前主 流的标准表示方法,用于真彩色和 JPEG 或者 tiFF 等图像文件格式里的通用颜 色交换。它可以产生一千六百万种颜色组合,对人眼来说其中很多已经分辨不开。 RGB32 模式实际就是 24 比特模式,余下的 8 比特不分配到象素中,这种模式 是为了提高数据输送的速度( 32 比特为一个 DWORD, DWORD 全称为 Double Word,一般而言一个 Word 为 16 比特或 2 个字节,处理器可直接对其运算而不 需额外的转换)。同样在一些特殊情况下,如 DirectX、 OpenGL 等环境,余下的 8 比特用来表示象素的透明度( Alpha)。 Uvc 摄像头一般的视频输出格式为 yuv 或 mjpg。 如果你的摄像头是 YUV 格 式输出,但是我们的 LCD 显示屏幕是 RGB24 的显示模式,所以我们需要把 YUV 格式的图像转为 RGB 格式才能在 LCD 上显示。 YUV 与 RGB 的转换有某种对应关系,所以可以通过算法进行转换。下面是 一种 YUV 转 RGB 的算法: int ProcessImage::convert_yuv_to_rgb_buffer(unsigned char *yuv, unsigned char *rgb, unsigned int width, unsigned int height) { unsigned int in, out = 0; unsigned int pixel_16; unsigned char pixel_24[3]; unsigned int pixel32; int y0, u, y1, v; for(in = 0; in < width * height * 2; in += 4) { pixel_16 = yuv[in + 3] << 24 | yuv[in + 2] << 16 | yuv[in + 1] << 8 | yuv[in + 0]; y0 = (pixel_16 & 0x000000ff); u = (pixel_16 & 0x0000ff00) >> 8; y1 = (pixel_16 & 0x00ff0000) >> 16; v = (pixel_16 & 0xff000000) >> 24; pixel32 = convert_yuv_to_rgb_pixel(y0, u, v); pixel_24[0] = (pixel32 & 0x000000ff); pixel_24[1] = (pixel32 & 0x0000ff00) >> 8; pixel_24[2] = (pixel32 & 0x00ff0000) >> 16; rgb[out++] = pixel_24[0]; rgb[out++] = pixel_24[1]; rgb[out++] = pixel_24[2]; pixel32 = convert_yuv_to_rgb_pixel(y1, u, v); pixel_24[0] = (pixel32 & 0x000000ff); pixel_24[1] = (pixel32 & 0x0000ff00) >> 8; pixel_24[2] = (pixel32 & 0x00ff0000) >> 16; rgb[out++] = pixel_24[0]; rgb[out++] = pixel_24[1]; rgb[out++] = pixel_24[2]; } return 0; } int ProcessImage::convert_yuv_to_rgb_pixel(int y, int u, int v) { unsigned int pixel32 = 0; unsigned char *pixel = (unsigned char *)&pixel32; int r, g, b; r = y + (1.370705 * (v-128)); g = y - (0.698001 * (v-128)) - (0.337633 * (u-128)); b = y + (1.732446 * (u-128)); if(r > 255) r = 255; if(g > 255) g = 255; If(b > 255) b = 255; if(r < 0) r = 0; if(g < 0) g = 0; if(b < 0) b = 0; pixel[0] = r * 220 / 256; pixel[1] = g * 220 / 256; pixel[2] = b * 220 / 256; return pixel32; 我们来看下效果如何: 那么如何进行一个动态检测的方案呢: 1.检测是通过图像之间的各像素点的变化之来确定方向的。比如800*640 的像素,其中x = 10 y = 20 的这个像素点,原先的数值为240.那么在下一次传输信号的同时,我们可对上一次的数值进行一次对比。注意,这里所使用的其实是标准值,简单的理解就是背景层,如果这个数值发生了改变。那么可能这一块区域有移动的物体或者改变。 2.而在设计程序的过程中为了避免因为天气的原因光线的变化导致的改变,我们使用了在视频信号采集的过程中,类似于滤波函数的机制,即 采集的信号为 240 239 242 那么我们求均值,这样来计算,那么在xHZ的采集频率情况下,环境的变化几乎可以忽略不计。 3.如果确定物品移动的方向,基于上条的理论 只要简单的确定一个变化矩阵即可,也就是变化矩阵的边界即可,为方便演示,我们在这个区域增加了红色边框,这样在QT界面更容易直观的去观察。 下面我们就根据实物模型来看下效果: |
|
相关推荐
1 个讨论
|
|
只有小组成员才能发言,加入小组>>
【盈鹏飞RK3399安卓主板 XPC-3399Pro免费试用】+烧写出厂固件
10319 浏览 0 评论
【盈鹏飞EVB-T335开发板试用体验】debian系统烧写
3347 浏览 1 评论
【盈鹏飞I.MX6UL工控开发板试用体验】linux can 测试
3226 浏览 0 评论
301浏览 0评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-18 09:53 , Processed in 0.819121 second(s), Total 58, Slave 43 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号