本科毕业设计

芯片缺陷检测与定位

图像模式识别系统的组成

图像模式识别是指综合运用图像处理、特征变换、分类方法和计算机等各种技术,模拟人类的视觉思维过程,以自动地识别、分类目标物体的过程或方法。通常由以下部分组成 :
这里写图片描述

芯片缺陷检测与定位流程概述

(1)由于芯片区域仅占采集到的图像的一部分,因此考虑先对图像采集卡采集到的原图像进行芯片区域提取,以提高后续算法的运行效率,并避免非焊盘区域的噪声影响。该步可考虑使用角点检测算法(为仅得到强角点,可使用Shi-Tomasi角点检测算法)等;
(2)芯片图像预处理。为减弱光照强度变化的影响(较强和较弱时),可考虑使用顶帽变换(Top-Hat)、Otsu方法、基于图像分块的可变阈值处理及形态学操作等流程(见下图),得到较理想的二值化图像。
这里写图片描述
(3)芯片图像特征提取。主要提取并筛选出芯片焊球轮廓,得到芯片焊球边缘点集数据。并对其进行拟合,以得到其位置、尺寸等信息,用于进一步的缺陷检测与定位;
(4)芯片缺陷检测与定位。
(5)算法测试。包括算法的抗干扰性能(鲁棒性)、通用性等的测试。

基于Qt的GUI设计

GUI主界面设计如图
这里写图片描述
其中左侧输入参数窗口使用QtreeWidget控件,且用户输入参数栏可编辑。鼠标双击可编辑功能主要通过以下代码实现:

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    initWindow();

    connect(ui->treeWidget, SIGNAL(itemDoubleClicked(QTreeWidgetItem*, int)),
            this, SLOT(openEditor(QTreeWidgetItem*, int)));
    connect(ui->treeWidget, SIGNAL(itemSelectionChanged()),
            this, SLOT(closeEditor()));
    ui->treeWidget->setStyleSheet("QTreeWidget::item{height:20px}");// 设置行距大小,可以防止编译修改完成以后,行距会发生变化
    ui->statusBar->showMessage(tr("欢迎使用该检测系统!"), 2000);
}
//在两个槽处理函数中
// 设置第一列除了不用设置参数的部分,双击的可以修改
QTreeWidgetItem *temItem; int temColumn;
void MainWindow::openEditor(QTreeWidgetItem *item, int column)
{
    //qDebug()<<"clicked"<<item->data(temColumn,Qt::DisplayRole).toString();;
    //qDebug()<<"item"<<item;
    if (column == 1 && item != item_Noise && item != item_ROI
            && item != item_Rreprocess && item != item_FeatureExtract
            && item != item_Inspection && item != child_Rreprocess_LightComp
            && item != child_Rreprocess_Binarize && item != child_Rreprocess_adaptThresh
            && item != child_Rreprocess_Morph
            && item != child_FeatureExtract_ContourExtract
            && item != child_FeatureExtract_circleFit
            && item != child_FeatureExtract_ContourSift)
    {
        ui->treeWidget->openPersistentEditor(item, column);// 设置某一item可以编辑
        temItem = item;
        temColumn = column;
    }
}
// 当修改完以后或者选中其他列的时候,关闭可编辑状态
void MainWindow::closeEditor()
{
    //QMessageBox::question(this,"修改",QString("%1").arg(temColumn),QMessageBox::Yes,QMessageBox::No);
    if (temItem != NULL)
    {

        QString str = temItem->data(temColumn, Qt::DisplayRole).toString();
        //qDebug()<<"String arguments"<<str;
        QRegExp rxs("^([1.0-9.9][0.0-9.9]*)$");
        if (str != NULL&&!rxs.exactMatch(str))
        {
            QMessageBox::about(this, tr("waring"), tr("请输入数字!"));
            temItem->setText(temColumn, QString(""));
            //temItem->data(temColumn,Qt::DisplayRole)->clear();
        }
        //qDebug()<<"Input arguments"<<temItem->data(temColumn,Qt::DisplayRole);
        else{
            ui->treeWidget->closePersistentEditor(temItem, temColumn);// 设置某一item不可编辑
        }
    }
}

输出参数窗口则主要通过QTextBrowser类实现参数的输出。如当要输出如下图所示的芯片中心坐标
这里写图片描述
可通过以下代码实现

ui->textBrowser->setText(tr("***************标准芯片***************"));
    ui->textBrowser->append(tr("标准芯片的芯片中心(已知数据):("));
    ui->textBrowser->moveCursor(QTextCursor::End);
    ui->textBrowser->insertPlainText(QString::number(std_center_chip.x));
    ui->textBrowser->moveCursor(QTextCursor::End);
    ui->textBrowser->insertPlainText(",");
    ui->textBrowser->moveCursor(QTextCursor::End);
    ui->textBrowser->insertPlainText(QString::number(std_center_chip.y));
    ui->textBrowser->moveCursor(QTextCursor::End);
    ui->textBrowser->insertPlainText(tr(")"));

其中std_center_chip.x和std_center_chip.y为标准芯片对象的x坐标和y坐标值。

图像批量处理

当输入图像位于某一文件夹下时,为完成图像的批量处理,可以:
(1)在DOS模式下生成txt文件:
DOS环境中进入该文件路径,执行如下命令:

当前文件路径> dir/b>images.txt

(2)即可通过TXT批量处理图片。见:opencv中批量读取图片并保存
(3)而在Qt中,则需将输入图像路径的QString类型转化为char/string类型,进而使用OpenCV中的imread()函数读取图像,进而完成后续的图像批量处理操作。具体代码如下:

void MainWindow::on_action_batchPro_triggered()
{
    ui->statusBar->showMessage(tr("检测与定位--图像批量处理"));
    bool isOK;
    QString text1 = QInputDialog::getText(NULL, tr("输入图像(txt文本)路径"),
                                          tr("请输入txt路径:"),
                                          QLineEdit::Normal,
                                          "E:/GDW/bga/flipchip/flipchip.txt",
                                          &isOK);
    QString text2 = QInputDialog::getText(NULL, tr("输出图像路径"),
                                          tr("请输入路径:"),
                                          QLineEdit::Normal,
                                          "E:/GDW/bga/output",
                                          &isOK);

    QDir dir1(text1);
    qDebug()<<dir1;
    dir1.cdUp( );// 目前在E:/
    qDebug()<<tr("父目录")<<dir1;

    QDir dir2(text2);
    qDebug()<<dir2;
    /*    dir2.cdUp( );// 目前在E:/
    qDebug()<<tr("父目录")<<dir2;
*/
    QString inputpath=dir1.absolutePath();
    qDebug()<<"QString input path"<<inputpath;
    QByteArray inputba = inputpath.toLatin1();
    const char *inputchar = inputba.data();


    QString outputpath=dir2.absolutePath();
    QByteArray outputba = outputpath.toLatin1();
    const char *outputchar = outputba.data();
    qDebug()<<"QString output path"<<outputchar;


    QFile file(text1);
    QString name;
    if(file.open((QFile::ReadOnly)))
    {
        qDebug()<<"file open!";
        QTextStream input(&file);

        int img_index = 0;

        while(!input.atEnd())
        {
            name=input.readLine();

            QByteArray nameba = name.toLatin1();
            const char *namechar = nameba.data();
            qDebug()<<"QString input line"<<namechar;

            char img_file[200],save_file[200];
            sprintf(img_file, "%s/%s",inputchar, namechar);
            sprintf(save_file, "%s/%d.bmp", outputchar,img_index);
            qDebug()<<"img_file"<<img_file;
            qDebug()<<"save_file"<<save_file;
            //sprintf(save_file, "%s/%d.bmp", inputstr,img_index);

            Mat src=imread(img_file,0);
            if(!src.data){cout<<"no image"<<endl;}

            //相关图像处理操作……

            img_index++;
            qDebug()<<img_index;
        }
        QMessageBox::warning(this, tr("提示"), tr("批量处理已完成!"));
    }
}
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Snort是一个轻量级的基于规则的网络入侵检测系统,可检测并防范多种网络攻击。在本科毕业设计中,可以通过以下步骤来设计实现一款基于Snort的网络安全系统。 首先,需要对Snort进行深入的了解,包括其原理、使用方法、规则等。对Snort进行详细的研究,以掌握其核心功能。 其次,需要对网络安全领域进行全面的分析和研究,了解网络攻击形式、攻击原理、攻击方式等方面的知识。这将帮助我们更好地设计网络安全系统。 接着,根据实际需求和特定的网络环境,设计合适的规则以确保网络安全系统的有效性和准确性。规则的正确设计对于网络安全的防御起着至关重要的作用。 最后,实现并测试网络安全系统,通过模拟网络攻击情况进行测试和验证,确保其能够对多种网络攻击进行及时响应和防御。 总之,一款基于Snort的网络安全系统设计实现需要对Snort进行深入了解,同时需要掌握网络安全领域相关知识,设计合适的规则并进行测试验证,以确保网络安全系统的可用性和有效性。 ### 回答2: 本科毕业设计是一个重要的学术课程,它旨在帮助学生综合应用所学知识,提升实际能力。我的本科毕业设计是基于Snort的网络入侵检测系统。 Snort是一款流行的免费开源的网络入侵检测系统,能够捕捉网络数据包并分析是否存在入侵行为。我的设计目的是深入探究Snort的原理和应用,从而设计出一套基于Snort的强大的网络入侵检测系统。 首先,我深入分析了Snort的工作原理,包括数据捕捉、协议分析和规则匹配等。通过掌握这些原理,我能够深入了解Snort的内部机制,并为接下来的设计做好准备。 接着,我着手设计了网络入侵检测系统并进行了实践验证。我依据Snort的原理,设计了一套完整的系统架构,包括数据捕捉、分析、规则匹配、报警处理等模块。我还实现了自动规则库更新和告警信息可视化等功能,提高了系统的可靠性和实用性。 最后,在进行实践验证时,我通过模拟各种入侵行为对系统进行测试,以验证系统的有效性和可靠性。并通过分析实践结果,优化了系统的算法和功能,提高了系统的性能和鲁棒性。 在整个毕业设计过程中,我学会了掌握系统设计和实现的方法和技能。我也更加深入理解了网络入侵检测的原理和方法,并学到如何避免网络安全风险。我相信这些经验和知识将为我今后的职业生涯打下坚实的基础。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值