基于OPENCV3与QT5.6实现摄像头拍照并保存图片

环境是VS2013配置的QT5.6和OPENCV3.0。实现的功能是,通过OPENCV3开启摄像头,然后实时拍照并将照片保存起来。好了不说了直接上代码。

#include "displaypicture.h"
#include
#include
#include
#include
#include
using namespace cv;
QImage img;
DisplayPicture::DisplayPicture(QWidget *parent)
: QMainWindow(parent)
{
ui.setupUi(this);
}


DisplayPicture::~DisplayPicture()
{


}
void DisplayPicture::slot1()
{
//QString fileName = QFileDialog::getOpenFileName(this, tr("Open Image"),
//".", tr("Image Files (*.png *.jpg *.bmp)"));
//qDebug() << "filenames:" << fileName;
//Mat image = cv::imread(fileName.toUtf8().data());
VideoCapture capture(0);//打开摄像头
while (1)
{
Mat image;
capture >> image;//从摄像头逐帧读取图片,存入image
imshow("摄像头", image);

Mat rgb;
if (image.channels() == 3)//如果image是彩色图片
{
//cvt Mat BGR 2 QImage RGB
cvtColor(image, rgb, CV_BGR2RGB);//进行颜色空间转换,将RGB转换成BGR,因为QT的三基色是BGR,opencv的是RGB,转换后的图片存入rgb
img = QImage((const unsigned char*)(rgb.data),//对rgb图片处理成QImage 格式的图片,保存在img
rgb.cols, rgb.rows,
rgb.cols*rgb.channels(),
QImage::Format_RGB888);

}
else
{
img = QImage((const unsigned char*)(image.data),
image.cols, image.rows,
image.cols*image.channels(),
QImage::Format_RGB888);
}
//Mat dest(2, 2, CV_8UC3, Scalar(0, 0, 255));
//dest.copyTo(image);
//imwrite("保存图片.jpg", dest);
//imwrite("保存图片.jpg", img);
//ui.label->setPixmap(QPixmap::fromImage(img));
//ui.label->resize(ui.label->pixmap()->size());
waitKey(30);
}
}
void DisplayPicture::slot2()
{
img.save("F:\\SavePicture.jpg");//保存图片
}
void DisplayPicture::slot3()//显示保存图片
{
QString fileName = QFileDialog::getOpenFileName(this, tr("Open Image"),
".", tr("Image Files (*.png *.jpg *.bmp)"));
ui.label->setPixmap(QPixmap::fromImage(img));
ui.label->resize(ui.label->pixmap()->size());


}
void DisplayPicture::slot4()//边缘检测
{
Mat srcImage = imread("F:\\SavePicture.jpg");
Mat rayImage;
cvtColor(srcImage, rayImage, COLOR_BGR2GRAY);//彩色转换成灰度
blur(rayImage, rayImage, Size(7, 7));//模糊降噪
Canny(rayImage, rayImage, 0, 30, 3);//canny边缘检测
imshow("Canny边缘检测效果图", rayImage);
imwrite("Canny边缘检测效果图.jpg", rayImage);


}

具体说一下我的实现原理,首先打开摄像头获取摄像头拍的每帧图片,这时候获取的图片格式是Mat类型,我们要把它转换成QT中QImage格式,通过函数cvtColor(image, rgb, CV_BGR2RGB);//进行颜色空间转换,将RGB转换成BGR,因为QT的三基色是BGR,opencv的是RGB,转换后的图片存入rgb
img = QImage((const unsigned char*)(rgb.data),//对rgb图片处理成QImage 格式的图片,保存在img
rgb.cols, rgb.rows,
rgb.cols*rgb.channels(),
QImage::Format_RGB888);

这两个函数将OPENCV中的Mat类型图片转换成QT中QImage类型,这样我们就可以通过img.save("F:\\SavePicture.jpg");/函数直接保存图片。

看下效果图

基于OPENCV3与QT5.6实现摄像头拍照并保存图片_第1张图片

基于OPENCV3与QT5.6实现摄像头拍照并保存图片_第2张图片

你可能感兴趣的:(opencv3.0,qt5.6)