MmodDefine+QT子界面控件间的通讯一
想要实现的效果如下,当点击define button时,可以将图像显示界面的图像内容获取过来并MmodDefine;
经过分析,当图像显示界面上无论有无绘制矩形框,都可以点击模板匹配界面的define按钮,当有矩形框时,我们匹配界面获取的图像内容是针对矩形框区域的;而当没有矩形框时,那么匹配界面获取的图像内容则时当前整个图像,这里注意的是,MIL默认的mmoddefine中的图像分辨率的要求是大于等于16×16小于等于1024×1024;若当图像分辨率不合适时,会自动弹出错误警告;
当我们点击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;
首先明确我们要在切换待检测图像时会发送待检测图像给模板匹配界面;
所以在图像显示的类下要重写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);
}