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