mrDarker
2025-08-13 6ba20a51d17d6be2cf9886f3622863e95c2994fb
1. 添加侧面检的视觉库
已添加13个文件
702 ■■■■■ 文件已修改
SDK/VisionMeasure/include/VisionMeasureClass.h 48 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
VisionMeasure/BaseProcApi.cpp 106 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
VisionMeasure/BaseProcApi.h 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
VisionMeasure/ReadMe.txt 32 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
VisionMeasure/VisionMeasure.cpp 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
VisionMeasure/VisionMeasure.vcxproj 199 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
VisionMeasure/VisionMeasure.vcxproj.filters 57 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
VisionMeasure/VisionMeasureClass.cpp 143 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
VisionMeasure/VisionMeasureClass.h 48 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
VisionMeasure/dllmain.cpp 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
VisionMeasure/stdafx.cpp 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
VisionMeasure/stdafx.h 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
VisionMeasure/targetver.h 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SDK/VisionMeasure/include/VisionMeasureClass.h
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,48 @@
#ifndef __VISIONMEASURECLASS_H__
#define __VISIONMEASURECLASS_H__
#include <iostream>
#include <string>
#include <stdio.h>
#ifdef VISIONMEASURE_EXPORTS
#define EXPORT_MEASURE_EXPORTS _declspec(dllexport)
#else
#define EXPORT_MEASURE_EXPORTS _declspec(dllimport)
#endif
typedef struct _MeasurePoint {
    double x;
    double y;
    double cy;
}MeasurePoint, *PMeasurePoint;
class EXPORT_MEASURE_EXPORTS CVisionMeasureClass
{
public:
    CVisionMeasureClass();
    ~CVisionMeasureClass();
public:
    //1. èŽ·å–ç‰ˆæœ¬å·
     std::string getVersion(void);
    //2. æµ‹é‡ç‚¹
    int doMeasurePos(unsigned char*img, int width, int height, double x1, double y1, double x2, double y2, double len, int threshold, double *xOutResult, double *yOutResult, double *cyOutResult, double *distOutResult, int &nOutResult);
    //3. æµ‹é‡ç‚¹
    int doMeasurePosA(unsigned char* img, int width, int height, double sigma,
        MeasurePoint *measureResult1, int &outResult1,
        MeasurePoint* measureResult2, int& outResult2,
        MeasurePoint* measureResult3, int& outResult3,
        MeasurePoint* measureResult4, int& outResult4,
        MeasurePoint* measureResult5, int& outResult5,
        MeasurePoint* measureResult6, int& outResult6,
        MeasurePoint* measureResult7, int& outResult7);
    //1. èŽ·å–ç¨‹åºè¿è¡Œè·¯å¾„
    std::string GetAppPathA(void);
};
#endif // __VISIONMEASURECLASS_H__
VisionMeasure/BaseProcApi.cpp
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,106 @@
#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;
}
VisionMeasure/BaseProcApi.h
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,12 @@
#ifndef BASEPROCAPI_H
#define BASEPROCAPI_H
#include <HalconCpp.h>
#define VERSION_NO      "1.0.0"
#define MEASURE_MAX_NUM  100
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);
#endif
VisionMeasure/ReadMe.txt
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,32 @@
========================================================================
    åŠ¨æ€é“¾æŽ¥åº“ï¼šVisionMeasure é¡¹ç›®æ¦‚è¿°
========================================================================
应用程序向导已为您创建了此 VisionMeasure DLL。
本文件概要介绍组成 VisionMeasure åº”用程序的每个文件的内容。
VisionMeasure.vcxproj
    è¿™æ˜¯ä½¿ç”¨åº”用程序向导生成的 VC++ é¡¹ç›®çš„主项目文件,其中包含生成该文件的 Visual C++ çš„版本信息,以及有关使用应用程序向导选择的平台、配置和项目功能的信息。
