opencv3.0的最简单图像系统,初学者参考代码
设计想法:
文件:
打开测试文件(lena.jpg)
打开自定义文件
还原
清除
退出
帮助:
版权说明
关于
翻转:
水平
垂直
水平垂直
形态:
腐蚀
膨胀
开运算
闭运算
Morphological Gradient(形态学梯度)
顶帽
黑帽
滤波:
均值滤波
方框滤波:归一化 非归一化
高斯滤波
中值滤波
双边滤波
缩放:
放大(PyrUp)
缩小(PyrDown)
放大(Resize)
缩小(Resize)
旋转:
顺时针无缩放
顺时针缩放
逆时针
零旋转缩放
槽:
//打开当前目录下的测试文件lena.jpg
void on_openLenaJpg_triggered();
//打开自定义文件
void on_openCustomeFile_triggered();
//还原图像,将标签“目标图像”内的图像替换为原始图像
void on_restoreFile_triggered();
//清除标签内图像
void on_CLEAR_triggered();
//退出系统
void on_exitSystem_triggered();
//版权说明
void on_copyright_triggered();
//关于
void on_about_triggered();
//临时测试用
//void on_action_triggered();
//水平翻转
void on_Horizen_triggered();
//垂直翻转
void on_vertical_triggered();
//水平垂直翻转
void on_horizenAndVertical_triggered();
//形态腐蚀
void on_Erosion_triggered();
//形态膨胀
void on_dialation_triggered();
//形态开运算
void on_opening_triggered();
//形态闭运算
void on_closing_triggered();
//Morphological Gradient
void on_actionMorphological_Gradient_triggered();
//形态顶帽
void on_topHat_triggered();
//形态黑帽
void on_blackHat_triggered();
//均值滤波
void on_normalizeFilter_triggered();
//方框滤波 归一化
void on_normalize_triggered();
//方框滤波 非归一化
void on_NoNormalize_triggreed();
//高斯滤波
void on_GaussFilter_triggered();
//中值滤波
void on_medianFilter_triggered();
//双边滤波
void on_bilateralFilter_triggered();
//缩放 放大(PyUp)
void on_PyrUpAction_triggered();
//缩放 缩小(PyDown)
void on_PyrDownAction_triggered();
//缩放 放大(Resize)
void on_ResizeUp_triggered();
//缩放 缩小(Resize)
void on_ResizeDown_triggered();
//旋转 顺时针无缩放
void on_cNresize_triggered();
//旋转 顺时针缩放
void on_cResize_triggered();
//旋转 逆时针
void on_antiClockwise_triggered();
//旋转 零旋转缩放
void on_NFlipResize_triggered();
//=========================================================================================
void MainWindow::on_openLenaJpg_triggered()
{
//菜单:文件=>打开测试文件lena.jpg
//使用imread读取当前路径下的"lena.jpg"
srcImage=cv::imread("lena.jpg");
if(!srcImage.data)
{
QMessageBox msgBox;
msgBox.setWindowTitle("测试文件不存在");
msgBox.setText(tr("默认的测试文件不存在,可以用一下两种方式的一种:1)"
"复制一个文件到当前目录下,并命名为lena.jpg;2使用自定义方式打开一个自定义文件。"));
msgBox.exec();
}
else
{
//将BGR转换为RGB,方便操作习惯
cv::cvtColor(srcImage,srcImage,CV_BGR2RGB);
img=QImage((const unsigned char*)(srcImage.data),srcImage.cols,srcImage.rows,srcImage.cols*srcImage.channels(),QImage::Format_RGB888);
ui->label1->clear();
img=img.scaled(ui->label1->width(),ui->label1->height());
ui->label1->setPixmap(QPixmap::fromImage(img));
}
}
void MainWindow::on_openCustomeFile_triggered()
{
//菜单:文件=>打开自定义文件
QString filename=QFileDialog::getOpenFileName(this,tr("打开自定义文件"),"",tr("Image File(*.bmp*.jpg*.jpge*.png)"));
QTextCodec *code=QTextCodec::codecForName("gb18030");
std::string name=code->fromUnicode(filename).data();
//读取文件
srcImage=cv::imread(name);
if(!srcImage.data)
{
QMessageBox msgBox;
msgBox.setWindowTitle("未找到数据");
msgBox.setText(tr("未找到数据"));
msgBox.exec();
}
else
{
//将BGR转换为RGB,方便操作习惯
cv::cvtColor(srcImage,srcImage,CV_BGR2RGB);
img=QImage((const unsigned char*)(srcImage.data),srcImage.cols,srcImage.rows,srcImage.cols*srcImage.channels(),QImage::Format_RGB888);
ui->label1->clear();
img=img.scaled(ui->label1->width(),ui->label1->height());
ui->label1->setPixmap(QPixmap::fromImage(img));
}
}
void MainWindow::on_restoreFile_triggered()
{
//菜单:文件=>复原
//复制srcImage到dstImage
srcImage.copyTo(dstImage);
img=QImage((const unsigned char*)(dstImage.data),dstImage.cols,dstImage.rows,dstImage.cols*dstImage.channels(),QImage::Format_RGB888);
img=img.scaled(ui->label1->size());
ui->label2->setPixmap(QPixmap::fromImage(img));
}
void MainWindow::on_CLEAR_triggered()
{
//菜单:文件=>清除
//清除标签1的内容
ui->label1->clear();
//清除标签2的内容
ui->label2->clear();
}
void MainWindow::on_exitSystem_triggered()
{
//菜单:文件=>退出
exit(0);
}
//====================================================================================
void MainWindow::on_copyright_triggered()
{
//版权
QMessageBox::information(this,"版权",tr("本软件为本群《技术交流群公用》"));
}
void MainWindow::on_about_triggered()
{
//关于
QMessageBox::information(this,"关于",tr("好好学习,把里面的BUG告诉我,谢谢!"));
}
//=====================================================================================
void MainWindow::on_Horizen_triggered()
{
//水平方向翻转
//参数值为1
cv::flip(srcImage,dstImage,1);
//显示图像
img=QImage((const unsigned char*)(dstImage.data),dstImage.cols,dstImage.rows,dstImage.cols*dstImage.channels(),QImage::Format_RGB888);
img=img.scaled(ui->label1->size());
ui->label2->setPixmap(QPixmap::fromImage(img));
}
void MainWindow::on_vertical_triggered()
{
//垂直方向翻转
//参数值为1
cv::flip(srcImage,dstImage,0);
//显示图像
img=QImage((const unsigned char*)(dstImage.data),dstImage.cols,dstImage.rows,dstImage.cols*dstImage.channels(),QImage::Format_RGB888);
img=img.scaled(ui->label1->size());
ui->label2->setPixmap(QPixmap::fromImage(img));
}
void MainWindow::on_horizenAndVertical_triggered()
{
//水平和垂直方向同时翻转
//参数值为-1
cv::flip(srcImage,dstImage,-1);
//显示图像
img=QImage((const unsigned char*)(dstImage.data),dstImage.cols,dstImage.rows,dstImage.cols*dstImage.channels(),QImage::Format_RGB888);
img=img.scaled(ui->label1->size());
ui->label2->setPixmap(QPixmap::fromImage(img));
}
//==================================================================================
void MainWindow::on_Erosion_triggered()
{
//腐蚀操作
//定义类型
int erosion_type;
erosion_type=MORPH_RECT;
//定义大小
int erosion_size=3;
//调用getStructuringElement函数
Mat element=getStructuringElement(erosion_type,Size(2*erosion_size+1,2*erosion_size+1),Point(erosion_size,erosion_size));
//调用腐蚀函数
erode(srcImage,dstImage,element);
//显示图像
img=QImage((const unsigned char*)(dstImage.data),dstImage.cols,dstImage.rows,dstImage.cols*dstImage.channels(),QImage::Format_RGB888);
img=img.scaled(ui->label1->size());
ui->label2->setPixmap(QPixmap::fromImage(img));
//imshow("erode",dstImage);
}
void MainWindow::on_dialation_triggered()
{
//膨胀
//定义大小
int dialation_size=2;
//定义类型
int dialation_type;
dialation_type=MORPH_RECT;
//调用getStructuringElement函数
Mat element=getStructuringElement(dialation_type,Size(2*dialation_size+1,2*dialation_size),Point(dialation_size,dialation_size));
//调用膨胀函数
dilate(srcImage,dstImage,element);
img=QImage((const unsigned char*)(dstImage.data),dstImage.cols,dstImage.rows,dstImage.cols*dstImage.channels(),QImage::Format_RGB888);
img=img.scaled(ui->label1->size());
ui->label2->setPixmap(QPixmap::fromImage(img));
//imshow("dialate",disImage);
}
void MainWindow::on_opening_triggered()
{
//开运算
//定义形状
int morph_elem=MORPH_RECT;
//定义大小
int morph_size=3;
//调用getStructuringElement函数
Mat element=getStructuringElement(morph_elem,Size(2*morph_size+1,2*morph_size),Point(morph_size,morph_size));
//调用morphologyEx函数
morphologyEx(srcImage,dstImage,MORPH_OPEN,element);
img=QImage((const unsigned char*)(dstImage.data),dstImage.cols,dstImage.rows,dstImage.cols*dstImage.channels(),QImage::Format_RGB888);
img=img.scaled(ui->label1->size());
ui->label2->setPixmap(QPixmap::fromImage(img));
}
void MainWindow::on_closing_triggered()
{
//闭运算
//定义形状
int morph_elem=MORPH_RECT;
//定义大小
int morph_size=3;
//调用getStructuringElement函数
Mat element=getStructuringElement(morph_elem,Size(2*morph_size+1,2*morph_size),Point(morph_size,morph_size));
//实现闭运算
morphologyEx(srcImage,dstImage,MORPH_CLOSE,element);
img=QImage((const unsigned char*)(dstImage.data),dstImage.cols,dstImage.rows,dstImage.cols*dstImage.channels(),QImage::Format_RGB888);
img=img.scaled(ui->label1->size());
ui->label2->setPixmap(QPixmap::fromImage(img));
}
void MainWindow::on_actionMorphological_Gradient_triggered()
{
//Morphological Gradient运算
//定义形状
int morph_elem=MORPH_RECT;
//定义大小
int morph_size=3;
//调用getStructuringElement函数
Mat element=getStructuringElement(morph_elem,Size(2*morph_size+1,2*morph_size),Point(morph_size,morph_size));
//实现Morphological Gradient
morphologyEx(srcImage,dstImage,MORPH_GRADIENT,element);
img=QImage((const unsigned char*)(dstImage.data),dstImage.cols,dstImage.rows,dstImage.cols*dstImage.channels(),QImage::Format_RGB888);
img=img.scaled(ui->label1->size());
ui->label2->setPixmap(QPixmap::fromImage(img));
}
void MainWindow::on_topHat_triggered()
{
//顶帽变换
//定义形状
int morph_elem=MORPH_RECT;
//定义大小
int morph_size=3;
//调用getStructuringElement函数
Mat element=getStructuringElement(morph_elem,Size(2*morph_size+1,2*morph_size),Point(morph_size,morph_size));
//实现Morphological Gradient
morphologyEx(srcImage,dstImage,MORPH_TOPHAT,element);
img=QImage((const unsigned char*)(dstImage.data),dstImage.cols,dstImage.rows,dstImage.cols*dstImage.channels(),QImage::Format_RGB888);
img=img.scaled(ui->label1->size());
ui->label2->setPixmap(QPixmap::fromImage(img));
}
void MainWindow::on_blackHat_triggered()
{
//黑帽变换
//定义形状
int morph_elem=MORPH_RECT;
//定义大小
int morph_size=3;
//调用getStructuringElement函数
Mat element=getStructuringElement(morph_elem,Size(2*morph_size+1,2*morph_size),Point(morph_size,morph_size));
//实现Morphological Gradient
morphologyEx(srcImage,dstImage,MORPH_BLACKHAT,element);
img=QImage((const unsigned char*)(dstImage.data),dstImage.cols,dstImage.rows,dstImage.cols*dstImage.channels(),QImage::Format_RGB888);
img=img.scaled(ui->label1->size());
ui->label2->setPixmap(QPixmap::fromImage(img));
}
//============================================================================================================
void MainWindow::on_normalizeFilter_triggered()
{
//均值滤波
//使用函数blur,设置默认值。根据需要可以调整为交互输入参数的形式
blur(srcImage,dstImage,Size(7,7),Point(-1,-1));
img=QImage((const unsigned char*)(dstImage.data),dstImage.cols,dstImage.rows,dstImage.cols*dstImage.channels(),QImage::Format_RGB888);
img=img.scaled(ui->label1->size());
ui->label2->setPixmap(QPixmap::fromImage(img));
}
void MainWindow::on_normalize_triggered()
{
//菜单:滤波=>方框滤波=>归一化
//调用boxFilter,使用默认参数,完成归一化
boxFilter(srcImage,dstImage,-1,Size(5,5));
img=QImage((const unsigned char*)(dstImage.data),dstImage.cols,dstImage.rows,dstImage.cols*dstImage.channels(),QImage::Format_RGB888);
img=img.scaled(ui->label1->size());
ui->label2->setPixmap(QPixmap::fromImage(img));
}
void MainWindow::on_NoNormalize_triggreed()
{
//菜单:滤波=>方框滤波=>非归一化
//调用boxFilter
//使用Size大小为Size(1,1)时,显示其原有图像
//Size大小超过Size(3,3),值全部超过255,在这里显示为全白色
boxFilter(srcImage,dstImage,-1,Size(3,3),Point(-1,-1),false);
img=QImage((const unsigned char*)(dstImage.data),dstImage.cols,dstImage.rows,dstImage.cols*dstImage.channels(),QImage::Format_RGB888);
img=img.scaled(ui->label1->size());
ui->label2->setPixmap(QPixmap::fromImage(img));
}
void MainWindow::on_GaussFilter_triggered()
{
//高斯滤波
//调用函数GaussianBlur
GaussianBlur(srcImage,dstImage,Size(7,7),0,0);
img=QImage((const unsigned char*)(dstImage.data),dstImage.cols,dstImage.rows,dstImage.cols*dstImage.channels(),QImage::Format_RGB888);
img=img.scaled(ui->label1->size());
ui->label2->setPixmap(QPixmap::fromImage(img));
}
void MainWindow::on_medianFilter_triggered()
{
//中值滤波
//调用函数medianBlur,参数采用默认值
medianBlur(srcImage,dstImage,7);
img=QImage((const unsigned char*)(dstImage.data),dstImage.cols,dstImage.rows,dstImage.cols*dstImage.channels(),QImage::Format_RGB888);
img=img.scaled(ui->label1->size());
ui->label2->setPixmap(QPixmap::fromImage(img));
}
void MainWindow::on_bilateralFilter_triggered()
{
//双边滤波
//电泳bilateralFilter
bilateralFilter(srcImage,dstImage,31,31*2,31/2);
img=QImage((const unsigned char*)(dstImage.data),dstImage.cols,dstImage.rows,dstImage.cols*dstImage.channels(),QImage::Format_RGB888);
img=img.scaled(ui->label1->size());
ui->label2->setPixmap(QPixmap::fromImage(img));
}
//===================================================================================================
void MainWindow::on_PyrUpAction_triggered()
{
//调用pyrUp实现放大效果
pyrUp(srcImage,dstImage,Size(srcImage.cols*2,srcImage.rows*2));
img=QImage((const unsigned char*)(dstImage.data),dstImage.cols,dstImage.rows,dstImage.cols*dstImage.channels(),QImage::Format_RGB888);
img=img.scaled(ui->label1->size());
ui->label2->setPixmap(QPixmap::fromImage(img));
}
void MainWindow::on_PyrDownAction_triggered()
{
//调用pyrDown实现缩放效果
pyrDown(srcImage,dstImage,Size(srcImage.cols/2,srcImage.rows/2));
img=QImage((const unsigned char*)(dstImage.data),dstImage.cols,dstImage.rows,dstImage.cols*dstImage.channels(),QImage::Format_RGB888);
img=img.scaled(ui->label1->size());
ui->label2->setPixmap(QPixmap::fromImage(img));
}
void MainWindow::on_ResizeUp_triggered()
{
//调用resize放大图像
cv::resize(srcImage,dstImage,Size(srcImage.cols*4,srcImage.rows*4),0,0,3);
img=QImage((const unsigned char*)(dstImage.data),dstImage.cols,dstImage.rows,dstImage.cols*dstImage.channels(),QImage::Format_RGB888);
img=img.scaled(ui->label1->size());
ui->label2->setPixmap(QPixmap::fromImage(img));
}
void MainWindow::on_ResizeDown_triggered()
{
//调用resize缩小图像
cv::resize(srcImage,dstImage,Size(srcImage.cols/4,srcImage.rows/4),0,0,3);
img=QImage((const unsigned char*)(dstImage.data),dstImage.cols,dstImage.rows,dstImage.cols*dstImage.channels(),QImage::Format_RGB888);
img=img.scaled(ui->label1->size());
ui->label2->setPixmap(QPixmap::fromImage(img));
}
//==========================================================================================
void MainWindow::on_cNresize_triggered()
{
//顺时针无缩放效果
//定义Point2f
Point2f srcTri[3];
Point2f dstTri[3];
Mat rot_mat(2,3,CV_32FC1);
Mat warp_mat(2,3,CV_32FC1);
Mat src,warp_dst,warp_rotate_dst;
//读入图像
srcImage.copyTo(src);
warp_dst=Mat::zeros(src.rows,src.cols,src.type());
//用3个点确定A仿射变换
Point center=Point(src.cols/2,src.rows/2);
double angle=-50.0;
double scale=1;
rot_mat=getRotationMatrix2D(center,angle,scale);
warpAffine(src,warp_rotate_dst,rot_mat,warp_dst.size());
warp_rotate_dst.copyTo(dstImage);
img=QImage((const unsigned char*)(dstImage.data),dstImage.cols,dstImage.rows,dstImage.cols*dstImage.channels(),QImage::Format_RGB888);
img=img.scaled(ui->label1->size());
ui->label2->setPixmap(QPixmap::fromImage(img));
}
void MainWindow::on_cResize_triggered()
{
//顺时针缩放效果
//定义Point2f
Point2f srcTri[3];
Point2f dstTri[3];
Mat rot_mat(2,3,CV_32FC1);
Mat warp_mat(2,3,CV_32FC1);
Mat src,warp_dst,warp_rotate_dst;
//读入图像
srcImage.copyTo(src);
warp_dst=Mat::zeros(src.rows,src.cols,src.type());
//用3个点确定A仿射变换
Point center=Point(src.cols/2,src.rows/2);
double angle=-50.0;
double scale=0.6;
rot_mat=getRotationMatrix2D(center,angle,scale);
warpAffine(src,warp_rotate_dst,rot_mat,warp_dst.size());
warp_rotate_dst.copyTo(dstImage);
img=QImage((const unsigned char*)(dstImage.data),dstImage.cols,dstImage.rows,dstImage.cols*dstImage.channels(),QImage::Format_RGB888);
img=img.scaled(ui->label1->size());
ui->label2->setPixmap(QPixmap::fromImage(img));
}
void MainWindow::on_antiClockwise_triggered()
{
//逆时针效果
Point2f srcTri[3];
Point2f dstTri[3];
Mat rot_mat(2,3,CV_32FC1);
Mat warp_mat(2,3,CV_32FC1);
Mat src,warp_dst,warp_rotate_dst;
//读入图像
srcImage.copyTo(src);
warp_dst=Mat::zeros(src.rows,src.cols,src.type());
//用3个点确定A仿射变换
Point center=Point(src.cols/2,src.rows/2);
double angle=50.0;
double scale=0.6;
rot_mat=getRotationMatrix2D(center,angle,scale);
warpAffine(src,warp_rotate_dst,rot_mat,warp_dst.size());
warp_rotate_dst.copyTo(dstImage);
img=QImage((const unsigned char*)(dstImage.data),dstImage.cols,dstImage.rows,dstImage.cols*dstImage.channels(),QImage::Format_RGB888);
img=img.scaled(ui->label1->size());
ui->label2->setPixmap(QPixmap::fromImage(img));
}
void MainWindow::on_NFlipResize_triggered()
{
//零旋转缩放效果
Point2f srcTri[3];
Point2f dstTri[3];
Mat rot_mat(2,3,CV_32FC1);
Mat warp_mat(2,3,CV_32FC1);
Mat src,warp_dst,warp_rotate_dst;
//读入图像
srcImage.copyTo(src);
warp_dst=Mat::zeros(src.rows,src.cols,src.type());
//用3个点确定A仿射变换
Point center=Point(src.cols/2,src.rows/2);
double angle=0;
double scale=0.6;
rot_mat=getRotationMatrix2D(center,angle,scale);
warpAffine(src,warp_rotate_dst,rot_mat,warp_dst.size());
warp_rotate_dst.copyTo(dstImage);
img=QImage((const unsigned char*)(dstImage.data),dstImage.cols,dstImage.rows,dstImage.cols*dstImage.channels(),QImage::Format_RGB888);
img=img.scaled(ui->label1->size());
ui->label2->setPixmap(QPixmap::fromImage(img));
}