嵌入式 QT usb camera库驱动摄像头

简介: 嵌入式 QT usb camera库驱动摄像头

前言

  为什么不用 QT 自带的摄像头类而使用 usbcamera 类呢? 因为现在市场上大部分用的都是 UVC 摄像头, 因为 UVC 摄像头 价格低,使用方便;免驱动安装;硬件接线少 USB 接口通用性强。UVC 是一种摄像头协议,USB 摄像头基本都是 UVC 协议的 很多商家都说摄像头”免驱”, 并不是真正免驱动,只不过是系统自带这个 UVC 驱动而已,所以它们敢说”免驱”. 因为 UVC 摄像头使用非常非常非常广泛,所以很多系统都集成了 UVC 驱动。

usbcamera 库需要 ffmpeg 的支持;非常适合操作 uvc 摄像头;qt 自带的 QCamera 类更方便。

1. 交叉编译 ffmpeg

1.1 先拿到ffmpeg的压缩包

1.2 把ffmpeg源码复制到虚拟机,并解压压缩包

sudo tar -xf ffmpeg-3.4.5.tar.gz

1.3 解压之后我们要进入到解压文件中进行编译成库

cd ffmpeg-3.4.5/

然后打开上面截图里面的文档里面有编译方法,这是 32 位系统的编译方法。

1.4 编译源码(32位系统),但是需要根据我们自己的编译器将配置源码的命令进行修改,需要修改的地方我们圈出来:

我用的交叉编译器为 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

如果使用的是 64 位的系统,则使用 64 位的编译器:以下是信盈达 A53 开发板的配置:

./configure --cross-prefix=aarch64-linux- --cpu=cortex-a53 --disable-asm --enable-cross-compile --target

os=linux --cc=aarch64-linux-gcc --arch=arm --prefix=$PWD/ffmpeg-3.4.5 --enable-shared --disable-static --

disbable-doc --disbale-x86asm

1.5 make

1.6 make install

完成后:


2.usbcame库使用

 2.1 获取usbcame库并解压

tar -xf usbcamera.tar.gz

2.2 解压完成后我们进入到ussbcamer文件夹,就会看到有两个文件夹分别为include和lib

,如下:

2.3 拷贝上一章编译好的 ffmpeg 下的 include usbcamera 下的 include

这个时候,include里面是没有东西的,我们可以进去看一下。

include 里面是用来放头文文件的,所以我们要把 ffmpeg include 下文件拷贝过来(注意 ffmpeg 的安装路

);

cp include/lib* /home/xing/work/usbCamera/usbCamera/usbcamera/include/ -rf

2.4  拷贝 ffmpeg 下的 lib usbcamera 下的 lib

操作几乎和拷贝include头文件一样。

2.5 将usbcamera库添加到我们的工程

只要把 ffmpeg.pri 加到我们的工程即可。注意,不要以右击添加文件方式添加。在 xxx.pro 文件添加即可

include($$PWD/usbcamera/ffmpeg.pri)
INCLUDEPATH += $$PWD/usbcamera/

3.Qwidget 的类提升 USBCameraWidget

3.1 右键点击要提升的Qwidget,点击提升为:

3.2 然后我们要找到我们要提升的类名复制下来,USBCameraWidget 也是继承 Qwidget 父类而来:


4 .编译

4.1 编译

解决方法:在pro文件添加network模块

4.2 出现如下问题

原因是当前使用的 qt 版本大于 5.5,使用了 QtMultimedia QtMultimediaWidgets,这两个只有 Qt5 才有,QT4没有,这里我们使用 QT4 的方法来使用 usbcame,界面把 5.5.0 更改为大于我们使用的版本(5.8 或者 5.9),注意,需要把所有的 5.5.0 都更改。在 usbcame.cpp usbcame.h 文件中

我们改成:


4.3 应用程序输出错误

出现这个错误是没有库,把库复制到开发板。注意先压缩后再复制。

修改后:

已经没有错误!


5. 摄像头使用

 5.1 摄像头初始化

void Widget::cameraInit()
{
 ui->widget->setCameraName("/dev/video0"); //设置摄像头设备的驱动节点
 ui->widget->setInterval(120); //设置获取摄像头图像周期(ms),就是每隔多少 ms 获取一帧图像
 ui->widget->open();//打开摄像头
}

出现以下错误,原因是使用了 64 位的编译器,需要定义宏

修改后再次运行就可以了:

5.2 拍照