VisionMeasure.vcxproj.filters
    è¿™æ˜¯ä½¿ç”¨â€œåº”用程序向导”生成的 VC++ é¡¹ç›®ç­›é€‰å™¨æ–‡ä»¶ã€‚它包含有关项目文件与筛选器之间的关联信息。在 IDE ä¸­ï¼Œé€šè¿‡è¿™ç§å…³è”,在特定节点下以分组形式显示具有相似扩展名的文件。例如,“.cpp”文件与“源文件”筛选器关联。
VisionMeasure.cpp
    è¿™æ˜¯ä¸» DLL æºæ–‡ä»¶ã€‚
    æ­¤ DLL åœ¨åˆ›å»ºæ—¶ä¸å¯¼å‡ºä»»ä½•符号。因此,生成时不会产生 .lib æ–‡ä»¶ã€‚如果希望此项目成为其他某个项目的项目依赖项,则需要添加代码以从 DLL å¯¼å‡ºæŸäº›ç¬¦å·ï¼Œä»¥ä¾¿äº§ç”Ÿä¸€ä¸ªå¯¼å‡ºåº“,或者,也可以在项目“属性页”对话框中的“链接器”文件夹中,将“常规”属性页上的“忽略输入库”属性设置为“是”。
/////////////////////////////////////////////////////////////////////////////
其他标准文件:
StdAfx.h, StdAfx.cpp
    è¿™äº›æ–‡ä»¶ç”¨äºŽç”Ÿæˆåä¸º VisionMeasure.pch çš„预编译头 (PCH) æ–‡ä»¶å’Œåä¸º StdAfx.obj çš„预编译类型文件。
