第一次写CSDN博客,最近在做毕业设计,有空之余写了一个图片读存和简单OpenCV的边缘处理。最终实现了图片的读取,边缘检测,保存的功能。
本次采用Qt5.7(安装包名称为qt-opensource-windows-x86-mingw530-5.7.1.exe)与OpenCV3.1版本。两者环境的配置就不多说了。
一、界面设计
首先建立一个新工程mainWidget继承于QWidget类如图,在ui文件中建立如图所示的界面。
编译运行之后界面如下图,其实很简陋啦。
二、打开、显示图片
点击openBtn按钮,触发槽。代码如下:
void mainWidget::on_openBtn_clicked()
{
QString fileName = QFileDialog::getOpenFileName(
this, "打开图片",
".",
"图片 (*.bmp *.jpg *.pbm *.pgm *.png *.ppm *.xbm *.xpm);;所有文件(*.*)");
if(fileName != "")
{
if(image->load(fileName))
{
QGraphicsScene *scene = new QGraphicsScene;
scene->addPixmap(QPixmap::fromImage(*image));
ui->formerView->setScene(scene);
ui->formerView->resize(image->width() + 10, image->height() + 10);
ui->formerView->show();
}
else
{
QMessageBox::information(this,
tr("打开图像失败"),
tr("打开图像失败!"));
delete image; return;
}
}
}三、OpenCV的简单实现、处理
此段代码摘自毛星云的《OpenCV3编程入门》,只是简单的利用了一下Canny算子进行边缘检测。
Mat mainWidget ::Canny_check()
{
//载入原始图
cv::Mat srcImage;
srcImage = QImage2Mat(*image);
//----------------------------------------------------------------------------------
// 高阶的canny用法,转成灰度图,降噪,用canny,最后将得到的边缘作为掩码,拷贝原图到效果图上,得到彩色的边缘图
//----------------------------------------------------------------------------------
Mat dstImage,edge,grayImage;
// 【1】创建与src同类型和大小的矩阵(dst)
dstImage.create( srcImage.size(), srcImage.type() );
// 【2】将原图像转换为灰度图像
cvtColor( srcImage, grayImage, COLOR_BGR2GRAY );
// 【3】先用使用 3x3内核来降噪
blur( grayImage, edge, Size(3,3) );
// 【4】运行Canny算子
Canny( edge, edge, 3, 9,3 );
//【5】将g_dstImage内的所有元素设置为0
dstImage = Scalar::all(0);
//【6】使用Canny算子输出的边缘图g_cannyDetectedEdges作为掩码,来将原图g_srcImage拷到目标图g_dstImage中
srcImage.copyTo( dstImage, edge);
return dstImage;
}处理槽(边缘检测按钮)如下:
void mainWidget::on_disposeBtn_clicked()
{
Mat resultmat = Canny_check();//resultmat完整!
resultimage = Mat2QImage(resultmat);//将mat格式转换为Qimage格式
// ui->label->setPixmap(QPixmap::fromImage(resultimage));//将结果在label上显示
QGraphicsScene *scene = new QGraphicsScene;
scene->addPixmap(QPixmap::fromImage(resultimage));
ui->resultView->setScene(scene);
ui->resultView->resize(resultimage.width()+10, resultimage.height()+10);
ui->resultView->show();
}其中,QImage2Mat函数和Mat2QImage函数这样的格式转化函数都需要自己编写。
四、保存处理后的图片
代码如下:
void mainWidget::on_saveBtn_clicked()
{
QString fileName = QFileDialog::getSaveFileName(
this, "保存图片",
".",
"图片 (*.jpg *.bmp *.pbm *.pgm *.png *.ppm *.xbm *.xpm);;所有文件(*.*)");
if(!fileName.isEmpty())
{
saveFile(fileName);
}
else
{
return;
}
}
bool mainWidget::saveFile(const QString &filename)
{
QFile file(filename);
if (!file.open(QIODevice::ReadWrite))
{
QMessageBox::warning(this,tr("保存文件"),tr("无法保存文件 %1:\n%2").arg(filename).arg(file.errorString()));
return false;
}
QByteArray ba;
QBuffer buffer(&ba);
buffer.open(QIODevice::WriteOnly);
resultimage.save(&buffer, "JPG");
file.write(ba);
QMessageBox::information(this,tr("保存文件"),tr("文件已保存至:\n%1").arg(filename));
return true;
}五、最终结果
六、需要改进的地方
本工程界面设计的graphicsView控件的布局不能灵活随着图片而变化。
源码在这里:http://download.csdn.net/detail/weixin_38334320/9815047