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

目录

前言

​编辑 

1. 交叉编译 ffmpeg

 1.1 先拿到ffmpeg的压缩包

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

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

1.5 make 

1.6 make install

2.usbcame库使用 

  2.1 获取usbcame库并解压

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

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

2.4  拷贝 ffmpeg 下的 lib 到 usbcamera 下的 lib

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

3.Qwidget 的类提升 USBCameraWidget

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

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

4 .编译 

4.1 编译

 4.2 出现如下问题 

4.3 应用程序输出错误 

5. 摄像头使用 

  5.1 摄像头初始化

5.2 拍照 

5.3 显示标签


前言

   为什么不用 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 位系统的编译方法。

嵌入式 QT usb camera库驱动摄像头_第1张图片 

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 文件添加即可

 嵌入式 QT usb camera库驱动摄像头_第2张图片

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

3.Qwidget 的类提升 USBCameraWidget

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

嵌入式 QT usb camera库驱动摄像头_第3张图片

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

嵌入式 QT usb camera库驱动摄像头_第4张图片


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 文件中
嵌入式 QT usb camera库驱动摄像头_第5张图片

我们改成:

嵌入式 QT usb camera库驱动摄像头_第6张图片 

4.3 应用程序输出错误 

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

嵌入式 QT usb camera库驱动摄像头_第7张图片 修改后:

嵌入式 QT usb camera库驱动摄像头_第8张图片 

已经没有错误!


5. 摄像头使用 

  5.1 摄像头初始化

void Widget::cameraInit()
{
 ui->widget->setCameraName("/dev/video0"); //设置摄像头设备的驱动节点
 ui->widget->setInterval(120); //设置获取摄像头图像周期(ms),就是每隔多少 ms 获取一帧图像
 ui->widget->open();//打开摄像头
}
出现以下错误,原因是使用了 64 位的编译器,需要定义宏
嵌入式 QT usb camera库驱动摄像头_第9张图片

嵌入式 QT usb camera库驱动摄像头_第10张图片 修改后再次运行就可以了:

嵌入式 QT usb camera库驱动摄像头_第11张图片 

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=" <

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);
}

完成!

你可能感兴趣的:(全栈,C++,嵌入式,qt,ffmpeg,开发语言)