/////////////////////////////////////////////////////////////////////////////
其他注释:
应用程序向导使用“TODO:”注释来指示应添加或自定义的源代码部分。
/////////////////////////////////////////////////////////////////////////////
VisionMeasure/VisionMeasure.cpp
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,6 @@
// VisionMeasure.cpp : å®šä¹‰ DLL åº”用程序的导出函数。
//
#include "stdafx.h"
VisionMeasure/VisionMeasure.vcxproj
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,199 @@
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <ItemGroup Label="ProjectConfigurations">
    <ProjectConfiguration Include="Debug|Win32">
      <Configuration>Debug</Configuration>
      <Platform>Win32</Platform>
    </ProjectConfiguration>
    <ProjectConfiguration Include="Release|Win32">
      <Configuration>Release</Configuration>
      <Platform>Win32</Platform>
    </ProjectConfiguration>
    <ProjectConfiguration Include="Debug|x64">
      <Configuration>Debug</Configuration>
      <Platform>x64</Platform>
    </ProjectConfiguration>
    <ProjectConfiguration Include="Release|x64">
      <Configuration>Release</Configuration>
      <Platform>x64</Platform>
    </ProjectConfiguration>
  </ItemGroup>
  <PropertyGroup Label="Globals">
    <ProjectGuid>{52480DCD-7CDE-4608-B432-1DF92C6F29D6}</ProjectGuid>
    <Keyword>Win32Proj</Keyword>
    <RootNamespace>VisionMeasure</RootNamespace>
    <WindowsTargetPlatformVersion>8.1</WindowsTargetPlatformVersion>
  </PropertyGroup>
  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
    <ConfigurationType>DynamicLibrary</ConfigurationType>
    <UseDebugLibraries>true</UseDebugLibraries>
    <PlatformToolset>v140</PlatformToolset>
    <CharacterSet>Unicode</CharacterSet>
  </PropertyGroup>
  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
    <ConfigurationType>DynamicLibrary</ConfigurationType>
    <UseDebugLibraries>false</UseDebugLibraries>
    <PlatformToolset>v140</PlatformToolset>
    <WholeProgramOptimization>true</WholeProgramOptimization>
    <CharacterSet>Unicode</CharacterSet>
  </PropertyGroup>
  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
    <ConfigurationType>DynamicLibrary</ConfigurationType>
    <UseDebugLibraries>true</UseDebugLibraries>
    <PlatformToolset>v140</PlatformToolset>
    <CharacterSet>Unicode</CharacterSet>
  </PropertyGroup>
  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
    <ConfigurationType>DynamicLibrary</ConfigurationType>
    <UseDebugLibraries>false</UseDebugLibraries>
    <PlatformToolset>v140</PlatformToolset>
    <WholeProgramOptimization>true</WholeProgramOptimization>
    <CharacterSet>Unicode</CharacterSet>
  </PropertyGroup>
  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
  <ImportGroup Label="ExtensionSettings">
  </ImportGroup>
  <ImportGroup Label="Shared">
  </ImportGroup>
  <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
  </ImportGroup>
  <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
  </ImportGroup>
  <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
  </ImportGroup>
  <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
  </ImportGroup>
  <PropertyGroup Label="UserMacros" />
  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
    <LinkIncremental>true</LinkIncremental>
  </PropertyGroup>
  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
    <LinkIncremental>true</LinkIncremental>
  </PropertyGroup>
  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
    <LinkIncremental>false</LinkIncremental>
  </PropertyGroup>
  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
    <LinkIncremental>false</LinkIncremental>
  </PropertyGroup>
  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
    <ClCompile>
      <PrecompiledHeader>Use</PrecompiledHeader>
      <WarningLevel>Level3</WarningLevel>
      <Optimization>Disabled</Optimization>
      <PreprocessorDefinitions>WIN32;_DEBUG;_WINDOWS;_USRDLL;VISIONMEASURE_EXPORTS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
      <SDLCheck>true</SDLCheck>
    </ClCompile>
    <Link>
      <SubSystem>Windows</SubSystem>
      <GenerateDebugInformation>true</GenerateDebugInformation>
    </Link>
  </ItemDefinitionGroup>
  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
    <ClCompile>
      <PrecompiledHeader>Use</PrecompiledHeader>
      <WarningLevel>Level3</WarningLevel>
      <Optimization>Disabled</Optimization>
      <PreprocessorDefinitions>_DEBUG;_WINDOWS;_USRDLL;VISIONMEASURE_EXPORTS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
      <SDLCheck>true</SDLCheck>
      <AdditionalIncludeDirectories>$(HALCONROOT)\include\halconcpp;$(HALCONROOT)\include</AdditionalIncludeDirectories>
    </ClCompile>
    <Link>
      <SubSystem>Windows</SubSystem>
      <GenerateDebugInformation>true</GenerateDebugInformation>
      <AdditionalLibraryDirectories>$(HALCONROOT)\lib\$(HALCONARCH)</AdditionalLibraryDirectories>
      <AdditionalDependencies>halconcpp.lib;%(AdditionalDependencies)</AdditionalDependencies>
    </Link>
    <PostBuildEvent>
      <Command>copy "$(TargetDir)$(ProjectName).lib" "$(SolutionDir)VisionLib\lib\$(Configuration)\$(ProjectName).lib"
