OpenCV(4):利用VideoCapture类和笔记本自带摄像头制作一个可以拍照并保存的界面。

在尝试了cvCreateCapture类失败后(只能打开摄像头,但屏幕显示为灰色),我找到了可以使用的VideoCapture类。

注:具体头文件和ui设计可以根据自己喜好。

.h文件

#pragma once


#include 
#include 

#include 
#include 
#include 
#include                   //graphicsview类
#include
#include 
#include   //opencv申明
#include   
#include "QtGuiApplication.h"
#include "ui_Widget_Cj.h"


class CaiJi:public QMainWindow{

	Q_OBJECT


public:	
	CaiJi(QWidget *parent = Q_NULLPTR);


public slots:
	void on_Open_Crm_clicked();
	void on_Return_Cai_clicked();
	void on_Close_Crm_clicked();
	void readFarme();				//读取帧信息
	void on_Pic_Crm_clicked();
	void on_Save_Crm_clicked();

private:
	Ui::Form ui;
	QTimer *timer;
	QImage *imag;
	VideoCapture cap;
	Mat frame;
	Mat frame_photo;
	Mat frame_error;
};

.cpp文件

#include "CaiJi.h"
#include "ui_Widget_Cj.h"
#include "QtMainWin.h"

using namespace cv;
using namespace std;

CaiJi::CaiJi(QWidget *parent)
	: QMainWindow(parent)
{
	ui.setupUi(this);
	timer = new QTimer(this);
	imag = new QImage();	
	
	frame_error = imread("D:\\PicPro\\PictureLib\\NotOpen.jpg");						//×的图片
	cv::resize(frame_error, frame_error, Size(300, 300));
	QImage image_error = QImage((uchar*)(frame_error.data), frame_error.cols, frame_error.rows, QImage::Format_RGB888).rgbSwapped();
	ui.label_1->setPixmap(QPixmap::fromImage(image_error));

	connect(timer, SIGNAL(timeout()), this, SLOT(readFarme()));  // 时间到,读取当前摄像头信息
}


void CaiJi::on_Open_Crm_clicked()
{
	timer->start(33);
	cap.open(0);
}

void CaiJi::on_Close_Crm_clicked()
{
	timer->stop();
	frame_error = imread("D:\\PicPro\\PictureLib\\NotOpen.jpg");						//×的图片


	cap.release();
}

void CaiJi::readFarme()
{
	cap >> frame;
	QImage image = QImage((uchar*)(frame.data), frame.cols, frame.rows, QImage::Format_RGB888).rgbSwapped();
	ui.label_1->setPixmap(QPixmap::fromImage(image));
}

void CaiJi::on_Pic_Crm_clicked()
{
	if (!cap.isOpened())
		return;
	
	cap >> frame_photo;
	QImage image = QImage((uchar*)(frame_photo.data), frame_photo.cols, frame_photo.rows, QImage::Format_RGB888).rgbSwapped();

	ui.label_2->setPixmap(QPixmap::fromImage(image));   
}

void CaiJi::on_Save_Crm_clicked()
{

	if (frame_photo.empty())
		return;

	QString filename = QFileDialog::getSaveFileName(this, tr("Save Image"), "", tr("Images (*.png *.bmp *.jpg)")); //选择路径

	string fileAsSave = filename.toStdString();
	if (filename.isEmpty())
	{
		return;
	}

	imwrite(fileAsSave, frame_photo);

}

void CaiJi::on_Return_Cai_clicked()				//返回主界面
{
	QtMainWin *w = new QtMainWin(this);
	w->show();
	this->hide();
}

效果图:

OpenCV(4):利用VideoCapture类和笔记本自带摄像头制作一个可以拍照并保存的界面。_第1张图片

总结:

1.学习了获取摄像头的方法,已经Qt中保存图片到指定目录的方法。

2.已经写完了简单的图像比较算法以及图像采集程序,那么可以开始着手实时监控的程序了。

 

 

你可能感兴趣的:(图像处理,Qt基础)