void Widget::on_takePhotoBtn_clicked()
{
 QImage img = ui->camerawidget->getImage(); //获取摄像头的一帧
QPixmap pix = QPixmap::fromImage(img); //转成 qpixmap
// ui->labVisiterHeader->setPixmap(pix.scaled(ui->labVisiterHeader->size()));//lable 显示
 QString fileName = QDateTime::currentDateTime().toString("yyyy-MM-dd-hh-mm-ss");
fileName += ".jpg";
#if 1
 QString path = QFileDialog::getExistingDirectory(this,tr("选择一个文件夹"),
 "/",
 QFileDialog::ShowDirsOnly |
QFileDialog::DontResolveSymlinks) ;
//qDebug() << "path=" <<path +"/" + fileName;
 /*保存图片*/
 if(pix.save(path + "/" + fileName) == false){
 qDebug( "pic save error" );
 }
#else
 if(pix.save("/root/"+fileName) == false){
 qDebug( "pic save error" );
 }
#endif
}

5.3 显示标签

void Widget::cameraInit()
{
 ui->usbCameraWidget->setOSD1Visible(true);
 ui->usbCameraWidget->setOSD1Format(USBCameraWidget::OSDFormat_Text);
 ui->usbCameraWidget->setOSD1Text("XYD");
 ui->usbCameraWidget->setOSD1Color(QColor(0, 255, 0));
 ui->usbCameraWidget->setOSD1FontSize(40);
 ui->usbCameraWidget->setOSD2Visible(true);
 ui->usbCameraWidget->setOSD2Format(USBCameraWidget::OSDFormat_DateTime);
ui->usbCameraWidget->setOSD2Position(USBCameraWidget::OSDPosition_Right_Bottom);
}

完成!


相关文章
|
7月前
|
开发框架 Linux C语言
C、C++、boost、Qt在嵌入式系统开发中的使用
C、C++、boost、Qt在嵌入式系统开发中的使用
232 1
|
5月前
|
Linux iOS开发 开发者
Qt问题(二):无法定位程序输入点于动态链接库
动态链接库(Dynamic Link Library,简称DLL)是一种可执行文件格式,常见于Windows操作系统中,而在Linux和macOS等其他操作系统中,相似的概念通常被称为共享库(Shared Library)。动态链接库允许程序在运行时加载所需的代码和数据,而不是在编译时静态链接到应用程序中。这种方式带来了几个重要的优点:
526 3
|
5月前
|
Oracle 关系型数据库 Linux
讲解linux下的Qt如何编译oracle的驱动库libqsqloci.so
通过这一连串的步骤,可以专业且有效地在Linux下为Qt编译Oracle驱动库 `libqsqloci.so`,使得Qt应用能够通过OCI与Oracle数据库进行交互。这些步骤适用于具备一定Linux和Qt经验的开发者,并且能够为需要使用Qt开发数据库应用的专业人士提供指导。
180 1
讲解linux下的Qt如何编译oracle的驱动库libqsqloci.so
|
4月前
|
API 开发工具 C语言
C语言与图形界面:利用GTK+、Qt等库创建GUI应用。
C语言与图形界面:利用GTK+、Qt等库创建GUI应用。
246 0
|
6月前
|
存储 编解码 Ubuntu
【QT】linux下alsa库的移植和QT中音视频的处理&笔记
【QT】linux下alsa库的移植和QT中音视频的处理&笔记
|
5月前
|
机器学习/深度学习 人工智能 计算机视觉
好的资源-----打卡机+Arm+Qt+OpenCV嵌入式项目-基于人脸识别的考勤系统-----B站神经网络与深度学习,商城
好的资源-----打卡机+Arm+Qt+OpenCV嵌入式项目-基于人脸识别的考勤系统-----B站神经网络与深度学习,商城
|
6月前
Cmake构建Qt项目链接glog库
Cmake构建Qt项目链接glog库
|
7月前
|
编解码
qt中使用dll库的方法
qt中使用dll库的方法
109 2
|
7月前
|
存储
Qt更新组件出现(“要继续此操作,至少需要一个有效且已启用的储存库”)
Qt更新组件出现(“要继续此操作,至少需要一个有效且已启用的储存库”)
393 0
Qt更新组件出现(“要继续此操作,至少需要一个有效且已启用的储存库”)
|
7月前
|
编译器
正点原子IMX6ULL-安装交叉编译器、编译tslib触摸屏库、编译arm环境qt源代码
正点原子IMX6ULL-安装交叉编译器、编译tslib触摸屏库、编译arm环境qt源代码
243 0