copy "$(TargetDir)$(ProjectName).dll" "$(SolutionDir)VisionLib\lib\$(Configuration)\$(ProjectName).dll"
copy "$(TargetDir)$(ProjectName).pdb" "$(SolutionDir)VisionLib\lib\$(Configuration)\$(ProjectName).pdb"
copy "$(SolutionDir)$(ProjectName)\VisionMeasureClass.h" "$(SolutionDir)VisionLib\include\VisionMeasureClass.h"</Command>
    </PostBuildEvent>
  </ItemDefinitionGroup>
  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
    <ClCompile>
      <WarningLevel>Level3</WarningLevel>
      <PrecompiledHeader>Use</PrecompiledHeader>
      <Optimization>MaxSpeed</Optimization>
      <FunctionLevelLinking>true</FunctionLevelLinking>
      <IntrinsicFunctions>true</IntrinsicFunctions>
      <PreprocessorDefinitions>WIN32;NDEBUG;_WINDOWS;_USRDLL;VISIONMEASURE_EXPORTS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
      <SDLCheck>true</SDLCheck>
    </ClCompile>
    <Link>
      <SubSystem>Windows</SubSystem>
      <GenerateDebugInformation>true</GenerateDebugInformation>
      <EnableCOMDATFolding>true</EnableCOMDATFolding>
      <OptimizeReferences>true</OptimizeReferences>
    </Link>
  </ItemDefinitionGroup>
  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
    <ClCompile>
      <WarningLevel>Level3</WarningLevel>
      <PrecompiledHeader>Use</PrecompiledHeader>
      <Optimization>MaxSpeed</Optimization>
      <FunctionLevelLinking>true</FunctionLevelLinking>
      <IntrinsicFunctions>true</IntrinsicFunctions>
      <PreprocessorDefinitions>NDEBUG;_WINDOWS;_USRDLL;VISIONMEASURE_EXPORTS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
      <SDLCheck>true</SDLCheck>
      <AdditionalIncludeDirectories>$(HALCONROOT)\include\halconcpp;$(HALCONROOT)\include</AdditionalIncludeDirectories>
    </ClCompile>
    <Link>
      <SubSystem>Windows</SubSystem>
      <GenerateDebugInformation>true</GenerateDebugInformation>
      <EnableCOMDATFolding>true</EnableCOMDATFolding>
      <OptimizeReferences>true</OptimizeReferences>
      <AdditionalLibraryDirectories>$(HALCONROOT)\lib\$(HALCONARCH)</AdditionalLibraryDirectories>
      <AdditionalDependencies>halconcpp.lib;%(AdditionalDependencies)</AdditionalDependencies>
    </Link>
    <PostBuildEvent>
      <Command>copy "$(TargetDir)$(ProjectName).lib" "$(SolutionDir)SDK\VisionMeasure\lib\$(Configuration)\$(ProjectName).lib"
copy "$(TargetDir)$(ProjectName).dll" "$(SolutionDir)SDK\VisionMeasure\lib\$(Configuration)\$(ProjectName).dll"
copy "$(TargetDir)$(ProjectName).pdb" "$(SolutionDir)SDK\VisionMeasure\lib\$(Configuration)\$(ProjectName).pdb"
copy "$(SolutionDir)$(ProjectName)\VisionMeasureClass.h" "$(SolutionDir)SDK\VisionMeasure\include\VisionMeasureClass.h"</Command>
    </PostBuildEvent>
  </ItemDefinitionGroup>
  <ItemGroup>
    <Text Include="ReadMe.txt" />
  </ItemGroup>
  <ItemGroup>
    <ClInclude Include="BaseProcApi.h" />
    <ClInclude Include="stdafx.h" />
    <ClInclude Include="targetver.h" />
    <ClInclude Include="VisionMeasureClass.h" />
  </ItemGroup>
  <ItemGroup>
    <ClCompile Include="BaseProcApi.cpp" />
    <ClCompile Include="dllmain.cpp">
      <CompileAsManaged Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">false</CompileAsManaged>
      <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
      </PrecompiledHeader>
      <CompileAsManaged Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">false</CompileAsManaged>
      <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
      </PrecompiledHeader>
      <CompileAsManaged Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">false</CompileAsManaged>
      <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
      </PrecompiledHeader>
      <CompileAsManaged Condition="'$(Configuration)|$(Platform)'=='Release|x64'">false</CompileAsManaged>
      <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
      </PrecompiledHeader>
    </ClCompile>
    <ClCompile Include="stdafx.cpp">
      <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Create</PrecompiledHeader>
      <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">Create</PrecompiledHeader>
      <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Create</PrecompiledHeader>
      <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|x64'">Create</PrecompiledHeader>
    </ClCompile>
    <ClCompile Include="VisionMeasure.cpp" />
    <ClCompile Include="VisionMeasureClass.cpp" />
  </ItemGroup>
  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
  <ImportGroup Label="ExtensionTargets">
  </ImportGroup>
