此示例显示如何从MATLAB构建一个可执行文件®代码,实现了一个简单的Sobel过滤器,对图像执行边缘检测。可执行文件从磁盘读取图像,应用Sobel过滤算法,然后保存修改后的图像。
这个示例展示了如何生成和修改一个示例主函数,您可以在构建可执行文件时使用这个主函数。
要完成此示例,请安装以下产品:下载188bet金宝搏
MATLAB
Matlab Coder™
C编译器(对于大多数平台,MATLAB提供默认的C编译器)。有关支持的编译器列表,请参阅金宝app金宝app支持编译器.
您可以使用墨西哥人设置
更改默认编译器。看到改变默认的编译器.
你在这个例子中使用的文件是:
文件名称 | 文件类型 | 描述 |
---|---|---|
sobel.m |
函数代码 | MATLAB实现Sobel过滤算法。sobel.m 以图像(表示为双矩阵)和阈值作为输入。该算法基于阈值检测图像中的边缘。sobel.m 返回显示边缘的修改图像。 |
hello.jpg |
图像文件 | Sobel滤镜修改的图像。 |
将示例文件复制到本地工作目录。
创建一个本地工作文件夹。例如,c: \编码器\ edge_detection
.
导航到工作文件夹。
复制文件sobel.m
和hello.jpg
从示例文件夹中索贝尔
到您的工作文件夹。
拷贝文件(fullfile (docroot,“工具箱”那“编码器”那“例子”那“索贝尔”))
将原始图像读入MATLAB矩阵并显示它。
我= imread ('hello.jpg');
将图像显示为与Sobel滤波器结果进行比较的基础。
图像(im);
Sobel滤波算法对灰度图像进行处理。将彩色图像转换为具有归一化值(0.0为黑色,1.0为白色)的等效灰度图像。
灰色=(0.2989 *双(im(:,: 1)) + 0.5870 *双(im(:,: 2)) + 0.1140 *双(im (:,:, 3))) / 255;
运行MATLAB函数进行Sobel滤波,通过灰度图像矩阵灰色的
和函数的阈值索贝尔
.本例使用0.7作为阈值。
edgeIm = sobel(灰色,0.7);
要显示修改后的图像,请重新格式化矩阵edgeIm
与函数repmat
这样你就可以把它传递给图片
命令。
im3 = repmat(edgeIm, [1 1 3]);图像(im3);
要测试生成的代码在功能上等同于原始MATLAB代码,并且不会发生运行时错误,生成MEX函数。
codegen报告索贝尔
codegen
生成一个名为sobel_mex.
在当前工作文件夹中。
要为Sobel过滤器运行MEX函数,请传递灰度图像矩阵灰色的
和函数的阈值sobel_mex.
.本例使用0.7作为阈值。
edgeImMex = sobel_mex(灰色,0.7);
要显示修改后的图像,请重新格式化矩阵edgeImMex
与函数repmat
这样你就可以把它传递给图片
命令。
im3Mex = repmat(edgeImMex, [1 1 3]);图像(im3Mex);
这个图像与使用MATLAB函数创建的图像相同。
尽管您可以为应用程序编写自定义的main函数,但是示例main函数提供了一个模板来帮助您合并生成的代码。
为Sobel过滤器生成一个示例主函数:
为C静态库创建配置对象。
cfg = coder.config('lib');
对于C/ c++源代码、静态库、动态库和可执行文件的配置对象,设置GenerateExampleMain
控制示例主要功能的生成。设置设置为“GenerateCodeOnly”
默认情况下,它生成示例main函数,但不编译它。对于本例,不要更改GenerateExampleMain
设置。
使用配置对象生成C静态库。
codegen报告配置CFG.索贝尔
为静态库生成的文件在文件夹中codegen / lib /索贝尔
.示例主文件在子文件夹中codegen / lib /索贝尔/例子
.
不修改文件c
和main.h
在例子
子文件夹。如果你这样做了,当你重新生成代码时,MATLAB编码器不重新生成示例主文件。它会警告您它检测到生成文件的更改。
复制文件c
和main.h
从文件夹中codegen / lib /索贝尔/例子
到另一个位置。对于本例,将文件复制到当前工作文件夹。修改新位置中的文件。
示例main函数声明并初始化数据(包括动态分配的数据)为零。它调用参数设为0的入口点函数,但不使用入口点函数返回的值。
C主要功能必须符合您申请的要求。此示例修改示例主要功能以满足Sobel过滤器应用程序的要求。
这个例子修改了这个文件c
这样,Sobel过滤器应用程序:
从二进制文件中读取灰度图像。
采用Sobel滤波算法。
将修改后的图像保存为二进制文件。
修改函数主要
:
接受包含灰度图像数据和阈值的文件作为输入参数。
调用这个函数main_sobel
以灰度图像数据流的地址和阈值作为输入参数。
在函数主要
:
删除声明空白(命令行参数个数)
和(空白)argv
.
声明的变量文件名
保存包含灰度图像数据的二进制文件的名称。
const char *文件名;
声明的变量阈值
保持阈值。
双阈值;
声明的变量FD.
保存应用程序从中读取的灰度图像数据的地址文件名
.
文件* fd;
加一个如果
语句检查三个参数。
if (argc != 3) {printf("预期2个参数:文件名和阈值\n");退出(1);}
赋值输入参数argv [1]
对于包含灰度图像数据的文件文件名
.
文件名= argv [1];
赋值输入参数argv [2]
对于阈值阈值
,将输入从字符串转换为数字双倍。
阈值= atof(argv [2]);
打开包含名称指定的灰度图像数据的文件文件名
.指定数据流的地址FD.
.
Fd = fopen(文件名,"rb");
以验证可执行文件是否可以打开文件名
,写一如果
语句,如果的值为FD.
是零
.
if (fd == NULL){退出(-1);}
替换函数调用main_sobel
通过呼叫main_sobel
输入参数FD.
和阈值
.
main_sobel (fd,阈值);
调用后关闭灰度图像文件sobel_terminate.
.
文件关闭(fd);
在示例主文件中,函数argInit_d1024xd1024_real_T
为您传递给Sobel过滤器的图像创建动态分配的可变大小阵列(emxArray)。此函数将EMXARRAY初始化为默认大小,并且EMXARRAY的元素为0.返回初始化的EMXARRAY。
对于Sobel过滤器应用程序,修改函数以将灰度图像数据从二进制文件读入EmxArray。
在函数argInit_d1024xd1024_real_T
:
替换输入参数无效
与参数文件* fd
.该变量指向函数读入的灰度图像数据。
静态emxarray_real_t * arginit_d1024xd1024_real_t(文件* fd)
更改变量的值IV2.
来匹配灰度图像矩阵的维数灰色的
.IV2.
保存emxArray的大小值argInit_d1024xd1024_real_T
创造。
静态int iv2[2] = {484,648};
MATLAB以列主要格式存储矩阵数据,而C以行主要格式存储矩阵数据。相应地声明尺寸。
定义一个变量元素
保存从灰度图像数据中读入的值。
双元素;
改变为了
-loop构造,从标准化图像中读取数据点元素
通过添加一个从文件中读
向内指令为了
循环。
欺诈(&元素,1,尺寸(元素),fd);
在为了
循环,分配元素
设置为emxArray数据的值。
Result ->data[b_j0 + Result ->size[0] * b_j1] = element;
Matlab功能sobel.m
与MATLAB数组接口,但Sobel过滤器应用程序接口二进制文件。
要将Sobel Filtering算法修改的图像保存到二进制文件,请创建函数saveImage
.功能saveImage
将数据从emxArray写入二进制文件。它使用的构造与函数使用的构造相似argInit_d1024xd1024_real_T
.
在文件中c
:
定义的函数saveImage
获取emxArray的地址edgeImage
作为输入,输出类型为void。
static void saveImage(emxArray_uint8_T *edgeImage) {}
定义的变量b_j0
和b_j1
就像在函数中定义的那样argInit_d1024xd1024_real_T
.
int b_j0;int b_j1;
定义的变量元素
存储从emxArray读取的数据。
uint8_T元素;
打开二进制文件edge.bin
写入修改的图像。分配地址edge.bin
来文件* fd
.
FILE *fd = fopen("edge.bin", "wb");
以验证可执行文件是否可以打开edge.bin
,写一如果
语句,如果的值为FD.
是零
.
if (fd == NULL){退出(-1);}
写一个嵌套为了
-loop构造函数argInit_d1024xd1024_real_T
.
For (b_j0 = 0;b_j0 < edgeImage - >大小[0 u];B_j0 ++) {for (b_j1 = 0;b_j1 < edgeImage - >大小[1 u];B_j1 ++) {}}
内部的内在的为了
- 从修改的图像数据分配值元素
.
元素= edgeImage->data[b_j0 + edgeImage->size[0] * b_j1];
作业完成后元素
,写入值元素
到文件edge.bin
.
fwrite(&元素,1,sizeof(元素),fd);
后为了
循环构造,近FD.
.
文件关闭(fd);
在示例main函数中,该函数main_sobel
为灰度和修改后的图像的数据创建emxArrays。它调用函数argInit_d1024xd1024_real_T
初始化灰度图像的emxArray。main_sobel
通过emxArrays和初始化函数的阈值0argInit_real_T
返回函数索贝尔
.当功能时main_sobel
结束时,它将丢弃函数的结果索贝尔
.
对于Sobel过滤器应用程序,修改该函数main_sobel
:
以灰度图像数据的地址和阈值作为输入。
使用从地址读取数据argInit_d1024xd1024_real_T
.
将数据传递给带有阈值的Sobel滤波算法阈值
.
使用以下命令保存结果saveImage
.
在函数main_sobel
:
用参数替换函数的输入参数文件* fd
和双阈值
.
static void main_sobel(FILE *fd, double threshold)
传递输入参数FD.
的函数调用argInit_d1024xd1024_real_T
.
originalImage之下= argInit_d1024xd1024_real_T (fd);
替换函数调用中的阈值输入索贝尔
与阈值
.
索贝尔(originalImage之下,阈值,edgeImage);
在调用函数之后索贝尔
,调用函数saveImage
与输入edgeImage
.
SaptImage(eddeImage);
要匹配您对函数定义所做的更改,请对函数声明进行以下更改:
改变函数的输入* argInit_d1024xd1024_real_T
来文件* fd
.
静态emxarray_real_t * arginit_d1024xd1024_real_t(文件* fd);
改变函数的输入main_sobel
来文件* fd
和双阈值
.
static void main_sobel(FILE *fd, double threshold);
添加的功能saveImage
.
静态void saptimage(emxarray_uint8_t * edgeImage);
用于输入/输出函数c
,添加标题文件stdio . h
到所包含的文件列表。
# include < stdio . h >
c
如果您目前不在工作文件夹中,请导航到该工作文件夹。
为C独立可执行文件创建一个配置对象。
cfg = coder.config(exe”);
使用配置对象和修改后的main函数为Sobel过滤器生成一个C独立的可执行文件。
codegen报告配置CFG.索贝尔cmain.h
默认情况下,如果你在Windows上运行MATLAB®平台,可执行sobel.exe
在当前工作文件夹中生成。如果您在Windows以外的平台上运行MATLAB,则文件扩展名是该平台的相应扩展名。默认情况下,为可执行文件生成的代码在文件夹中codegen / exe /索贝尔
.
创建MATLAB矩阵灰色的
如果它目前不在你的MATLAB工作区:
我= imread ('hello.jpg');
灰色=(0.2989 *双(im(:,: 1)) + 0.5870 *双(im(:,: 2)) + 0.1140 *双(im (:,:, 3))) / 255;
编写矩阵灰色的
转换为二进制文件打开外部文件
和写入文件
命令。应用程序读取这个二进制文件。
fid = fopen (“gray.bin”那' w ');写入文件(fid,灰色,“双”);文件关闭(fid);
运行可执行文件,将文件传递给它灰色
阈值为0.7。
要在Windows平台上运行Matlab中的示例:
系统(“sobel.exe gray.bin 0.7”);
可执行文件生成该文件edge.bin
.
读取文件edge.bin
转换成MATLAB矩阵edgeImExe
使用打开外部文件
和从文件中读
命令。
fd = fopen ('Edge.bin'那'r');edgeImExe = fread(fd, size(灰色),“uint8”);文件关闭(fd);
通过矩阵edgeImExe
的函数repmat
并显示图像。
im3Exe = repmat(edgeImExe, [1 1 3]);图像(im3Exe);
图像匹配的图像来自MATLAB和MEX函数。