目录
前言
编辑
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 驱动。
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=armcortexa9-linux-gnueabihf-gcc --arch=arm --prefix=host --enable-shared --disable-static --disable-doc --disablex86asm --enable-ffplay
如果使用的是 64 位的系统,则使用 64 位的编译器:以下是信盈达 A53 开发板的配置:
./configure --cross-prefix=aarch64-linux- --cpu=cortex-a53 --disable-asm --enable-cross-compile --targetos=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里面是没有东西的,我们可以进去看一下。
cp include/lib* /home/xing/work/usbCamera/usbCamera/usbcamera/include/ -rf
2.4 拷贝 ffmpeg 下的 lib 到 usbcamera 下的 lib
操作几乎和拷贝include头文件一样。
2.5 将usbcamera库添加到我们的工程
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 出现如下问题
我们改成:
4.3 应用程序输出错误
出现这个错误是没有库,把库复制到开发板。注意先压缩后再复制。
修改后:
已经没有错误!
5. 摄像头使用
5.1 摄像头初始化
void Widget::cameraInit()
{
ui->widget->setCameraName("/dev/video0"); //设置摄像头设备的驱动节点
ui->widget->setInterval(120); //设置获取摄像头图像周期(ms),就是每隔多少 ms 获取一帧图像
ui->widget->open();//打开摄像头
}
修改后再次运行就可以了:
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);
}
完成!