</Project>
VisionMeasure/VisionMeasure.vcxproj.filters
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,57 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <ItemGroup>
    <Filter Include="源文件">
      <UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>
      <Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions>
    </Filter>
    <Filter Include="头文件">
      <UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>
      <Extensions>h;hh;hpp;hxx;hm;inl;inc;xsd</Extensions>
    </Filter>
    <Filter Include="资源文件">
      <UniqueIdentifier>{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}</UniqueIdentifier>
      <Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms</Extensions>
    </Filter>
    <Filter Include="include">
      <UniqueIdentifier>{24a6b585-160d-499d-9942-34dd0fc03439}</UniqueIdentifier>
    </Filter>
    <Filter Include="sdk">
      <UniqueIdentifier>{fcd811cc-88b7-49b8-9003-fc8a96e0b2c1}</UniqueIdentifier>
    </Filter>
  </ItemGroup>
  <ItemGroup>
    <Text Include="ReadMe.txt" />
  </ItemGroup>
  <ItemGroup>
    <ClInclude Include="stdafx.h">
      <Filter>头文件</Filter>
    </ClInclude>
    <ClInclude Include="targetver.h">
      <Filter>头文件</Filter>
    </ClInclude>
    <ClInclude Include="BaseProcApi.h">
      <Filter>include</Filter>
    </ClInclude>
    <ClInclude Include="VisionMeasureClass.h">
      <Filter>sdk</Filter>
    </ClInclude>
  </ItemGroup>
  <ItemGroup>
    <ClCompile Include="stdafx.cpp">
      <Filter>源文件</Filter>
    </ClCompile>
    <ClCompile Include="dllmain.cpp">
      <Filter>源文件</Filter>
    </ClCompile>
    <ClCompile Include="VisionMeasureClass.cpp">
      <Filter>include</Filter>
    </ClCompile>
    <ClCompile Include="BaseProcApi.cpp">
      <Filter>include</Filter>
    </ClCompile>
    <ClCompile Include="VisionMeasure.cpp">
      <Filter>源文件</Filter>
    </ClCompile>
  </ItemGroup>
