10:图像传参+UI界面互传

1、图像传参

需要把图像变量声明为全局变量,这样才可以进行互传

也可以直接返回图像类型的变量进行互传,然后调用此函数就可以了;

但是前提依然是要声明全局变量

.h文件

cpp 复制代码
public:
    explicit celiang(QWidget *parent = 0);
    ~celiang();
    HObject  ho_Image;

private slots:
    HObject on_pushButton_clicked();

.cpp文件

cpp 复制代码
//打开图像
HObject celiang::on_pushButton_clicked()
{

    HTuple  hv_Width, hv_Height;
    //传入路径
    QString path = QFileDialog::getOpenFileName(this,"选择图片","","JPG文件(*.jpg;*.bmp)");
  //  if(path == "") return;
    //读图
    HTuple file2=HTuple(path.toStdString().c_str());
    ReadImage(&ho_Image,file2);

   //直径读取图像
   // ReadImage(&ho_Image, "./data/1");

  //获取图像大小
   GetImageSize(ho_Image, &hv_Width, &hv_Height);
    //HDevWindowStack::Push(hv_WindowHandle);

    //901  661  容纳不了
    //set part  ---适应一个大窗口上去
    SetPart(hv_WindowHandle02,0, 0, hv_Height, hv_Width);

    // dispimage(ho_Image);
    //显示 GetActive 默认哪个激活状态
   DispObj(ho_Image,hv_WindowHandle02);

   return ho_Image;//注意注意注意

}

.h文件

cpp 复制代码
#define CELIANG_H

#include <QWidget>

#include"MvCameraControl.h"
#include <QImage>
#include "HalconCpp.h"
using namespace HalconCpp;

extern HTuple hv_WindowHandle02;



namespace Ui {
class celiang;
}

class celiang : public QWidget
{
    Q_OBJECT

public:
    explicit celiang(QWidget *parent = 0);
    ~celiang();
    HObject  ho_Image;   //注意注意注意

    void  disp_message (HTuple hv_WindowHandle, HTuple hv_String, HTuple hv_CoordSystem,
        HTuple hv_Row, HTuple hv_Column, HTuple hv_Color, HTuple hv_Box);

    void  dispimage(HObject &ho_Image);

private slots:
    void on_pushButton_clicked();

    void on_pushButton_2_clicked();

private:
    Ui::celiang *ui;
};

#endif // CELIANG_H

.cpp文件

cpp 复制代码
#include "celiang.h"
#include "ui_celiang.h"
#include <mainwindow.h>
#include <QFileDialog>
#include <qdebug.h>
celiang::celiang(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::celiang)
{
    // 在类的构造函数或初始化函数中添加
    qRegisterMetaType<HalconCpp::HObject*>("HalconCpp::HObject*");
    ui->setupUi(this);
}

celiang::~celiang()
{
    delete ui;
}

//打开图像
void celiang::on_pushButton_clicked()
{

    HTuple  hv_Width, hv_Height;
    //传入路径
    QString path = QFileDialog::getOpenFileName(this,"选择图片","","JPG文件(*.jpg;*.bmp)");
    if(path == "") return;
    //读图
    HTuple file2=HTuple(path.toStdString().c_str());
    ReadImage(&ho_Image,file2);

   //直径读取图像
   // ReadImage(&ho_Image, "./data/1");

  //获取图像大小
   GetImageSize(ho_Image, &hv_Width, &hv_Height);
    //HDevWindowStack::Push(hv_WindowHandle);

    //901  661  容纳不了
    //set part  ---适应一个大窗口上去
    SetPart(hv_WindowHandle02,0, 0, hv_Height, hv_Width);

     dispimage(ho_Image);
    //显示 GetActive 默认哪个激活状态
   DispObj(ho_Image,hv_WindowHandle02);


    //图像处理算法
    //GenCircleCenterFromBlob(ho_Image, &hv_Row1, &hv_Column1, &hv_Radius);
}


//显示图像
void celiang::dispimage( HObject  &ho_Image)
{
  //  HObject ho_Image ;
    DispObj(ho_Image,hv_WindowHandle02);
}

