VS2017+Qt5+Opencv3.4調(diào)用攝像頭拍照并存儲(chǔ)
1. Qt的ui界面,找著畫(huà)就好
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(); // 打開(kāi)攝像頭 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); //打開(kāi)攝像頭,從攝像頭中獲取視頻 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(); // 打開(kāi)攝像頭 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語(yǔ)言用封裝方法實(shí)現(xiàn)飛機(jī)大戰(zhàn)游戲
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言用封裝方法實(shí)現(xiàn)飛機(jī)大戰(zhàn)游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-05-05通過(guò)實(shí)例詳解C語(yǔ)言函數(shù)返回值
函數(shù)的返回值是指函數(shù)被調(diào)用之后,執(zhí)行函數(shù)體中的程序段所取得的并返回給主調(diào)函數(shù)的值,下面這篇文章主要給大家介紹了關(guān)于C語(yǔ)言函數(shù)返回值的相關(guān)資料,需要的朋友可以參考下2022-01-01C語(yǔ)言菜鳥(niǎo)基礎(chǔ)教程之Hello World
C語(yǔ)言是一門通用計(jì)算機(jī)編程語(yǔ)言,應(yīng)用廣泛。C語(yǔ)言的設(shè)計(jì)目標(biāo)是提供一種能以簡(jiǎn)易的方式編譯、處理低級(jí)存儲(chǔ)器、產(chǎn)生少量的機(jī)器碼以及不需要任何運(yùn)行環(huán)境支持便能運(yùn)行的編程語(yǔ)言。2017-10-10C++ 構(gòu)造雙向鏈表的實(shí)現(xiàn)代碼
本篇文章是對(duì)C++中構(gòu)造雙向鏈表的實(shí)現(xiàn)代碼進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-05-05C語(yǔ)言設(shè)計(jì)前中后隊(duì)列實(shí)例代碼
隊(duì)列最主要的作用就是用來(lái)管理數(shù)據(jù)流的,防止數(shù)據(jù)因?yàn)閭鬏旑l率過(guò)快得不到及時(shí)處理而丟失,下面這篇文章主要給大家介紹了關(guān)于C語(yǔ)言設(shè)計(jì)前中后隊(duì)列的相關(guān)資料,需要的朋友可以參考下2021-12-12