qt界面模板_MIL+QT实践教程九

fe663a9604c13da1ea4f61cc39cd7b3c.png

MmodDefine+QT子界面控件间的通讯一

想要实现的效果如下,当点击define button时,可以将图像显示界面的图像内容获取过来并MmodDefine;

2902a9299d4e7a4594dacbecfeb0a5a2.png
https://www.zhihu.com/video/1152617935771078656

经过分析,当图像显示界面上无论有无绘制矩形框,都可以点击模板匹配界面的define按钮,当有矩形框时,我们匹配界面获取的图像内容是针对矩形框区域的;而当没有矩形框时,那么匹配界面获取的图像内容则时当前整个图像,这里注意的是,MIL默认的mmoddefine中的图像分辨率的要求是大于等于16×16小于等于1024×1024;若当图像分辨率不合适时,会自动弹出错误警告;

abb46ca25edb760342123989c9eb33ed.png

当我们点击define按钮,触发图像界面发射当前图像上子图的ID,这里我们认为即使没有矩形框,系统也会生成子图ID,只不过此时子图内容与父图一致,然后发射子图ID至define界面,显示和处理,完成使用之后立即释放buffer;

对于define按钮,使用:

///对于点击按钮动作自定义实现具体操作内容
connect(ui->pushButton_Define, SIGNAL(clicked(bool)), this, SLOT(on_pushButton_Define()))


///定义按钮按了以后的实现内容
void on_pushButton_Define(){
     emit strat_emit_disp_rect();
     HWND hwnd_widget_MC = (HWND)ui->widget->winId();
     MdispSelectWindow(m_display, recept_Image, hwnd_widget_MC);
     MIL_INT m_TemplateSizeX=M_NULL,
             m_TemplateSizeY=M_NULL;
     MbufInquire(recept_Image, M_SIZE_X, &m_TemplateSizeX);
     MbufInquire(recept_Image, M_SIZE_Y, &m_TemplateSizeY);
     MmodDefine(m_MilSearchContext, M_IMAGE, recept_Image, 0, 0,m_TemplateSizeX, m_TemplateSizeY);
}

对于显示界面发送rect框出的图像,可以做:

/// emit_rect就是图像显示界面接收由处理界面发送开始发射的槽函数
void emit_rect(){
    /// 先判断绘制图形数目。如果有矩形框时发射rect图像,如果没有,发射整张图像作为child Image;
    MIL_INT gra_num = MgraInquireList(m_MilGraList, M_LIST, M_DEFAULT, M_NUMBER_OF_GRAPHICS, M_NULL);
    MIL_INT offset_x, offset_y, rect_h, rect_w;
    if(gra_num!=M_NULL){
        offset_x = MgraInquireList(m_MilGraList, M_GRAPHIC_INDEX(gra_num-1), M_DEFAULT, M_POSITION_X, M_NULL);
        offset_y = MgraInquireList(m_MilGraList, M_GRAPHIC_INDEX(gra_num-1), M_DEFAULT, M_POSITION_Y, M_NULL);
        rect_h   = MgraInquireList(m_MilGraList, M_GRAPHIC_INDEX(gra_num-1), M_DEFAULT, M_RECTANGLE_HEIGHT, M_NULL);
        rect_w   = MgraInquireList(m_MilGraList, M_GRAPHIC_INDEX(gra_num-1), M_DEFAULT, M_RECTANGLE_WIDTH, M_NULL);
    }
    else {
        offset_x=offset_x=0;
        MbufInquire(m_MilImage, M_SIZE_X, &rect_w);
        MbufInquire(m_MilImage, M_SIZE_Y, &rect_h);
    }
    MbufChild2d(m_MilImage, offset_x, offset_y, rect_w, rect_h, &ROI_milimage);
    emit emit_ROI_milimage(ROI_milimage);
    emit emit_src_MILIM(m_MilImage, m_MilGraList);
}

MmodFind+MmodDraw+QT子界面控件间的通讯二

想要实现的效果如下,当点击find button时,可以将对当前图像显示界面的图像内容做 MmodFind并MmodDraw;

631690d81d66c39aa6a8754ee019a538.png
https://www.zhihu.com/video/1153005039206510592

首先明确我们要在切换待检测图像时会发送待检测图像给模板匹配界面;

所以在图像显示的类下要重写filter事件

