使用USB 摄像头在笔记本上进行图像识别的学习是一种方便的方法
(size_t) vd->framesizeIn);里面
pixImage.loadFromData(rgb_buffer, imageSize);
ui->label->setPixmap(pixImage);
常用的一些视频服务器开源代码都不能很好的跟C910配合。大概原因是servfox,spcaview都是用V4L 1写的,而2.6.26后一般都用V4L 2来实现
luvcview的代码可以在
http://www.ideasonboard.org/uvc/里找到,里面也可以看到它是支持罗技C910的
luvcview与servfox一样,也是用SDL来进行界面的显示
luvcview默认采用V4L2_PIX_FMT_MJPEG,可以在一开始初始化的地方改。
int format = V4L2_PIX_FMT_MJPEG;方式,
接着,它会去查询是否支持MJPG方式,如果不支持,则采用YUV方式。
显示图像,它用的是SDL_CreateYUVOverlay,当然,你也可以用SDL_Surface,或者用其它的工具来生成界面,这个无关紧要。奇怪的是,当我用SDL_Surface来显示RGB图像时,显示正常,但色彩缺失,但,如果我把它保存为图片,实现上是一切正常的,这个很奇怪,要研究一下。
creatButt用于自己产生按钮,它会去读一个数组,然后进行转换,应该是自己先做好图片,然后再读进来,显示。
创建了一个线程,用于捕获按钮
mythread = SDL_CreateThread(eventThread, (void *) &ptdata);
uvcGrab用于获取图像信息,如果是MJPEG方式,则首先要进行jpeg_decode的解码,如果是YUV,则直接拷贝到memcpy(vd->framebuffer, vd->mem[vd->buf.index],
最后都是在framebuffer里面。
最近显示,也是用framebuffer里面的东西
其中Pyuv422torgb24,可以用于把YUV格式 转为RGB
所以如果你要进行图像识别,我会在将framebuff里存的YUV信息转成RGB格式,就用到了Pyuv422torgb24函数,然后再根据RGB信息进行图像识别
其实可以考虑用QT的QImage来显示视频
QT的作法是这样
直接往
其中rgb_buffer是RGB数据
参考资料:
附上7小时连续工作的成果
有了上次的经验,现在修改了spcaview的代码,服务器不动,新建了一个v4l的文件夹,里面放了spcaview的关键代码
然后使用QT做了一个界面,在界面 上显示,底层的SOCKET还是调用原来的
spcaview收到的数据就是jpeg格式的,直接用
pixImage.loadFromData((unsigned char *)jpeg_addr, imageSize);就可以成功
或者使用decode_jpeg,变成RGB格式,然后前面要放一个文件头,如pnm的文件头才可以在QT里面显示成功
如
pixImage.loadFromData(jpg_data, imageSize+15);