opencv3.0的最简单图像系统

                               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));
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

金枝玉叶9

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值