基于qt+opencv数字图像处理实验一般步骤

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

基于qt+opencv数字图像处理实验一般步骤
基于QtCreator+openCV的数字图像处理实验一般步骤
一、新建Qt Widgets Application项目
二、设计应用界面
1.拖放所需控件
2.应用布局
3.修改界面各个对象的文本和名称
三、复制图像类型转换类单元文件到项目文件夹
Imageconversion是用于Qt图像对象类型与OpenCV图像对象类型直接的转换,是整理自网络,把这两个文件复制到项目文件夹下,方便使用。

四、在构建文件和有关文件头包含openCV库
1. 在项目文件“项目名称.pro”文件(*.pro 基本上是构建工程项目时由Qt 处理的第一个文件,这个文件称为Qt 项目文件,一个名为“qmake”的内部Qt 程序负责处理该文件最后添加如下指令语句:include(E:\openCV\opencv331.pri)
看起来是这样的:
其中opencv331.pri的文件含openCV包含路径和库文件路径,可以把这些路径信息直接一一写在Qt项目文件中,但是比较麻烦。

把这些路径信息统一写在一个文件里面,方便使用。

这个需要根据用户的实际安排情况调整,我的opencv331.pri文件内容如下:INCLUDEPATH+=E:\openCV\opencv331build\install\include LIBS+=E:\openCV\opencv331build\install\x86\mingw\bin\li bopencv_core331.dll
LIBS+=E:\openCV\opencv331build\install\x86\mingw\bin\libop encv_highgui331.dll LIBS+=
E:\openCV\opencv331build\install\x86\mingw\bin\libopenc v_imgcodecs331.dll
LIBS+=E:\openCV\opencv331build\install\x86\mingw\bin\li bopencv_imgproc331.dll LIBS+=
E:\openCV\opencv331build\install\x86\mingw\bin\libopenc v_features2d331.dll
LIBS+=E:\openCV\opencv331build\install\x86\mingw\bin\li bopencv_calib3d331.dll 2.在头文件中包含opencv、图像数据类型转换以及常用Qt控件
#include//Qt图像类,适用于屏显
#include//打开文件对话框
#include//文件信息类
#include//用于管理2D图形对象
#include//Qt字符串类
#include//弹出窗口类
#include//openCV头文件
#include//OpenCV头文件
#include"imageconversion.h"//图像数据类型转换
using namespace cv;
五、在mainwindow.h声明私有数据成员
1. 与图像读、写和显示有关的几个数据成员:
QGraphicsScene sceneL,sceneR,scene;//与QgraphicsView配合显示图像
QPixmap pixmapL,pixmapR,pixmap; //用于读、写图像
//以后参数根据需要定义
double a,b,c,d,nc,r,threshold;
enum
PointOperation{None=0,LinearExpand,NonLinearExpand,GrayIn vert,BitWise} pointOperation;
int fusionOperation;
void rotate_arbitrarily_angle(cv::Mat&src,cv::Mat&dst,float angle);
2. 在构造函数关联场景和图像显示对象
ui->srcGraphicsView->setScene(&srcScene);//关联场景和图形显示对象
ui->dstGraphicsView->setScene(&dstScene);
如下图:
六、定义动作控件槽函数
1.打开或关闭图像文件
if(ui->openButton->text()=="关闭图像"){
sceneL.clear();
ui->openButton->setText("打开图像");
ui->saveButton->setEnabled(false);
return;
}
QString fileName=QFileDialog::getOpenFileName( this,
"打开图像",
QDir::currentPath(),
"Images(*.png*.bmp*.jpg*.tif)");
if(!fileName.isNull()){
QFileInfo file(fileName);
if(pixmapL.load(file.absoluteFilePath())){ sceneL.clear();//清除原有图像信息
sceneL.addPixmap(pixmapL);
ui->openButton->setText("关闭图像");
ui->saveAsButton->setEnabled(false);
}
}
return;
2.保存图像
QString fileName=QFileDialog::getSaveFileName( this,
"保存图像",
QDir::currentPath(),
"Images(*.png*.bmp*.jpg*.tif)");
if(pixmap.save(fileName,0,100)) QMessageBox::information(this,
tr("OK"),
tr("保存成功"));
else
QMessageBox::information(this,
tr("NG"),
tr("保存失败"));
3.图像处理代码,以加法点运算为例
fusionOperation=ui->fusionBox->currentIndex();
if(fusionOperation==0){
ui->resulLable->setText("出错啦!");
QMessageBox::information(this,
tr("错误"),
tr("请选择算法"));
return;
}
//图像类型转换
ImageConversion imgConversion;
cv::Mat mat0=imgConversion.QPixmapToCvMat(pixmapL);
cv::Mat mat,img1,img2,img;
cvtColor(mat0,mat,CV_BGR2GRAY);//mat1,8位无符号数图像mat.convertTo(img1,CV_64FC1);//double类型图像,0~255,图像1 mat0=imgConversion.QPixmapToCvMat(pixmapR);
cvtColor(mat0,mat,CV_BGR2GRAY);//
mat.convertTo(img2,CV_64FC1);//double类型图像,0~255,图像2 switch(fusionOperation){
case1:
img=0.5*img1+0.5*img2;
ui->resulLable->setText("五五开融合结果图像");
break;
case2:
img=0.3*img1+0.7*img2;
ui->resulLable->setText("三七开融合结果图像");
break;
default:
break;
}
img.convertTo(mat,CV_8UC1);
pixmap=imgConversion.cvMatToQPixmap(mat);
scene.clear();
scene.addPixmap(pixmap);
ui->saveAsButton->setEnabled(true);
4.点运算处理代码
pointOperation=(enum
PointOperation)ui->pointOperationBox->currentIndex();
if(pointOperation==None){
ui->resulLable->setText("出错啦!");
QMessageBox::information(this,
tr("错误"),
tr("请选择算法"));
return;
}
ImageConversion imgConversion;
cv::Mat mat0=imgConversion.QPixmapToCvMat(pixmapL);
cv::Mat mat1,img1;
cvtColor(mat0,mat1,CV_BGR2GRAY);//mat1,8位无符号数图像mat1.convertTo(img1,CV_64FC1);//double类型图像
switch(pointOperation){
case LinearExpand:
//ui->aEdit->setValidator(new
QDoubleValidator(0.0,1.0,2,this));
a=ui->aEdit->text().toDouble();
b=ui->bEdit->text().toDouble();
c=ui->cEdit->text().toDouble();
d=ui->dEdit->text().toDouble();
for(int i=0;i<img1.rows;i++){< p="">
double*pixrow=img1.ptr(i);
for(int j=0;j<img1.cols;j++){< p="">
if(pixrow[j]<=a*255)
pixrow[j]=c*255;
else if(pixrow[j]>=b*255)
pixrow[j]=d*255;
else
pixrow[j]=c*255+(pixrow[j]-a*255)/(b-a)*(d-c)*255;
/********************************************
*if(img1.at(i,j)<=a*255)
img1.at(i,j)=c*255;
else if(img1.at(i,j)>=b*255)
img1.at(i,j)=d*255;
else
img1.at(i,j)=c+(img1.at(i,j)-a*255)/(b-a)*(d-c)*255;
*************************************************************** ******/
}
}
ui->resulLable->setText("线性扩展结果图像");
break;
case NonLinearExpand:
nc=ui->ncEdit->text().toDouble();
cv::log(img1/255+1.0,mat0);
img1=mat0*nc*255;
ui->resulLable->setText("非线性扩展结果图像");
break;
case GrayInvert:
img1=255-mat1;
ui->resulLable->setText("灰度倒置结果图像");
break;
case BitWise:
threshold=ui->thresholdEdit->text().toDouble();
for(int i=0;i<img1.rows;i++){< p="">
double*pixrow=img1.ptr(i);
for(int j=0;j<img1.cols;j++){< p="">
if(pixrow[j]>=threshold*255)
pixrow[j]=255;
else
pixrow[j]=0;
}
}
ui->resulLable->setText("二值化结果图像");
break;
default:
break;
}
img1.convertTo(mat1,CV_8UC1);
pixmap=imgConversion.cvMatToQPixmap(mat1);
scene.clear();
scene.addPixmap(pixmap);
ui->saveAsButton->setEnabled(true);
5.图像旋转代码
/************************************************************** ***
*
*以下代码来自csdn上“笨笨的小棒棒”的个人博客:
*https:///u013263891/article/details/8393247 9
*在此对作者表示感谢!
*************************************************************** **/
void
MainWindow::rotate_arbitrarily_angle(cv::Mat&src,cv::Mat&dst,fl oat angle) {
float radian=(float)(angle/180.0*CV_PI);
//填充图像
int maxBorder=(int)(max(src.cols,src.rows)* 1.414);//即为sqrt(2)*max int dx=(maxBorder-src.cols)/2;
int dy=(maxBorder-src.rows)/2;
copyMakeBorder(src,dst,dy,dy,dx,dx,BORDER_CONSTANT);
//旋转
Point2f center((float)(dst.cols/2),(float)(dst.rows/2));
Mat affine_matrix=getRotationMatrix2D(center,angle, 1.0);//求得旋转矩阵warpAffine(dst,dst,affine_matrix,dst.size());
//计算图像旋转之后包含图像的最大的矩形
float sinVal=abs(sin(radian));
float cosVal=abs(cos(radian));
Size targetSize((int)(src.cols*cosVal+src.rows*sinVal),
(int)(src.cols*sinVal+src.rows*cosVal));
//剪掉多余边框
int x=(dst.cols-targetSize.width)/2;
int y=(dst.rows-targetSize.height)/2;
Rect rect(x,y,targetSize.width,targetSize.height);
dst=Mat(dst,rect);
}
七、如何修改QtCreator应用程序名称
修改*.pro文件名称,以及*.pro文件内“TARGET”项的值
八、常用
1.对象命名用词
(1)打开open
(2)保存save
(3)拉伸stretch
(4)平滑smooth
(5)锐化sharpen
(6)增强enhancement
(7)恢复restore
(8)分割Segment
2.常用openCV函数
(1)直方图均衡化
Void equalizeHist(InputArray src, OutputArray dst);
(2)OpenCV 中获取图像或矩阵最大、最小值
C++: void minMaxLoc(InputArray src, double* minVal, double* maxVal=0, Point* minLoc=0, Point* maxLoc=0, InputArray mask=noArray() )
C++: void minMaxLoc(const SparseMat& a, double* minVal, double* maxVal, int*minIdx=0, int*maxIdx=0 )
</img1.cols;j++){<>
</img1.rows;i++){<>
</img1.cols;j++){<>
</img1.rows;i++){<>。

相关文档
最新文档