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

1. Qt的ui界面,找着画就好

2.头文件直接贴出,之后有时间慢慢解释吧

#pragma once

#include <QtWidgets/QWidget>
#include "ui_camaraGet.h"

#ifndef CAMARAGET_H
#define CAMARAGET_H

#include <opencv2\core\core.hpp>
#include <QWidget>
#include <QImage>
#include <QTimer>     // 设置采集数据的间隔时间

#include <QGraphicsScene>
#include <QGraphicsView>  

#include <highgui/highgui_c.h>  //包含opencv库头文件

#include <opencv2\imgproc\imgproc.hpp>
#include <opencv2\core\core.hpp>
#include <opencv2\highgui\highgui.hpp>  //opencv申明

#include <opencv/cv.hpp>
using namespace cv;

namespace Ui {
	class camaraGet;
}

class camaraGet : public QWidget
{
	Q_OBJECT

public:
	explicit camaraGet(QWidget *parent = 0);
	~camaraGet();

private slots:
	void openCamara();      // 打开摄像头
	void getFrame();       // 读取当前帧信息
	void closeCamara();     // 关闭摄像头。
	void takingPictures();  // 拍照

private:
	Ui::camaraGet ui;
	QTimer    *timer;
	QImage    *imag;
	CvCapture *cam;// 视频获取结构, 用来作为视频获取函数的一个参数
	IplImage  *frame;
	VideoCapture capture1;
	Mat showimage;
	QImage Mat2Qimage(Mat cvImg);

//	camaraGet(QWidget * parent);
	//申请IplImage类型指针,就是申请内存空间来存放每一帧图像
};

#endif // CAMARAGET_H

3.源文件

#pragma once

#include <QtWidgets/QWidget>
#include "ui_camaraGet.h"

#ifndef CAMARAGET_H
#define CAMARAGET_H

#include <opencv2\core\core.hpp>
#include <QWidget>
#include <QImage>
#include <QTimer>     // 设置采集数据的间隔时间
#include "camaraGet.h"
#include<stdlib.h>
#include<random>
using namespace cv;
using namespace std;

camaraGet::camaraGet(QWidget *parent):
	QWidget(parent)
{
    ui.setupUi(this);
	connect(ui.pushButton, SIGNAL(clicked()), this, SLOT(openCamara()));
	connect(ui.pushButton_2, SIGNAL(clicked()), this, SLOT(takingPictures()));
	connect(ui.pushButton_3, SIGNAL(clicked()), this, SLOT(closeCamara()));
	setWindowTitle(tr("Main Window"));

	timer = new QTimer(this);
	imag = new QImage();
	connect(timer, SIGNAL(timeout()), this, SLOT(getFrame()));//超时就读取当前摄像头信息
}
camaraGet::~camaraGet()
{

}

void camaraGet::openCamara()
{
	capture1.open(1);                                            //打开摄像头,从摄像头中获取视频
	timer->start(10);

}

void camaraGet::getFrame() {
	capture1 >> showimage;
	QImage imag = Mat2Qimage(showimage);

	ui.label_2->setScaledContents(true);
	ui.label_2->setPixmap(QPixmap::fromImage(imag));
}

void camaraGet::closeCamara()
{
	timer->stop();
	ui.label->clear();
	capture1.release();
}

string strRand(int length) {			// length: 产生字符串的长度
	char tmp;							// tmp: 暂存一个随机数
	string buffer;						// buffer: 保存返回值

	random_device rd;					// 产生一个 std::random_device 对象 rd
	default_random_engine random(rd());	// 用 rd 初始化一个随机数发生器 random

	for (int i = 0; i < length; i++) {
		tmp = random() % 36;
		if (tmp < 10) {
			tmp += '0';
		}
		else {
			tmp -= 10;
			tmp += 'A';
		}
		buffer += tmp;
	}
	return buffer;
}

void camaraGet::takingPictures()
{
	capture1.open(1);
	capture1 >> showimage;
	QImage img = Mat2Qimage(showimage);
	ui.label->setScaledContents(true);
	ui.label->setPixmap(QPixmap::fromImage(img));

	string writePath = "../tempPhoto/";
	string name;
	int i = 0;
	name = writePath + strRand(4) + ".jpg";
	imwrite(name, showimage);
	i++;

}