//进行图像处理
void celiang::on_pushButton_2_clicked( )
{

    // Local iconic variables
    HObject   ho_GrayImage, ho_Regions, ho_RegionFillUp;
    HObject  ho_ImageReduced, ho_Regions1, ho_RegionDilation;
    HObject  ho_RegionErosion, ho_RegionDifference, ho_ImageReduced1;
    HObject  ho_Edges, ho_SelectedXLD, ho_UnionContours, ho_Cross;
    HObject  ho_ContCircle;

    // Local control variables
    HTuple  hv_I, hv_Width, hv_Height;
    HTuple  hv_Row, hv_Column, hv_Radius, hv_StartPhi, hv_EndPhi;
    HTuple  hv_PointOrder, hv_Number, hv_li, hv_Index, hv_message;

    hv_I=1;



     // ReadImage(&ho_Image, "./data/"+hv_I);
    

        //判断图像存在不存在
          if (!ho_Image.IsInitialized() || ho_Image.CountObj() == 0)
        {
         QMessageBox::warning(this,QString::fromLocal8Bit("警告"),QString::fromLocal8Bit("图像不存在"));

                    return;
        }
    //调用显示图像函数
          dispimage( ho_Image);
      //获取图像大小
       GetImageSize(ho_Image, &hv_Width, &hv_Height);
        //HDevWindowStack::Push(hv_WindowHandle);

        //901  661  容纳不了
        //set part  ---适应一个大窗口上去
        SetPart(hv_WindowHandle02,0, 0, hv_Height, hv_Width);

        SetLineWidth(hv_WindowHandle02,2);

       // DispObj(ho_Image, hv_WindowHandle02);

      Rgb1ToGray(ho_Image, &ho_GrayImage);

      Threshold(ho_GrayImage, &ho_Regions, 0, 104);

      FillUp(ho_Regions, &ho_RegionFillUp);

      ReduceDomain(ho_GrayImage, ho_RegionFillUp, &ho_ImageReduced);

      Threshold(ho_ImageReduced, &ho_Regions1, 151, 255);

      DilationCircle(ho_Regions1, &ho_RegionDilation, 20);

      ErosionCircle(ho_Regions1, &ho_RegionErosion, 20);


      Difference(ho_RegionDilation, ho_RegionErosion, &ho_RegionDifference);
      ReduceDomain(ho_GrayImage, ho_RegionDifference, &ho_ImageReduced1);


      EdgesColorSubPix(ho_ImageReduced1, &ho_Edges, "canny", 2, 40, 120);

      SelectShapeXld(ho_Edges, &ho_SelectedXLD, "area", "and", 150, 999990);


      UnionCocircularContoursXld(ho_SelectedXLD, &ho_UnionContours, 0.5, 0.1, 0.2,
          30, 10, 10, "true", 1);

      FitCircleContourXld(ho_UnionContours, "algebraic", -1, 0, 0, 3, 2, &hv_Row, &hv_Column,
          &hv_Radius, &hv_StartPhi, &hv_EndPhi, &hv_PointOrder);


      GenCrossContourXld(&ho_Cross, hv_Row, hv_Column, 36, hv_StartPhi);

      GenCircleContourXld(&ho_ContCircle, hv_Row, hv_Column, hv_Radius, 0, HTuple(360).TupleRad(),
          "positive", 1);

      CountObj(ho_ContCircle, &hv_Number);
      hv_li = 566.519/24;
      if (HDevWindowStack::IsOpen())
        ClearWindow(HDevWindowStack::GetActive());
      if (HDevWindowStack::IsOpen())
        DispObj(ho_Image, HDevWindowStack::GetActive());
      if (HDevWindowStack::IsOpen())
        DispObj(ho_ContCircle, HDevWindowStack::GetActive());
      if (HDevWindowStack::IsOpen())
        DispObj(ho_Cross, HDevWindowStack::GetActive());
      //dev_display (Edges)

      {
      HTuple end_val53 = hv_Number-1;
      HTuple step_val53 = 1;
      for (hv_Index=0; hv_Index.Continue(end_val53, step_val53); hv_Index += step_val53)
      {

          // 将数值结果转换为字符串
           double diameter = (hv_Radius[hv_Index].D() * 2) / hv_li.D();

          // 构建Qt字符串(直接使用Unicode中文)
            QString qsMessage = QString::fromLocal8Bit("直径: %1 mm").arg(diameter, 0, 'f', 6) ; // 保留两位小数
      //     QString qsMessage = QString::fromLocal8Bit("直径: ")+ QString::number(diameter)+"mm" ; // 保留两位小数

          // 转换QString为Halcon需要的HTuple
          HTuple hv_message = HTuple(qsMessage.toUtf8().constData());



      //  hv_message = //'直径为:'
       // "\326\261\276\266\316\252\243\272"+((HTuple(hv_Radius[hv_Index])*2)/hv_li);

        disp_message(hv_WindowHandle02, hv_message, "Image", HTuple(hv_Row[hv_Index]),
            HTuple(hv_Column[hv_Index]), "black", "true");

      }
      }
      // stop(...); only in hdevelop


}

