VS2017+Qt5+Opencv3.4调用摄像头拍照并存储

yizhihongxing

VS2017+Qt5+Opencv3.4调用摄像头拍照并存储

本篇攻略旨在介绍如何通过VS2017+Qt5+Opencv3.4实现调用摄像头拍照并将图片保存到本地。

硬件准备

首先需要一台PC并接入摄像头。

软件准备

  • Visual Studio 2017
  • Qt5
  • OpenCV 3.4

工程创建

  1. 打开Visual Studio 2017,选择Create a new project,以Visual C++->Qt->Qt Widget Application的方式创建工程。

  2. 添加OpenCV库,首先在工程的属性中选择VC++ directories,在其中的Include Directories中加入OpenCV库的include路径,在Library Directories中加入OpenCV库的lib路径。

  3. 在Linker->Input->Additional Dependencies中添加OpenCV库的相关库文件。

  4. 在源文件中引入OpenCV库:

c++
#include "opencv2/opencv.hpp"

代码实现

  1. 创建摄像头捕获对象:

c++
cv::VideoCapture capture;
capture.open(0); //打开摄像头
if(!capture.isOpened()){
QMessageBox::critical(this,tr("Error"),tr("open camera failed!"));
return;
}

  1. 捕获摄像头当前帧:

c++
cv::Mat frame;
capture >> frame;

  1. 在Qt中显示当前帧:

c++
QImage img(frame.data, frame.cols, frame.rows, QImage::Format_RGB888);
ui->label->setPixmap(QPixmap::fromImage(img));

  1. 对当前帧进行处理,实现拍照功能:

```c++
cv::Mat frame_gray;
cv::cvtColor(frame,frame_gray,cv::COLOR_BGR2GRAY); //将帧转换为灰度图

// ...

capture.release(); //释放捕获对象
```

  1. 保存拍照后的图片到本地:

c++
cv::imwrite(filename,frame); //filename为图片保存的路径和名字

示例说明

下面是两条代码示例:

示例1:点击按钮实现拍照

void MainWindow::on_pushButton_clicked()
{
    cv::Mat frame;
    capture >> frame;
    QImage img(frame.data, frame.cols, frame.rows, QImage::Format_RGB888);
    ui->label->setPixmap(QPixmap::fromImage(img));

    captured_frame = frame.clone(); //将当前帧保存到变量中
}

示例2:通过定时器实现实时预览

void MainWindow::on_startButton_clicked()
{
    timer_camera->start(30); //定时器频率为30ms
}

void MainWindow::on_timer_camera_timeout()
{
    cv::Mat frame;
    capture >> frame;
    QImage img(frame.data, frame.cols, frame.rows, QImage::Format_RGB888);
    ui->label->setPixmap(QPixmap::fromImage(img));
}

总结

以上便是实现VS2017+Qt5+Opencv3.4调用摄像头拍照并存储的完整攻略。在代码实现过程中,需要注意Qt和OpenCV的数据类型转换问题。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:VS2017+Qt5+Opencv3.4调用摄像头拍照并存储 - Python技术站

(0)
上一篇 2023年6月26日
下一篇 2023年6月26日

相关文章

  • 什么是大数据?

    大数据的完整攻略主要分为以下几个阶段: 数据采集:从各种数据源(如数据库、文本文件、web日志、传感器设备等)中收集数据,并进行初步处理和清洗。数据采集阶段需要考虑数据来源的多样性、数据量的大小和数据的完整性等因素。 数据存储:将采集到的数据保存到大数据存储系统(如Hadoop HDFS、Cassandra、MongoDB等)中,以便后续使用和处理。数据存储…

    其他 2023年4月19日
    00
  • Android四大组件之Service服务详细讲解

    Android四大组件之Service服务详细讲解 什么是Service? Service是Android四大组件之一,它是在后台执行操作的组件,可以在不受用户干扰的情况下长时间运行。Service通常用于执行诸如下载、上传数据、播放音乐等耗时操作。 Service的分类 前台服务:与用户正在进行交互的Activity或者其他前台组件有关的服务。此类服务需要…

    other 2023年6月27日
    00
  • Linux kernel模块管理相关详解

    Linux kernel模块管理相关详解 本文将详细介绍Linux kernel模块管理相关内容,包括模块是什么、如何编写、如何编译、如何加载和卸载模块等。 什么是Linux kernel模块 Linux kernel模块是一段代码,它可以动态地加载和卸载到Linux内核中,以增加内核的功能。模块可以在不影响现有内核的情况下加入内核,并最终集成到内核中。通过…

    other 2023年6月27日
    00
  • C++ virtual destructor虚拟析构函数

    C++虚拟析构函数 引言 在C++中,如果一个类含有虚函数,那么通常也应该定义一个虚拟析构函数,否则在使用该类时可能会出现不可预知的问题。本文将详细介绍C++虚拟析构函数的相关内容。 析构函数 在C++中,每个类都可以拥有一个析构函数,它是一个特殊的函数,用于在对象被销毁时释放资源。如果未显式定义析构函数,则编译器将会生成默认析构函数。 以下是一个简单的析构…

    other 2023年6月26日
    00
  • Android自定义日历效果

    Android自定义日历效果攻略 在Android中,自定义日历效果可以通过自定义控件实现,主要包括以下几个步骤: 步骤一:选择实现方式 实现方式主要有两种: 自定义View,继承View或ViewGroup类,通过手动绘制日历视图来达到自定义效果; 使用第三方控件库,例如CalendarView、SmartCalendar等。 选择实现方式的时候需要考虑具…

    other 2023年6月25日
    00
  • python中读取txt文件时split()函数的妙用

    Python中读取txt文件时split()函数的妙用攻略 在Python中,我们经常需要读取文本文件并对其进行处理。split()函数是一个非常有用的方法,可以将字符串按照指定的分隔符进行拆分。下面是使用split()函数读取txt文件的详细攻略: 打开文件:首先,使用open()函数打开要读取的txt文件,并将其赋值给一个变量,如file。 python…

    other 2023年10月18日
    00
  • 流放之路3.2野蛮人酋长超载火旋风BD介绍 开荒后期BD攻略

    流放之路3.2野蛮人酋长超载火旋风BD介绍 简介 在流放之路3.2版本中,野蛮人酋长超载火旋风(Barbarian Chieftain Cyclone with Berserk)是一种强大的建议角色扮演(ARPG)构建。该构建利用野蛮人的强大生存能力和高爆发伤害,以火旋风技能为主要输出手段。本攻略将详细介绍该构建的技能配置、装备选择和技能使用策略。 技能配置…

    other 2023年8月5日
    00
  • 如何在JavaScript中正确处理变量

    如何在JavaScript中正确处理变量 在JavaScript中,正确处理变量是编写高质量代码的关键。以下是一些指导原则和示例,帮助您正确处理变量。 1. 使用适当的变量声明 在JavaScript中,有三种声明变量的方式:var、let和const。选择适当的声明方式可以确保变量的作用域和可变性得到正确处理。 使用var声明的变量具有函数作用域,意味着它…

    other 2023年8月9日
    00
合作推广
合作推广
分享本页
返回顶部