</Project>
VisionMeasure/VisionMeasureClass.cpp
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,143 @@
#include "stdafx.h"
#include "VisionMeasureClass.h"
#include "BaseProcApi.h"
CVisionMeasureClass::CVisionMeasureClass() {
    /* code */
}
CVisionMeasureClass::~CVisionMeasureClass() {
    /* code */
}
std::string CVisionMeasureClass::getVersion(void) {
    /* code */
    return VERSION_NO;
}
int CVisionMeasureClass::doMeasurePos(unsigned char* img, int width, int height, double x1, double y1, double x2, double y2, double len, int threshold, double* xOutResult, double* yOutResult, double* cyOutResult, double* distOutResult, int& nOutResult) {
    /* code */
    if (nullptr == img) return -1;
    if (width < 1 || height < 1) return -1;
    try {
        HalconCpp::HObject hImage;
        HalconCpp::GenImage1(&hImage, "byte", width, height, (Hlong)img);
        int nRet = doMeasurePosApi(hImage, x1, y1, x2, y2, len, threshold, 1.0f, xOutResult, yOutResult, cyOutResult, distOutResult, nOutResult);
        hImage.Clear();
        return nRet;
    }
    catch (...) {
        return -1;
    }
}
int CVisionMeasureClass::doMeasurePosA(unsigned char* img, int width, int height, double sigma,
    MeasurePoint* measureResult1, int& outResult1,
    MeasurePoint* measureResult2, int& outResult2,
    MeasurePoint* measureResult3, int& outResult3,
    MeasurePoint* measureResult4, int& outResult4,
    MeasurePoint* measureResult5, int& outResult5,
    MeasurePoint* measureResult6, int& outResult6,
    MeasurePoint* measureResult7, int& outResult7) {
    /* code */
    if (nullptr == img) return -1;
    HalconCpp::HObject hImage, hZoomImage, hMeanImage;
    HalconCpp::GenImage1(&hImage, "byte", width, height, (Hlong)img);
    int szHeight = (int)(0.5 * height);
    HalconCpp::ZoomImageSize(hImage, &hZoomImage, width, szHeight, "constant");
    HalconCpp::MeanImage(hZoomImage, &hMeanImage, 1, 5);
    double xOutResult[MEASURE_MAX_NUM] = { 0 };
    double yOutResult[MEASURE_MAX_NUM] = { 0 };
    double cyOutResult[MEASURE_MAX_NUM] = { 0 };
    double distOutResult[MEASURE_MAX_NUM] = { 0 };
    int outNum = 0;
    int topEdge = 15;
    int botEdge = szHeight - 16;
    int step = (int)((botEdge - topEdge) / 6);
    int x1 = 5;
    int x2 = width - 6;
    for (int i = 0; i < 7; i++) {
        int y1 = topEdge + i * step;
        int y2 = y1;
        int threshold = 10;
        doMeasurePosApi(hMeanImage, x1, y1, x2, y2, 10, threshold, sigma, xOutResult, yOutResult, cyOutResult, distOutResult, outNum);
        if (0 == i) {
            outResult1 = outNum;
            for (int i = 0; i < outNum; i++) {
                measureResult1[i].x = xOutResult[i];
                measureResult1[i].y = 2 * yOutResult[i];
                measureResult1[i].cy = cyOutResult[i];
            }
        }
        else if (1 == i) {
            outResult2 = outNum;
            for (int i = 0; i < outNum; i++) {
                measureResult2[i].x = xOutResult[i];
                measureResult2[i].y = 2 * yOutResult[i];
                measureResult2[i].cy = cyOutResult[i];
            }
        }
        else if (2 == i) {
            outResult3 = outNum;
            for (int i = 0; i < outNum; i++) {
                measureResult3[i].x = xOutResult[i];
                measureResult3[i].y = 2 * yOutResult[i];
                measureResult3[i].cy = cyOutResult[i];
            }
        }
        else if (3 == i) {
            outResult4 = outNum;
            for (int i = 0; i < outNum; i++) {
                measureResult4[i].x = xOutResult[i];
                measureResult4[i].y = 2 * yOutResult[i];
                measureResult4[i].cy = cyOutResult[i];
            }
        }
        else if (4 == i) {
            outResult5 = outNum;
            for (int i = 0; i < outNum; i++) {
                measureResult5[i].x = xOutResult[i];
                measureResult5[i].y = 2 * yOutResult[i];
                measureResult5[i].cy = cyOutResult[i];
            }
        }
        else if (5 == i) {
            outResult6 = outNum;
            for (int i = 0; i < outNum; i++) {
                measureResult6[i].x = xOutResult[i];
                measureResult6[i].y = 2 * yOutResult[i];
                measureResult6[i].cy = cyOutResult[i];
            }
        }
        else if (6 == i) {
            outResult7 = outNum;
            for (int i = 0; i < outNum; i++) {
                measureResult7[i].x = xOutResult[i];
                measureResult7[i].y = 2 * yOutResult[i];
                measureResult7[i].cy = cyOutResult[i];
            }
        }
    }
    return 1;
}
std::string CVisionMeasureClass::GetAppPathA(void) {
    /* code */
    char szFilePath[MAX_PATH] = { 0 }, szDrive[MAX_PATH] = { 0 }, szDir[MAX_PATH] = { 0 }, szFileName[MAX_PATH] = { 0 }, szExt[MAX_PATH] = { 0 };
    GetModuleFileNameA(NULL, szFilePath, sizeof(szFilePath));
    _splitpath_s(szFilePath, szDrive, szDir, szFileName, szExt);
    std::string str(szDrive);
    str.append(szDir);
    return str;
}
VisionMeasure/VisionMeasureClass.h
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,48 @@
#ifndef __VISIONMEASURECLASS_H__
#define __VISIONMEASURECLASS_H__
#include <iostream>
#include <string>
#include <stdio.h>
#ifdef VISIONMEASURE_EXPORTS
#define EXPORT_MEASURE_EXPORTS _declspec(dllexport)
#else
#define EXPORT_MEASURE_EXPORTS _declspec(dllimport)
#endif
typedef struct _MeasurePoint {
    double x;
    double y;
    double cy;
}MeasurePoint, *PMeasurePoint;
class EXPORT_MEASURE_EXPORTS CVisionMeasureClass
{
public:
    CVisionMeasureClass();
    ~CVisionMeasureClass();
public:
    //1. èŽ·å–ç‰ˆæœ¬å·
     std::string getVersion(void);
    //2. æµ‹é‡ç‚¹
    int doMeasurePos(unsigned char*img, int width, int height, double x1, double y1, double x2, double y2, double len, int threshold, double *xOutResult, double *yOutResult, double *cyOutResult, double *distOutResult, int &nOutResult);
    //3. æµ‹é‡ç‚¹
    int doMeasurePosA(unsigned char* img, int width, int height, double sigma,
        MeasurePoint *measureResult1, int &outResult1,
        MeasurePoint* measureResult2, int& outResult2,
        MeasurePoint* measureResult3, int& outResult3,
        MeasurePoint* measureResult4, int& outResult4,
        MeasurePoint* measureResult5, int& outResult5,
        MeasurePoint* measureResult6, int& outResult6,
        MeasurePoint* measureResult7, int& outResult7);
    //1. èŽ·å–ç¨‹åºè¿è¡Œè·¯å¾„
    std::string GetAppPathA(void);
};
#endif // __VISIONMEASURECLASS_H__
VisionMeasure/dllmain.cpp
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,19 @@
// dllmain.cpp : å®šä¹‰ DLL åº”用程序的入口点。
#include "stdafx.h"
BOOL APIENTRY DllMain( HMODULE hModule,
                       DWORD  ul_reason_for_call,
                       LPVOID lpReserved
                     )
{
    switch (ul_reason_for_call)
    {
    case DLL_PROCESS_ATTACH:
    case DLL_THREAD_ATTACH:
    case DLL_THREAD_DETACH:
    case DLL_PROCESS_DETACH:
        break;
    }
    return TRUE;
}
VisionMeasure/stdafx.cpp
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,8 @@
// stdafx.cpp : åªåŒ…括标准包含文件的源文件
// VisionMeasure.pch å°†ä½œä¸ºé¢„编译头
// stdafx.obj å°†åŒ…含预编译类型信息
#include "stdafx.h"
// TODO: åœ¨ STDAFX.H ä¸­å¼•用任何所需的附加头文件,
//而不是在此文件中引用
VisionMeasure/stdafx.h
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,16 @@
// stdafx.h : æ ‡å‡†ç³»ç»ŸåŒ…含文件的包含文件,
// æˆ–是经常使用但不常更改的
// ç‰¹å®šäºŽé¡¹ç›®çš„包含文件
//
#pragma once
#include "targetver.h"
#define WIN32_LEAN_AND_MEAN             // ä»Ž Windows å¤´ä¸­æŽ’除极少使用的资料
// Windows å¤´æ–‡ä»¶:
#include <windows.h>
// TODO:  åœ¨æ­¤å¤„引用程序需要的其他头文件
VisionMeasure/targetver.h
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,8 @@
#pragma once
// åŒ…括 SDKDDKVer.h å°†å®šä¹‰å¯ç”¨çš„æœ€é«˜ç‰ˆæœ¬çš„ Windows å¹³å°ã€‚
// å¦‚果要为以前的 Windows å¹³å°ç”Ÿæˆåº”用程序,请包括 WinSDKVer.h,并将
// å°† _WIN32_WINNT å®è®¾ç½®ä¸ºè¦æ”¯æŒçš„平台,然后再包括 SDKDDKVer.h。
#include <SDKDDKVer.h>