2、判断图像是否为空

cpp 复制代码
  //判断图像存在不存在
          if (!ho_Image.IsInitialized() || ho_Image.CountObj() == 0)
        {
         QMessageBox::warning(this,QString::fromLocal8Bit("警告"),QString::fromLocal8Bit("图像不存在"));

                    return;
        }



3、UI界面互传

1.在头文件声明指针类型

cpp 复制代码
QTextBrowser * g_pTb;

2.在构造函数中赋值传参

cpp 复制代码
  g_pTb=ui->textBrowser;//这个就是主程序的UI界面

3.在其它类中引用主程序的UI界面

cpp 复制代码
extern QTextBrowser * g_pTb;


同理,窗口引用也是此方法(只不过不用使用指针也可以)

1.声明

cpp 复制代码
HTuple hv_WindowHandle01;

2.其它类直接引用

cpp 复制代码
extern HTuple hv_WindowHandle01;


4.Halcon在QT上显示文字转化

cpp 复制代码
  for (hv_Index=0; hv_Index.Continue(end_val53, step_val53); hv_Index += step_val53)
      {

          // 将数值结果转换为字符串
           double diameter = (hv_Radius[hv_Index].D() * 2) / hv_li.D();

          // 构建Qt字符串(直接使用Unicode中文)
            QString qsMessage = QString::fromLocal8Bit("直径: %1 mm").arg(diameter, 0, 'f', 6) ; // 保留两位小数
      //     QString qsMessage = QString::fromLocal8Bit("直径: ")+ QString::number(diameter)+"mm" ; // 保留两位小数

          // 转换QString为Halcon需要的HTuple
          HTuple hv_message = HTuple(qsMessage.toUtf8().constData());



      //  hv_message = //'直径为:'
       // "\326\261\276\266\316\252\243\272"+((HTuple(hv_Radius[hv_Index])*2)/hv_li);

        disp_message(hv_WindowHandle02, hv_message, "Image", HTuple(hv_Row[hv_Index]),
            HTuple(hv_Column[hv_Index]), "black", "true");

      }
      }
相关推荐
Honeysea_7015 分钟前
目标检测相关【清晰易懂】
人工智能·计算机视觉·目标跟踪
虾球xz35 分钟前
CppCon 2016 学习:GAME ENGINE USING C++11
大数据·开发语言·c++·学习
Jet450542 分钟前
第100+42步 ChatGPT学习:R语言实现阈值调整
开发语言·学习·chatgpt·r语言
虾球xz42 分钟前
CppCon 2016 学习:fixed_point Library
开发语言·c++·学习
希希不嘻嘻~傻希希1 小时前
CSS 字体与文本样式笔记
开发语言·前端·javascript·css·ecmascript
code喵喵1 小时前
八种数据结构简介
数据结构·算法·推荐算法
HaiQinyanAN1 小时前
【学习笔记】nlohmannjson&&cjson
c++·笔记·学习·json
Eric.Lee20211 小时前
数据集-目标检测系列- 杯子 数据集 bottle >> DataBall
人工智能·目标检测·计算机视觉·杯子检测·bottle detect
C语言小火车1 小时前
【C语言】银行账户管理系统丨源码+解析
c语言·c++·算法·课程设计
Wyn_1 小时前
【QT】自定义QWidget设置圆角+边框(重绘paintEvent)
qt·qwidget