#include "stdafx.h"
|
#include "BaseProcApi.h"
|
|
//¶ÔÏóÊÇ·ñ´æÔÚ
|
bool ObjectIsExist(HalconCpp::HObject& hObject) {
|
/* code */
|
// ÅжÏhObjectÊÇ·ñδ³õʼ»¯
|
if (!hObject.IsInitialized()) return false;
|
|
// ´´½¨Ò»¸ö¿ÕµÄHObject
|
HalconCpp::HObject hEmptyObj;
|
HalconCpp::GenEmptyObj(&hEmptyObj);
|
// ÅжÏhObjectÊÇ·ñµÈÓÚhEmptyObj
|
if (hObject == hEmptyObj) return false;
|
|
// ·ñÔò·µ»Øtrue
|
return true;
|
}
|
|
bool GetImageSizeApi(HalconCpp::HObject hImage, int& width, int& height) {
|
/*c ode */
|
if (!ObjectIsExist(hImage)) return false;
|
|
HalconCpp::HTuple hWidth, hHeight;
|
HalconCpp::GetImageSize(hImage, &hWidth, &hHeight);
|
width = hWidth[0].I();
|
height = hHeight[0].I();
|
if (width < 1 || height < 1) return false;
|
return true;
|
}
|
|
int doMeasurePosApi(HalconCpp::HObject& hImage, double x1, double y1, double x2, double y2, double len, int threshold, double sigma, double* xOutResult, double* yOutResult, double* cyOutResult, double* distOutResult, int& nOutResult) {
|
/* code */
|
int width = 0;
|
int height = 0;
|
nOutResult = 0;
|
if (!GetImageSizeApi(hImage, width, height)) return -1;
|
if (width < 1 || height < 1) return -1;
|
|
// Local control variables
|
HalconCpp::HTuple hv_AmplitudeThreshold, hv_RoiWidthLen2;
|
HalconCpp::HTuple hv_LineRowStart_Measure_01_0, hv_LineColumnStart_Measure_01_0;
|
HalconCpp::HTuple hv_LineRowEnd_Measure_01_0, hv_LineColumnEnd_Measure_01_0;
|
HalconCpp::HTuple hv_TmpCtrl_Row, hv_TmpCtrl_Column, hv_TmpCtrl_Dr;
|
HalconCpp::HTuple hv_TmpCtrl_Dc, hv_TmpCtrl_Phi, hv_TmpCtrl_Len1;
|
HalconCpp::HTuple hv_TmpCtrl_Len2, hv_MsrHandle_Measure_01_0, hv_Row_Measure_01_0;
|
HalconCpp::HTuple hv_Column_Measure_01_0, hv_Amplitude_Measure_01_0;
|
HalconCpp::HTuple hv_Distance_Measure_01_0;
|
|
hv_AmplitudeThreshold = threshold;
|
hv_RoiWidthLen2 = len;
|
|
//Measure 01: Coordinates for line Measure 01 [0]
|
hv_LineRowStart_Measure_01_0 = y1;
|
hv_LineColumnStart_Measure_01_0 = x1;
|
hv_LineRowEnd_Measure_01_0 = y2;
|
hv_LineColumnEnd_Measure_01_0 = x2;
|
|
//Measure 01: Convert coordinates to rectangle2 type
|
hv_TmpCtrl_Row = 0.5 * (hv_LineRowStart_Measure_01_0 + hv_LineRowEnd_Measure_01_0);
|
hv_TmpCtrl_Column = 0.5 * (hv_LineColumnStart_Measure_01_0 + hv_LineColumnEnd_Measure_01_0);
|
hv_TmpCtrl_Dr = hv_LineRowStart_Measure_01_0 - hv_LineRowEnd_Measure_01_0;
|
hv_TmpCtrl_Dc = hv_LineColumnEnd_Measure_01_0 - hv_LineColumnStart_Measure_01_0;
|
hv_TmpCtrl_Phi = hv_TmpCtrl_Dr.TupleAtan2(hv_TmpCtrl_Dc);
|
hv_TmpCtrl_Len1 = 0.5 * (((hv_TmpCtrl_Dr * hv_TmpCtrl_Dr) + (hv_TmpCtrl_Dc * hv_TmpCtrl_Dc)).TupleSqrt());
|
hv_TmpCtrl_Len2 = hv_RoiWidthLen2;
|
double len1 = hv_TmpCtrl_Len1[0].D();
|
double len2 = hv_TmpCtrl_Len2[0].D();
|
printf("len1 = %f, len2 = %f\n", len1, len2);
|
|
//Measure 01: Create measure for line Measure 01 [0]
|
//Measure 01: Attention: This assumes all images have the same size!
|
HalconCpp::GenMeasureRectangle2(hv_TmpCtrl_Row, hv_TmpCtrl_Column, hv_TmpCtrl_Phi, hv_TmpCtrl_Len1,
|
hv_TmpCtrl_Len2, width, height, "nearest_neighbor", &hv_MsrHandle_Measure_01_0);
|
//Measure 01: ***************************************************************
|
//Measure 01: * The code which follows is to be executed once / measurement *
|
//Measure 01: ***************************************************************
|
//Measure 01: The image is assumed to be made available in the
|
//Measure 01: variable last displayed in the graphics window
|
//Measure 01: Execute measurements
|
HalconCpp::MeasurePos(hImage, hv_MsrHandle_Measure_01_0, sigma, hv_AmplitudeThreshold, "all",
|
"all", &hv_Row_Measure_01_0, &hv_Column_Measure_01_0, &hv_Amplitude_Measure_01_0,
|
&hv_Distance_Measure_01_0);
|
//Measure 01: Do something with the results
|
HalconCpp::CloseMeasure(hv_MsrHandle_Measure_01_0);
|
|
HalconCpp::HTuple hv_length = hv_Row_Measure_01_0.TupleLength();
|
int count = hv_length[0].I();
|
if (count > MEASURE_MAX_NUM) {
|
count = MEASURE_MAX_NUM;
|
}
|
|
for (int i = 0; i < count; i++) {
|
xOutResult[i] = hv_Column_Measure_01_0[i].D();
|
yOutResult[i] = hv_Row_Measure_01_0[i].D();
|
cyOutResult[i] = hv_Amplitude_Measure_01_0[i].D();
|
}
|
int num = count - 1;
|
for (int i = 0; i < num; i++) {
|
distOutResult[i] = hv_Distance_Measure_01_0[i].D();
|
}
|
|
nOutResult = count;
|
|
return 1;
|
}
|