bool Frame_Disp::eventFilter(QObject *watched, QEvent *event)
{
    if(watched != this)
    {
        if(QEvent::WindowActivate == event->type())
        {
            Title = this->windowTitle();
            qDebug(Title.toStdString().c_str());
            emit emit_src_MILIM(m_MilImage, m_MilGraList); ///发射当前显示的图像和与当前显示器关联的gralist
            return true ;
        }
        else
        {
            return false ;
        }
    }
    return false ;
}

然后在模板匹配处理类下,定义接收由示图像的槽函数

void creat_model_finder_geometric::recept_SRC_MILIM(MIL_ID SRC, MIL_ID GRA)
{
    MIL_ID SRC_IM  = SRC;
    MIL_ID SRC_GRA = GRA;
}

然后再在模板匹配结果时,定义函数内容:

/// 寻找并绘制模板匹配结果,当待检图像有绘制矩形框,则在矩形框区域查找绘制结果,
/// 如果没有,则在整张图像上寻找绘制结果;
/// 并且当重复点击寻找按钮时,保持正确匹配绘制;
void creat_model_finder_geometric::on_pushButton_Find()
{
    /* Reset the timer. */
    MappTimer(M_DEFAULT, M_TIMER_RESET+M_SYNCHRONOUS, M_NULL);
    /* Find the model. */
    int ID = ui->comboBox_Model_Index->currentIndex();
    MIL_INT gra_num = MgraInquireList(SRC_GRA, M_LIST, M_DEFAULT, M_NUMBER_OF_GRAPHICS, M_NULL);
    MIL_ID m_MilGraContextTemplate = MgraAlloc(m_MilSystem, M_NULL);
    MgraColor(m_MilGraContextTemplate, M_COLOR_YELLOW);
    if(M_NULL!= gra_num){
        MIL_DOUBLE Graphic_Type = MgraInquireList(SRC_GRA, M_GRAPHIC_INDEX(0), M_DEFAULT, M_GRAPHIC_TYPE, M_NULL);
        if((gra_num==2)|(Graphic_Type==M_GRAPHIC_TYPE_TEXT)){
            MgraControlList(SRC_GRA, M_GRAPHIC_INDEX(gra_num-1), M_DEFAULT, M_DELETE, M_DEFAULT);
        }
        if(Graphic_Type == M_GRAPHIC_TYPE_RECT){
            MIL_DOUBLE posx, posy;
            MgraInquireList(SRC_GRA, M_GRAPHIC_INDEX(0), M_DEFAULT, M_POSITION_X, &posx);
            MgraInquireList(SRC_GRA, M_GRAPHIC_INDEX(0), M_DEFAULT, M_POSITION_Y, &posy);
            MIL_DOUBLE width, height;
            MgraInquireList(SRC_GRA, M_GRAPHIC_INDEX(0), M_DEFAULT, M_RECTANGLE_WIDTH, &width);
            MgraInquireList(SRC_GRA, M_GRAPHIC_INDEX(0), M_DEFAULT, M_RECTANGLE_HEIGHT, &height);
            MbufChild2d(SRC_IM, posx, posy, width, height, &dst_find_IM);
            MgraControl(m_MilGraContextTemplate, M_DRAW_OFFSET_X, -posx);
            MgraControl(m_MilGraContextTemplate, M_DRAW_OFFSET_Y, -posy);
        }
        else if (Graphic_Type==M_GRAPHIC_TYPE_TEXT) {
            MIL_INT width, height;
            MbufInquire(SRC_IM, M_SIZE_X, &width);
            MbufInquire(SRC_IM, M_SIZE_Y, &height);
            MbufChild2d(SRC_IM, 0, 0, width, height, &dst_find_IM);
        }
    }
    else {
        MIL_INT width, height;
        MbufInquire(SRC_IM, M_SIZE_X, &width);
        MbufInquire(SRC_IM, M_SIZE_Y, &height);
        MbufChild2d(SRC_IM, 0, 0, width, height, &dst_find_IM);
    }
    MmodFind(m_MilSearchContext, dst_find_IM, m_MilResult);
    /* Read the find time. */
    MIL_DOUBLE Time = 0.0;
    MappTimer(M_DEFAULT, M_TIMER_READ+M_SYNCHRONOUS, &Time);
    MIL_DOUBLE time_ms  = Time*1000.0;
    /* Get the number of models found. */
    MmodGetResult(m_MilResult, M_DEFAULT, M_NUMBER+M_TYPE_MIL_INT, &NumResults);
    MIL_DOUBLE  Score       =M_NULL,        /* Model correlation score.*/
                XPosition   =M_NULL,        /* Model X position.       */
                YPosition   =M_NULL,        /* Model Y position.       */
                Angle       =M_NULL,        /* Model occurrence angle. */
                Scale       =M_NULL,        /* Model occurrence scale. */
                Score_Target=M_NULL,
                Fit_Error   =M_NULL;
    /* If a model was found above the acceptance threshold. */
    if ((NumResults >= 1))
    {
        for (int i = 0; i < NumResults; i++)
        {
            ui->tableWidget->setItem(line_index, 0, new QTableWidgetItem(QString::number(ID, 10, 0)));
            ui->tableWidget->setItem(line_index, 1, new QTableWidgetItem(QString::number(i, 10, 0)));
            ui->tableWidget->setItem(line_index, 2, new QTableWidgetItem(QString::number(time_ms, 10, 2)));
            MmodGetResult(m_MilResult, i, M_POSITION_X, &XPosition);
            ui->tableWidget->setItem(line_index, 3, new QTableWidgetItem(QString::number(XPosition, 10, 2)));
            MmodGetResult(m_MilResult, i, M_POSITION_Y, &YPosition);
            ui->tableWidget->setItem(line_index, 4, new QTableWidgetItem(QString::number(YPosition, 10, 2)));
            MmodGetResult(m_MilResult, i, M_SCALE, &Scale);
            ui->tableWidget->setItem(line_index, 5, new QTableWidgetItem(QString::number(Scale, 10, 2)));
            MmodGetResult(m_MilResult, i, M_ANGLE, &Angle);
            ui->tableWidget->setItem(line_index, 6, new QTableWidgetItem(QString::number(Angle, 10, 2)));
            MmodGetResult(m_MilResult, i, M_SCORE, &Score);
            ui->tableWidget->setItem(line_index, 7, new QTableWidgetItem(QString::number(Score, 10, 2)));
            MmodGetResult(m_MilResult, i, M_SCORE_TARGET, &Score_Target);
            ui->tableWidget->setItem(line_index, 8, new QTableWidgetItem(QString::number(Score_Target, 10, 2)));
            MmodGetResult(m_MilResult, i, M_FIT_ERROR, &Fit_Error);
            ui->tableWidget->setItem(line_index, 9, new QTableWidgetItem(QString::number(Fit_Error, 10, 2)));
            line_index++;
        }
        /* Draw edges, position and box over the occurrences that were found. */
        for (int i=0; i<NumResults; i++)
        {
            MmodDraw(m_MilGraContextTemplate,  m_MilResult, SRC_GRA,
                     M_DRAW_EDGE+M_DRAW_BOX, i, M_DEFAULT);
        }
    }
    else{
        ui->tableWidget->setItem(line_index, 0,  new QTableWidgetItem("N/A"));
        ui->tableWidget->setItem(line_index, 1,  new QTableWidgetItem("N/A"));
        ui->tableWidget->setItem(line_index, 2,  new QTableWidgetItem("N/A"));
        ui->tableWidget->setItem(line_index, 3,  new QTableWidgetItem("N/A"));
        ui->tableWidget->setItem(line_index, 4,  new QTableWidgetItem("N/A"));
        ui->tableWidget->setItem(line_index, 5,  new QTableWidgetItem("N/A"));
        ui->tableWidget->setItem(line_index, 6,  new QTableWidgetItem("N/A"));
        ui->tableWidget->setItem(line_index, 7,  new QTableWidgetItem("N/A"));
        ui->tableWidget->setItem(line_index, 8,  new QTableWidgetItem("N/A"));
        ui->tableWidget->setItem(line_index, 9,  new QTableWidgetItem("N/A"));
        ui->tableWidget->setItem(line_index, 10, new QTableWidgetItem("N/A"));
        ui->tableWidget->setItem(line_index, 11, new QTableWidgetItem("N/A"));
        ui->tableWidget->setItem(line_index, 12, new QTableWidgetItem("N/A"));
        line_index++;

        MgraText(m_MilGraContextTemplate, SRC_GRA, 5, 5, MIL_TEXT("Not Found."));
    }
    if(m_MilGraContextTemplate!=M_NULL)
        MgraFree(m_MilGraContextTemplate);
    if(dst_find_IM!=M_NULL)
        MbufFree(dst_find_IM);
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值