QImage camaraGet::Mat2Qimage(Mat cvImg)
{
	// 8-bits unsigned, NO. OF CHANNELS = 1
	if (cvImg.type() == CV_8UC1)
	{
		QImage image(cvImg.cols, cvImg.rows, QImage::Format_Indexed8);
		// Set the color table (used to translate colour indexes to qRgb values)
		image.setColorCount(256);
		for (int i = 0; i < 256; i++)
		{
			image.setColor(i, qRgb(i, i, i));
		}
		// Copy input Mat
		uchar *pSrc = cvImg.data;
		for (int row = 0; row < cvImg.rows; row++)
		{
			uchar *pDest = image.scanLine(row);
			memcpy(pDest, pSrc, cvImg.cols);
			pSrc += cvImg.step;
		}
		return image;
	}
	// 8-bits unsigned, NO. OF CHANNELS = 3
	else if (cvImg.type() == CV_8UC3)
	{
		// Copy input Mat
		const uchar *pSrc = (const uchar*)cvImg.data;
		// Create QImage with same dimensions as input Mat
		QImage image(pSrc, cvImg.cols, cvImg.rows, cvImg.step, QImage::Format_RGB888);
		return image.rgbSwapped();
	}
	else if (cvImg.type() == CV_8UC4)
	{
//		qDebug() << "CV_8UC4";
		// Copy input Mat
		const uchar *pSrc = (const uchar*)cvImg.data;
		// Create QImage with same dimensions as input Mat
		QImage image(pSrc, cvImg.cols, cvImg.rows, cvImg.step, QImage::Format_ARGB32);
		return image.copy();
	}
	else
	{
//		qDebug() << "ERROR: Mat could not be converted to QImage.";
		return QImage();
	}
}

#include <QGraphicsScene>
#include <QGraphicsView>  

#include <highgui/highgui_c.h>  //包含opencv库头文件

#include <opencv2\imgproc\imgproc.hpp>
#include <opencv2\core\core.hpp>
#include <opencv2\highgui\highgui.hpp>  //opencv申明

#include <opencv/cv.hpp>
using namespace cv;

namespace Ui {
	class camaraGet;
}

class camaraGet : public QWidget
{
	Q_OBJECT

public:
	explicit camaraGet(QWidget *parent = 0);
	~camaraGet();

private slots:
	void openCamara();      // 打开摄像头
	void getFrame();       // 读取当前帧信息
	void closeCamara();     // 关闭摄像头。
	void takingPictures();  // 拍照

private:
	Ui::camaraGet ui;
	QTimer    *timer;
	QImage    *imag;
	CvCapture *cam;// 视频获取结构, 用来作为视频获取函数的一个参数
	IplImage  *frame;
	VideoCapture capture1;
	Mat showimage;
	QImage Mat2Qimage(Mat cvImg);

//	camaraGet(QWidget * parent);
	//申请IplImage类型指针,就是申请内存空间来存放每一帧图像
};

#endif // CAMARAGET_H

4.运行效果

完整项目下载:QtWidgetsApplication2_jb51.rar

