VS2017+Qt5+Opencv3.4調(diào)用攝像頭拍照并存儲(chǔ)
1. Qt的ui界面,找著畫就好


2.頭文件直接貼出,之后有時(shí)間慢慢解釋吧
#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> // 設(shè)置采集數(shù)據(jù)的間隔時(shí)間
#include <QGraphicsScene>
#include <QGraphicsView>
#include <highgui/highgui_c.h> //包含opencv庫(kù)頭文件
#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(); // 讀取當(dāng)前幀信息
void closeCamara(); // 關(guān)閉攝像頭。
void takingPictures(); // 拍照
private:
Ui::camaraGet ui;
QTimer *timer;
QImage *imag;
CvCapture *cam;// 視頻獲取結(jié)構(gòu), 用來(lái)作為視頻獲取函數(shù)的一個(gè)參數(shù)
IplImage *frame;
VideoCapture capture1;
Mat showimage;
QImage Mat2Qimage(Mat cvImg);
// camaraGet(QWidget * parent);
//申請(qǐng)IplImage類型指針,就是申請(qǐng)內(nèi)存空間來(lái)存放每一幀圖像
};
#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> // 設(shè)置采集數(shù)據(jù)的間隔時(shí)間
#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()));//超時(shí)就讀取當(dāng)前攝像頭信息
}
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: 產(chǎn)生字符串的長(zhǎng)度
char tmp; // tmp: 暫存一個(gè)隨機(jī)數(shù)
string buffer; // buffer: 保存返回值
random_device rd; // 產(chǎn)生一個(gè) std::random_device 對(duì)象 rd
default_random_engine random(rd()); // 用 rd 初始化一個(gè)隨機(jī)數(shù)發(fā)生器 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庫(kù)頭文件
#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(); // 讀取當(dāng)前幀信息
void closeCamara(); // 關(guān)閉攝像頭。
void takingPictures(); // 拍照
private:
Ui::camaraGet ui;
QTimer *timer;
QImage *imag;
CvCapture *cam;// 視頻獲取結(jié)構(gòu), 用來(lái)作為視頻獲取函數(shù)的一個(gè)參數(shù)
IplImage *frame;
VideoCapture capture1;
Mat showimage;
QImage Mat2Qimage(Mat cvImg);
// camaraGet(QWidget * parent);
//申請(qǐng)IplImage類型指針,就是申請(qǐng)內(nèi)存空間來(lái)存放每一幀圖像
};
#endif // CAMARAGET_H
4.運(yùn)行效果

完整項(xiàng)目下載:QtWidgetsApplication2_jb51.rar
到此這篇關(guān)于VS2017+Qt5+Opencv3.4調(diào)用攝像頭拍照并存儲(chǔ)的文章就介紹到這了,更多相關(guān)Qt5 Opencv3.4拍照并存儲(chǔ)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
解決C++ openCV無(wú)法讀取視頻但是可以讀取圖像的問(wèn)題記錄
在使用OpenCV的cv::VideoCapture讀取視頻文件時(shí),可能會(huì)遇到無(wú)法讀取特定格式,如MP4的視頻文件的問(wèn)題,本文介紹解決C++ openCV無(wú)法讀取視頻但是可以讀取圖像的問(wèn)題記錄,感興趣的朋友跟隨小編一起看看吧2024-09-09
C++ 中重載和運(yùn)算符重載加號(hào)實(shí)現(xiàn)矩陣相加實(shí)例代碼
這篇文章主要介紹了C++ 中重載和運(yùn)算符重載加號(hào)實(shí)現(xiàn)矩陣相加實(shí)例代碼的相關(guān)資料,需要的朋友可以參考下2017-03-03
C++ vector如何動(dòng)態(tài)申請(qǐng)內(nèi)存的元素
vector是一種動(dòng)態(tài)數(shù)組,本文主要介紹了C++ vector如何動(dòng)態(tài)申請(qǐng)內(nèi)存的元素,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-07-07
C++ 學(xué)習(xí)之旅 Windows程序內(nèi)部運(yùn)行原理
學(xué)習(xí)C++與.net不同的是,一定要搞清楚Windows程序內(nèi)部運(yùn)行原理,因?yàn)樗婕按蠖鄶?shù)是操作系統(tǒng)的調(diào)用,而.net畢竟是在.netFrameWork上唱戲2012-11-11
C語(yǔ)言實(shí)現(xiàn)字符轉(zhuǎn)unix時(shí)間戳的簡(jiǎn)單實(shí)例
下面小編就為大家?guī)?lái)一篇C語(yǔ)言實(shí)現(xiàn)字符轉(zhuǎn)unix時(shí)間戳的簡(jiǎn)單實(shí)例。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2016-06-06
gcc中extra qualification錯(cuò)誤的解決
今天小編就為大家分享一篇gcc中extra qualification錯(cuò)誤的解決,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-12-12

