为什么不用QT自带的摄像头类而自己提升一个摄像头类呢?
因为现在市场上大部分用的都是UVC摄像头, 因为UVC摄像头 价格低,使用方便;免驱动安装;硬件接线少
USB接口通用性强。UVC是一种摄像头协议,USB摄像头基本都是UVC协议的 很多商家都说摄像头”免驱”,并不是真正免驱动,只不过是系统自带这个UVC驱动而已,所以它们敢说”免驱”. 因为UVC摄像头使用非常非常非常广泛,所以很多系统都集成了UVC驱动。
提升需要哪些资料支撑
此次我们使用的是usbcamera库来操作摄像头:
• usbcamera库非常适合操作uvc摄像头
• usbcamera库需要ffmpeg的支持
• usbcamera的比qt自带的QCamera类更方便
usbcanmera库和ffmpeg资源包可以去官网下载,不想下载的小伙伴可以私信我博客找我获取也可。
arm环境ffmpeg库交叉编译
首先我们先拿到ffmpeg的压缩包。
然后上传到ubuntu,这个是 ffmpeg的源码,我们要把它编译成库。
首先解压压缩包:
tar -xf ffmpeg-3.4.5.tar
解压之后我们要进入到解压文件中进行编译成库:
cd ffmpeg-3.4.5/
然后打开上面截图里面的文档里面有编译方法:
一、第(1)步编译源码,但是需要根据我们的自己的编译器将配置源码的命令进行修改,需要修改的地方我圈出来:
比如我自己的编译器是“ arm-cortexa9-linux-gnueabihf- ”则编译源码的命令为:
./configure --cross-prefix=arm-cortexa9-linux-gnueabihf- --enable-cross-compile --target-
os=linux --cc=arm-cortexa9-linux-gnueabihf-gcc --arch=arm --prefix=host --enable-shared --
disable-static --disable-doc --disable-x86asm --enable-ffplay
记住一定是根据自己的编译器名字进行修改。
二、然后就是按照编译步骤进行第(2)步 make,make是编译的意思。在这里可能会比较久,大概15分钟,电脑配置高可能会快一点。
三、编译完成之后就进行第(3)步,make install,make install就是执行 install 这个目标,也是就我们常说的安装。
usbcamera库的使用
usbcamera库的大概使用方法:
① 提升QWidget成USBCameraWidget
② 设置摄像头节点,采样速率
③ 打开摄像头
就这么简单。
但是
一、首先我们要获取usbcame库,不想下载的小伙伴可以私信我获取。
二、将库放到我们要使用摄像头的QT工程里面去并解压。
tar -xf
三、解压完成后我们进入到usbcamer文件夹就要注意了,
ls
就会看到有两个文件夹分别是 include和lib 如图:
(1)拷贝ffmpeg 下的 include到usbcamera下的include。
此时的include里面是没有东西的,我们可以进去看一下
include里面是用来放头文文件的,所以我们要把之前ffmpeg编译生的include下文件拷贝过来;
路径在ffmpeg/host下,如果不是很明白请看图操作(前面两个cp只是tab查看路径,最后那个才是真正的copy):
(2)拷贝ffmpeg 下的lib到usbcamera下的lib。
操作几乎和拷贝include头文件一致,直接上图看具体步骤:
四、把usbcamera库添加到我们的工程。
首先我先给你们看一下usbcamera下的pri文件,我们只要把 ffmpeg.pri 加到我们的工程即可。
如何加pri?QT进入到 .pro 文件下输入代码:
include($$PWD/usbcamera/ffmpeg.pri)
添加了pri终于来到了我们要提升的环节,具体步骤如下:
首先右键点击要提升的Qwidget,点击提升为:
然后我们要找到我们要提升的类名复制下来,看到没他也是继承Qwidget父类而来:
然后复制到提升窗口那里的提升类的名称框里,但是这时会自动生成头文件,注意这是一个坑:
我们要去看他的头文件是否真的就是这个名称,机智的我发现果然不是,现在我想到放逐大帝的一句话:拐的一批!
所以正确的提升应该是下面这样的:
五、这时候就可以去设置采样频率以及摄像头节点啦。
我们只要在构造函数里输入这两句神奇的代码就搞定了:
ui->camear->setCameraName("/dev/video15");
ui->camear->setInterval(80);
注意:你的usbcamera窗口类名可能不是camera根据自己窗口类名修改,然后你的摄像头驱动节点也要自己查看修改即 “/dev/video15”。
六、然后就是在你想打开或者关闭的地方打开或者关闭啦。
ui->camear->open();//打开
ui->camear->open();//关闭
七、还可以有截图拍照功能哦。
原理我就不多讲了,直接上代码:
connect(ui->camera,SIGNAL(receiveImage(QImage)),this,SLOT(slotCremasend(QImage))); //链接信号槽
void formcamera::slotCremasend(QImage image)
{
cramestatus = 1;
pixmap = QPixmap::fromImage(image);
}
QPixmap pix;
if(cramestatus == 0){
qDebug("camera is not start");
return ;
}
pix = pixmap;
QString filename = QDateTime::currentDateTime().toString("yyyy-MM-dd-hh-mm-ss-zz");
filename += ".jpg";
QString path = QFileDialog::getExistingDirectory(this,tr("选择一个文件夹"), "/",
QFileDialog::ShowDirsOnly|QFileDialog::DontResolveSymlinks);//和上面是一句,这是形参
qDebug()<< "path=" << path +"/" +filename;
if(pix.save(path +"/" +filename) == false){
qDebug("pic save error");
}
好了,整体的uvc摄像头的使用就到这里啦,感谢观看,如果有什么疑问或者错误欢迎私聊小编改正,如果觉得有帮助可以点赞收藏,需要资源也可以私聊小编下载哦。谢谢啦!