到此这篇关于VS2017+Qt5+Opencv3.4调用摄像头拍照并存储的文章就介绍到这了,更多相关Qt5 Opencv3.4拍照并存储内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • 利用python、tensorflow、opencv、pyqt5实现人脸实时签到系统

    基于python opencv人脸识别的签到系统前言先看下效果实现的功能开始准备页面的构建功能实现代码部分总结 前言 一个基于opencv人脸识别和TensorFlow进行模型训练的人脸实时签到系统,作者某二本大学里的末流学生,写于2019/09/,python学习期间. 今年7月份开始接触python的,最近闲着无事就开始做了这个人脸识别的系统,一开始的话就想着简单的弄下,就去了百度智能云用的api接口实现的,写完以后我就想为什么我不自己写一个人脸识别签到,不去调用百度api接口,然后就诞生了

  • PyQt5+Caffe+Opencv搭建人脸识别登录界面

    最近开始学习Qt,结合之前学习过的caffe一起搭建了一个人脸识别登录系统的程序,新手可能有理解不到位的情况,还请大家多多指教. 我的想法是用opencv自带的人脸检测算法检测出面部,利用caffe训练好的卷积神经网络来提取特征,通过计算当前检测到的人脸与已近注册的所有用户的面部特征之间的相似度,如果最大的相似度大于一个阈值,就可以确定当前检测到的人脸对应为这个相似度最大的用户了. ###Caffe人脸识别 因为不断有新的用户加入,然而添加新用户后重新调整CNN的网络结构太费时间,所以不能用CN

  • VS2015+Qt5+OpenCV3开发环境配置

    本文介绍如何使用VS2015作为编译开发环境,调用OpenCV3.31和Qt5.9.1写图像处理的GUI. 1.目录结构 假设我们要创建一个名为VideoZoom的工程,那么首先按下图构建目录结构,在bin文件夹中存放可执行文件,lib文件夹中放入opencv_world331d.lib,include文件夹下粘贴opencv与opencv2两个文件夹. 2.打开VS2015开始新建工程 这里默认选了三个,如果要用的别的,自行勾选 后面一路next即可. 右键VideoZoom选择Propert

  • opencv+pyQt5实现图片阈值编辑器/寻色块阈值利器

    定位色块常用到hsv色彩空间下的颜色阈值,笔者曾经用openmv时,其IDE有自带一个阈值编辑器,使用起来非常方便,现在在linux上跑cv算法,需要类似的功能,因此自己写了一个阈值编辑器. 目前暂时只支持HSV色彩空间下的阈值编辑. 代码: mian.py: from threshold_ui import Ui_Widget from PyQt5.QtWidgets import QApplication from PyQt5.QtGui import QImage,QPixmap,QFon

  • Python+OpenCV+pyQt5录制双目摄像头视频的实例

    起因 说起来录制视频,我们可能有很多的软件,但是比较坑的是,好像很少的软件支持能够同时录制两个摄像头的视频,于是我们用python自己写一个.要是OpenCV+python.貌似很简单就能OK的事情,但是,我们的项目不是一般要展示给老师看嘛.谁愿意看一个没有界面的录制过程是吧~,最后会附上源代码~ 依赖的包 在这里,我直接把import的包写出来了各位可以进行对号入座,然后就能知道需要安装哪个包啦! import cv2 import numpy as np from PyQt5.QtWidge

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

    1. Qt的ui界面,找着画就好 2.头文件直接贴出,之后有时间慢慢解释吧 #pragma once #include <QtWidgets/QWidget> #include "ui_camaraGet.h" #ifndef CAMARAGET_H #define CAMARAGET_H #include <opencv2\core\core.hpp> #include <QWidget> #include <QImage> #incl

  • Android实现调用摄像头拍照并存储照片

    目录 1.前期准备 2.主要方法 1.需要使用Intent调用摄像头 2.需要检查SD卡(外部存储)状态 3.获取图片及其压缩图片 3.案例展示 1.Layout 2.MainActivity 1.前期准备 需要在Manifest中添加相关权限 <uses-permission android:name="android.permission.CAMERA" /> <uses-feature android:name="android.hardware.ca

  • Android实现调用摄像头拍照与视频功能

    应用场景: 在Android开发过程中,有时需要调用手机自身设备的功能,上篇文章主要侧重摄像头拍照功能的调用.本篇文章将综合实现拍照与视频的操作. 知识点介绍: 该部分请阅读 [Android 调用摄像头功能] 使用方式: 第一步: 新建一个Android项目CameraPhotoVedio,包含两个Activity: MainActivity.CameraActivity. 第二步: activity_main.xml <RelativeLayout xmlns:android="htt

  • Android调用摄像头拍照开发教程

    现在很多应用中都会要求用户上传一张图片来作为头像,首先我在这接收使用相机拍照和在相册中选择图片.接下来先上效果图: 接下来看代码: 1.布局文件: <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schem

  • C#使用Aforge调用摄像头拍照的方法

    本文实例为大家分享了C#使用Aforge调用摄像头拍照的具体代码,供大家参考,具体内容如下 一.新建一个Winform项目 二.使用Nuget添加引用 安装下图中红色框住的两个程序包 安装完后发现安装了如下图的程序包,这是因为上述两个程序包存在对其它程序包的依赖. 三.编写程序 1.窗体设计,摄像头是下拉列表(cmbCamera,控件命名,下同),虽然示例只用到一个摄像头,但是该Demo可用于多个摄像头间切换场景,分辨率是下拉列表(cmbResolution),列出摄像头所支持的分辨率,一个Vi

  • Androidstudio调用摄像头拍照并保存照片

    本文实例为大家分享了Androidstudio调用摄像头拍照并保存照片的具体代码,供大家参考,具体内容如下 首先在manifest.xmlns文件中声明权限 <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android"     package="com.example

  • Android实现调用摄像头进行拍照功能

    现在Android智能手机的像素都会提供照相的功能,大部分的手机的摄像头的像素都在1000万以上的像素,有的甚至会更高.它们大多都会支持光学变焦.曝光以及快门等等. 下面的程序Demo实例示范了使用Camera v2来进行拍照,当用户按下拍照键时,该应用会自动对焦,当对焦成功时拍下照片. layout/activity_main.xml界面布局代码如下: <?xml version="1.0" encoding="utf-8"?> <manifes

  • Android调用系统摄像头拍照并显示在ImageView上

    简介 现在市面上的apk只要涉及用户中心都会有头像,而且这个头像也是可自定义的,有的会采取读取相册选择其中一张作为需求照片,另一种就是调用系统摄像头拍照并获取即时照片,本博文就是讲述如何调用摄像头拍照并显示在指定的控件上. 先来看看效果图 由于这里我用的是模拟器没有摄像头,所以拍照是黑的,至于里面2个红色圆圈那是Genymotion自带的标志. 实现起来比较简单: activity_main.xml <?xml version="1.0" encoding="utf-8

  • C#调用摄像头实现拍照功能的示例代码

    前言 老师要求我们学生做一套拍照身份验证系统,经过长时间的学习,有了这篇文章,希望能帮到读者们. 正文 首先介绍本文的主角:AForge 创建一个C#项目,引用必备的几个DLL AForge.dll AForge.Controls.dll AForge.Imaging.dll AForge.Math.dll AForge.Video.DirectShow.dll AForge.Video.dll 这些DLL读者们可以在文末下载我附带的Demon 引用必要的命名空间 using AForge.Co

  • python实现调用摄像头并拍照发邮箱

    项目地址: https://github.com/flygaga/camera 思路 1.通过opencv调用摄像头拍照保存图像到本地 2.用email库构造邮件内容,保存图片以附件形式插入邮件内容 3.用smtplib库发送邮件到指定邮箱 4.生成 .exe 文件 5.设置开机自启(每次开机自动运行,启动相机,拍下照片发送到指定邮箱) 导入工具 import cv2 # pip install opencv-python -i {指定镜像源} 控制摄像头 from email.mime.ima

随机推荐