matlab 鼠标实时显示坐标值_Matlab&Halcon的混合编程

第一步

在Halcon中编写相关的程序,本文采用了读图显示、截图显示的小程序进行测试,代码如下:

8a4f549ca867d2d289708e5a7c143248.png

02894d7c4bb8d96d871faa563c66b209.png

接着讲Halcon程序导出为C++-Halcon/C++

00683bc9a2904a0a07a92b1902cd5b2e.png

导出的保存为img_cut.cpp(自定义)文件,用VS2013打开,主要程序如下:

10190883ef27c59c47e10a53593d429e.png

010699d2a4d2413857947960b99c5e8e.png

为了能够在VS中调用Halcon的程序算子,需先对VS进行相关环境的配置(另有文档进行说明)

第二步:

在VS中编写Matlab的接口程序,主要函数为:

64a2c7a86ea330b920f627e5057362f1.png

(matlab直接调用执行mexfunction函数内部的程序)

各参数意义为:

Int nlhs:输出参数的个数

mxArray*:输出数据

int nrhs:输入参数的个数

mxArray*:输入数据

总程序如下:

创建名为mex_test的空项目(本例子的路径为:D:我的文档Visual Studio 2013Projectsmex_testmex_test):

92518cae0a5bd08378851415af6142fe.png

创建mex_test.cpp源文件,并进行编写

1ba54c2c67ea8b588b893599f34b698a.png

e83351086486bc63a3ff58e2906bce4f.png

其中:

1、“mex.h”包含了matlab与C++的接口程序算子(需对VS进行相应的配置)

6834697472320a180cc04b955edde8bb.png

右键mex_test项目/属性/C/C++/常规/附加包含目录

此处添加matlab外部接口的头文件,即把matlab安装目录下的…/extern/include添加进来。

2、action()函数是由Halcon导出的执行函数,需要进行部分改动,以便更好的人机交互:

0cef2d140eb9c18bbbf15757f2a8b708.png

编写完VS的程序,点击生成解决方案,此时会提示1个error3个waring

762104d453b5b311968725df0b97a702.png

此时mex_test.cpp已经编译完成,故未定义入口点并不影响

第三步:

对matlab进行相关的API配置:

在matlab的命令行窗口输入:

56f926db9ac9b84a5146fc9ee573ec80.png

则会出现:

be61a4b9544eb7de6ff13317d0dcc37d.png

鼠标点击mex -setup C++:与C++编译器建立链接,点击之后出现

04651b47de2e66372f5b36db45148976.png

(本例子中是使用了matlab2014以及VS2013)

第四步:

对matlab进行接口程序的编写:

创建.m文本,并命名为readImg

bcd1053dc28c08b6d48599d4b20fe00f.png

本例子中的readImg.m路径为 D:我的文档MATLAB

f3ec45d92519e7bfd8f66ff91d9da0de.png

其中各函数说明如下:

1、copyfile(fullfile('D:','我的文档','Visual Studio 2013','projects','mex_test','mex_test','mex_test.cpp'),'.','f');

将D:我的文档Visual Studio 2013Projectsmex_testmex_test文件夹中mex_test.cpp复制到matlab当前文件夹中

eb7fcd7dde945d9727e252bd21ea706c.png

2、ipath=['-I' fullfile('F:','halcon','include')];

将‘-I’参数与halcon的头文件(都放在include中)进行串联,形成-I参数

3.lapacklib=fullfile('F:','halcon','lib','x86sse2-win32','halconcpp.lib');

将F:halconlibx86sse2-win32文件夹中的haconcpp.lib复制给lapacklib

4、mex('-v','-largeArrayDims',ipath,'mex_test.cpp',lapacklib); 创建mex函数的编译环境--相关参数意义如下:

‘-v’:默认值即可

‘-largeArrayDims’:matlab中处理数据的方式,halcon对应选择该选项即可

‘ipath’:与‘-I’参数串联的头文件路径

‘mex_test.cpp’:所需调用的Halcon—C++程序名称(若没有步骤1则需要将mex_test.cpp源文件手动添加到matlab当前文件夹)

‘lapacklib’:halcon的库路径

以上4步完成了matlab中mex接口的环境配置,接下来直接输入mex_test即可

注意:matlab直接调用的是cpp的函数名,而不是mexfunction函数,mexfunction只是一个接口程序

5、本例子是在m文件中编写,一步运行即可

0831309e61c70f566e8c08a3c8e52c5c.png

运行结果为:

46cbab15980e34dfd41a28d0088a2cd7.png

d13f7702e1056cfbc220d2ace0cc987c.png

此时直接在命令行输入mex_test(所调用函数的函数名),matlab会依次显示:

3622474207ac92a3747eb7b2f86da8ff.png

23c527477c965fe97468e852250a4fec.png