【Webcam设计】USB摄像头图片采集+QT显示

https://www.cnblogs.com/surpassal/archive/2012/12/22/zed_webcam_lab2.html

QT界面显示,将采集到的图像数据通过QT显示到HDMI显示器上。采集到图像数据存在QPixmap类的对象中,并通过QLabel显示出来。内容包括Qt Creator和Qt Embedded的安装、Qt工程的建立、摄像头采集实现、Qt运行库的生成以及使用方法。

软件代码

1、新建Qt工程

启动Qt Creator,新建一个Qt Gui应用
在这里插入图片描述

之后选择好工程路径和工程明,其他默认,一直点下一步直道工程建立结束。

2、修改ui界面

打开mainwindow.ui,进入可视化设计界面。默认情况中间的主设计区下已经有一个QMainWindow和QWidget的对象。我们需要将采集到图像显示到一个QLabel的部件上,从右侧的部件列表的“DisplayWidget”中选择“Label”部件拖动到中间,并将大小设置为640*480,起点坐标为(5,5)。

在这里插入图片描述并将原有的文本text取消。

在这里插入图片描述

这个时候这个Label部件已经把MainWindow遮蔽了,再把MainWindow的大小调整合适。

在这里插入图片描述
3、添加摄像采集代码

由于在 Webcam设计(一):USB摄像头(V4L2接口)的图片采集中我们已经实现了图片的采集,只需要工程中的v4l2grab.c和v4l2grab.h源文件添加到这个新工程中,并作相应修改即可。

在这里插入图片描述修改mainwindow.cpp

//@超群天晴 http://www.cnblogs.com/surpassal/
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QTimer>
#include <QPixmap>
#include <QImage>
#include <QPainter>
//#include <image.h>
#include <v4l2grab.h>

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    QPixmap pix;
    QByteArray aa ;

    BITMAPFILEHEADER   bf;
    BITMAPINFOHEADER   bi;
    //Set BITMAPINFOHEADER
    bi.biSize = 40;
    bi.biWidth = IMAGEWIDTH;
    bi.biHeight = IMAGEHEIGHT;
    bi.biPlanes = 1;
    bi.biBitCount = 24;
    bi.biCompression = 0;
    bi.biSizeImage = IMAGEWIDTH*IMAGEHEIGHT*3;
    bi.biXPelsPerMeter = 0;
    bi.biYPelsPerMeter = 0;
    bi.biClrUsed = 0;
    bi.biClrImportant = 0;


    //Set BITMAPFILEHEADER
    bf.bfType = 0x4d42;
    bf.bfSize = 54 + bi.biSizeImage;
    bf.bfReserved = 0;
    bf.bfOffBits = 54;

    if(init_v4l2() == FALSE)
    {
    }

    v4l2_grab();
    yuyv_2_rgb888();
    aa.append((char *)&bf,14);
    aa.append((char *)&bi,40);
    aa.append((char *)frame_buffer,640*480*3);
    pix.loadFromData(aa);
    ui->label->setPixmap(pix);
    close_v4l2();
}

MainWindow::~MainWindow()
{
    delete ui;
}

其中17~18行:

17     QPixmap pix;
18     QByteArray aa ;

定义了一个QPixmap类的对象pix,用来显示图片;由于调用QPixmap类的loadFromData()函数来获取传递图像数据,关于loadFromData()函数的详细信息可以在Qt的help->index中搜索到,或者从http://doc.qt.digia.com/4.7-snapshot/index.html中查询到:

bool QPixmap::loadFromData ( const QByteArray & data, const char * format = 0, Qt::ImageConversionFlags flags = Qt::AutoColor )

可以知道,loadFromData()要求输入参数为QByteArray类型,因而定义QByteArray的对象aa,用来存储图片数据。

同时,loadFromData()要求指定数据的格式。如果不指定,默认能支持的格式有:

在这里插入图片描述
是一个48~50行:

48     aa.append((char *)&bf,14);
49     aa.append((char *)&bi,40);
50     aa.append((char *)frame_buffer,640*480*3);

调用QByteArray类的append函数将图像数据存入aa中。需要注意的是,由于loadFromData函数需要输入的图像符合标准图片格式,因而需要把数据的BMP头信息也存入aa中。

52~53行:

51     pix.loadFromData(aa);
52     ui->label->setPixmap(pix);

实现了图片数据(包含头信息)向pix的传递和pix在label上的显示。

制作运行库

由于ubuntu的Qt运行库在/usr/local/Trolltech/Qt-4.7.3/下,由makefile可以看到引用运行库是

 INCPATH = -I/usr/local/Trolltech/Qt-4.7.3/mkspecs/default -I. -I/usr/local/Trolltech/Qt-4.7.3/include/QtCore -I/usr/local/Trolltech/Qt-4.7.3/include/QtNetwork -I/usr/local/Trolltech/Qt-4.7.3/include/QtGui -I/usr/local/Trolltech/Qt-4.7.3/include -I. -I. -I.

因此如果将编译后的可执行文件在arm上运行,也许早在相应的路径下找到运行库文件。Xilinx给出了Qt运行库镜像的制作方法:切换到qt-everywhere-opensource-src-4.7.3.tar.gz的解压路径,在控制台中输入

dd if=/dev/zero of=qt_lib_ext4.img bs=1M count=80
mkfs.ext4 -F qt_lib_ext4.img
chmod go+w qt_lib_ext4.img
mount qt_lib_ext4.img -o loop /mnt
cp -rf /usr/local/Trolltech/Qt-4.7.3/* /mnt
chmod go-w qt_lib_ext4.img
umount /mnt

即可。能找到生成的库文件镜像文件qt_lib_ext4.img,使用时将其挂载到

/usr/local/Trolltech/Qt-4.7.3/

即可。

挂载Qt运行库

在arm的linux文件系统中,创建目录

/usr/local/Trolltech/Qt-4.7.3/

使用

mkdir

命令一层一层建立目录。并将qt_lib_ext4.img挂载到

/usr/local/Trolltech/Qt-4.7.3/

下。

在这里插入图片描述

运行

使用命令

./lab2_qt_camera -qws

我们使用v4l2控制usb 摄像头,对摄像头的静态图片采集流程操作过程可以归纳:

在这里插入图片描述

您好,针对您的问题,可以通过以下步骤实现在树莓派上挂载两个USB摄像头,并同时实时显示画面: 1. 首先需要确定树莓派的USB接口数量,以确定可以连接的摄像头数量。 2. 将两个USB摄像头连接到树莓派的USB接口上,并启动树莓派。 3. 打开终端,输入以下命令安装视频播放软件 omxplayer: sudo apt-get update sudo apt-get install -y omxplayer 4. 打开终端,输入以下命令安装 motion 软件,motion 软件可以启动一个监控服务,允许您在需要时访问和播放USB摄像头的视频流: sudo apt-get install -y motion 5. 配置 motion 软件,输入以下命令编辑motion.conf文件: sudo nano /etc/motion/motion.conf 找到以下几行: # Set the video device (default /dev/video0). # You can use v4l2-ctl to get info about your devices. # Only one video device at a time can be used. video_device /dev/video0 # Target base directory for pictures and films # For motion to work correctly, this directory must # be writeable on the filesystem root partition target_dir /var/lib/motion 将以上两行修改为以下内容: video_device /dev/video0 width 640 height 480 framerate 15 text_changes off 同时添加以下两行: webcam_port 80 webcam_quality 50 保存并退出。 6. 启动 motion 服务,输入以下命令: sudo service motion start 7. 通过 web 浏览器访问您的树莓派 IP 地址和端口号 80(格式为 http://raspberrypi-address:80)。 这时,您应该能够看到连接的所有摄像头的实时视频流。 以上就是在树莓派上挂载两个USB摄像头,并且同时实时显示画面的方法。希望能对您有所帮助。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值