在一个应用程序中使用一个示例C主要
这个例子展示了如何构建一个从MATLAB C可执行®Sobel代码实现一个简单的滤波器对图像进行边缘检测。可执行文件从磁盘中读取图像,应用Sobel滤波算法,然后保存修改后的图像。
这个例子展示了如何生成和修改主要功能,您可以使用一个例子,当你建立可执行。
先决条件
完成这个示例中,安装以下产品:下载188bet金宝搏
MATLAB
MATLAB编码器™
C编译器(对于大多数平台,提供一个默认的C编译器与MATLAB)。编译器支持的列表,请参阅金宝app金宝app支持编译器。
您可以使用
墨西哥人设置
改变默认的编译器。看到改变默认的编译器。
教程文件:Sobel过滤器
打开这个例子中获取文件对于本教程:sobel.m
和hello.jpg
。
教程的描述文件
在本例中使用的文件:
文件名称 | 文件类型 | 描述 |
---|---|---|
sobel.m |
函数代码 | Sobel过滤算法的MATLAB实现。sobel.m 需要一个图像(表示为一个双矩阵)和阈值作为输入。该算法检测图像中的边缘(基于阈值)。sobel.m 返回一个修改后的图像显示的边缘。 |
hello.jpg |
图像文件 | Sobel过滤器修改图像。 |
运行Sobel过滤图像
原始图像读入一个MATLAB矩阵和显示它。
我= imread (“hello.jpg”);
显示图像为基础的结果相比,Sobel过滤器。
图像(im);
Sobel过滤算法作用于灰度图像。将彩色图像转换为一个等价的灰度图像归一化值(1.0 0.0黑色、白色)。
灰色=(0.2989 *双(im(:,: 1)) + 0.5870 *双(im(:,: 2)) + 0.1140 *双(im (:,:, 3))) / 255;
Sobel过滤器的MATLAB函数运行,通过灰度图像矩阵
灰色的
和阈值函数索贝尔
。这个示例使用阈值0.7。edgeIm =索贝尔(灰色,0.7);
显示修改后的形象,重新格式化的矩阵
edgeIm
与函数repmat
这样你就可以通过它图像
命令。im3 = repmat (edgeIm [1 1 3]);图像(im3);
生成并测试一个墨西哥人的功能
测试生成的代码的功能相当于原始MATLAB代码和运行时错误不发生,生成一个墨西哥人的功能。
codegen报告索贝尔
codegen
生成一个墨西哥人命名函数sobel_mex
在当前工作目录中。Sobel过滤器的墨西哥人函数运行,通过灰度图像矩阵
灰色的
和阈值函数sobel_mex
。这个示例使用阈值0.7。edgeImMex = sobel_mex(灰色,0.7);
显示修改后的形象,重新格式化的矩阵
edgeImMex
与函数repmat
这样你就可以通过它图像
命令。im3Mex = repmat (edgeImMex [1 1 3]);图像(im3Mex);
这张图片是一样的使用MATLAB函数创建的图像。
为sobel.m生成一个例子的主要功能
虽然您可以编写一个定制的主要功能为您的应用程序,主要功能提供了一个例子一个模板来帮助您将生成的代码。
生成一个例子Sobel过滤器的主要功能:
C静态库创建一个配置对象。
cfg = coder.config (“自由”);
配置对象的C / c++源代码,静态库,动态库和可执行文件,设置
GenerateExampleMain
控制生成示例的主要功能。设置被设置“GenerateCodeOnly”
默认情况下,生成的例子主要功能但不编译它。对于这个示例,不改变的价值GenerateExampleMain
设置。使用配置对象生成C静态库。
codegen报告配置cfg索贝尔
静态库的生成的文件在文件夹中codegen / lib /索贝尔
。这个例子主要子文件夹中的文件codegen / lib /索贝尔/例子
。
复制的例子主要文件
不要修改文件吗c
和main.h
在例子
子文件夹。如果你这样做,当你重新生成代码,MATLAB编码器不再生的例子主要文件。它警告您检测到更改生成的文件。
复制文件c
和main.h
从文件夹中codegen / lib /索贝尔/例子
到另一个位置。对于这个示例,将文件复制到当前工作目录。修改文件在新的位置。
修改生成的主要功能
这个例子主要功能声明并初始化数据,包括动态分配数据,为零值。它调用入口点函数与参数设置为零值,但它不使用入口点函数返回的值。
C主要功能必须满足您的应用程序的需求。这个示例修改的例子主要功能满足需求Sobel过滤应用程序。
这个示例修改文件c
所以Sobel过滤器的应用程序:
从二进制文件读取灰度图像。
应用Sobel过滤算法。
保存修改后的图像的二进制文件。
修改功能主要
修改函数主要
:
接受文件包含灰度图像数据和阈值作为输入参数。
调用这个函数
main_sobel
灰度图像数据流的地址和阈值作为输入参数。
在函数主要
:
删除声明
命令行参数个数(空白)
和(空白)argv
。声明的变量
文件名
将二进制文件的名称包含灰度图像数据。const char *文件名;
声明的变量
阈值
阈值。双阈值;
声明的变量
fd
将灰度图像数据的地址在从应用程序读取文件名
。文件* fd;
添加一个
如果
声明,检查三个参数。如果(命令行参数个数! = 3){printf("预计2参数:文件名和阈值\ n”);退出(1);}
指定输入参数
argv [1]
文件包含灰度图像数据文件名
。文件名= argv [1];
指定输入参数
argv [2]
的阈值阈值
,将输入从一个字符串转换为一个数字翻倍。阈值= atof (argv [2]);
打开文件包含灰度图像数据中指定的名称
文件名
。分配的地址数据流fd
。fd = fopen(文件名,rb);
确认可执行文件可以打开
文件名
,写一如果
声明退出程序的价值fd
是零
。如果(fd = = NULL){退出(1);}
替换的函数调用
main_sobel
通过调用main_sobel
与输入参数fd
和阈值
。main_sobel (fd,阈值);
关闭后的灰度图像文件调用
sobel_terminate
。文件关闭(fd);
修改初始化函数argInit_d1024xd1024_real_T
在主文件的例子中,函数argInit_d1024xd1024_real_T
创建一个动态分配的适应可变数组(emxArray)传递给Sobel过滤器的图像。该函数初始化emxArray默认大小和emxArray的元素为0。它将返回emxArray初始化。
Sobel过滤应用程序,修改函数读取灰度图像数据从emxArray二进制文件。
在函数argInit_d1024xd1024_real_T
:
替换输入参数
无效
与参数文件* fd
。这个变量指向函数的灰度图像数据读入。静态emxArray_real_T * argInit_d1024xd1024_real_T(文件* fd)
改变变量的值
idx0
和idx1
灰度图像矩阵的尺寸相匹配灰色的
。这些变量持有emxArray的尺寸的大小值argInit_d1024xd1024_real_T
创建。int idx0 = 484;int idx1 = 648;
MATLAB矩阵数据存储在列为主的格式,而C存储矩阵中的数据行存储格式。申报相应的尺寸。
改变的值
emxCreate_real_T
函数的图像的大小。结果= emxCreate_real_T (484、648);
定义一个变量
元素
持有从灰度图像数据中读取的值。双元素;
改变
为
循环构建数据点归一化图像的读入元素
通过添加一个从文件中读
命令内为
循环。从文件中读(元素1 sizeof(元素),fd);
在
为
循环,分配元素
作为emxArray数据值集。结果- >数据大小[0]- > [idx0 +结果* idx1] =元素;
写函数saveImage
MATLAB函数sobel.m
接口与MATLAB数组,但Sobel和二进制文件过滤应用程序接口。
索贝尔的保存已修改的图像滤波算法的二进制文件,创建一个函数saveImage
。这个函数saveImage
写数据从一个emxArray到一个二进制文件中。它使用一个类似的建筑使用的一个函数argInit_d1024xd1024_real_T
。
在文件中c
:
定义的函数
saveImage
这需要emxArray的地址edgeImage
作为输入和输出类型无效。静态孔隙saveImage (emxArray_uint8_T * edgeImage) {}
定义的变量
idx0
和idx1
好像是在函数中定义的argInit_d1024xd1024_real_T
。int idx;int idx1;
定义的变量
元素
从emxArray读取存储数据。uint8_T元素;
打开一个二进制文件
edge.bin
编写修改后的图像。指定的地址edge.bin
来文件* fd
。文件* fd = fopen(”优势。本”、“白平衡”);
确认可执行文件可以打开
edge.bin
,写一如果
声明退出程序的价值fd
是零
。如果(fd = = NULL){退出(1);}
写一个嵌套
为
循环结构的函数argInit_d1024xd1024_real_T
。(idx0 = 0;idx0 < edgeImage - >大小[0 u];idx0 + +) {(idx1 = 0;idx1 < edgeImage - >大小[1 u];idx1 + +) {}}
内部的内在的
为
循环,分配的值修改图像数据元素
。元素= edgeImage - >数据[idx0 + edgeImage[0] - >大小* idx1);
赋值后
元素
,写的价值元素
到文件edge.bin
。写入文件(元素1 sizeof(元素),fd);
后
为
循环构造,近fd
。文件关闭(fd);
修改函数main_sobel
主要功能的示例中,这个函数main_sobel
为数据创建emxArrays灰度和修改图像。它调用的函数argInit_d1024xd1024_real_T
初始化的emxArray灰度图像。main_sobel
通过emxArrays和阈值(0),初始化函数argInit_real_T
返回的函数索贝尔
。当这个函数main_sobel
结束,它丢弃函数的结果索贝尔
。
Sobel过滤应用程序,修改功能main_sobel
:
以灰度图像数据的地址和阈值作为输入。
读取数据的地址使用
argInit_d1024xd1024_real_T
。将数据传递给索贝尔与阈值滤波算法
阈值
。保存结果使用
saveImage
。
在函数main_sobel
:
函数的输入参数替换为参数
文件* fd
和双阈值
。静态孔隙main_sobel(文件* fd,双阈值)
通过输入参数
fd
的函数调用argInit_d1024xd1024_real_T
。originalImage之下= argInit_d1024xd1024_real_T (fd);
取代阈值输入的函数调用
索贝尔
与阈值
。索贝尔(originalImage之下,阈值,edgeImage);
后调用的函数
索贝尔
调用函数saveImage
与输入edgeImage
。saveImage (edgeImage);
修改函数声明
匹配变化的函数定义,函数声明做出以下更改:
改变函数的输入
* argInit_d1024xd1024_real_T
来文件* fd
。静态emxArray_real_T * argInit_d1024xd1024_real_T(文件* fd);
改变函数的输入
main_sobel
来文件* fd
和双阈值
。静态孔隙main_sobel(文件* fd,双阈值);
添加的功能
saveImage
。静态孔隙saveImage (emxArray_uint8_T * edgeImage);
修改包含文件
你使用的输入/输出功能c
,添加头文件stdio . h
包含的文件列表。
# include < stdio . h >
修改文件的内容c
生成Sobel过滤应用程序
导航到工作目录中如果你不现在。
创建一个配置对象的C独立的可执行文件。
cfg = coder.config (exe”);
Sobel C生成一个独立的可执行的过滤器使用配置对象和修改后的主要功能。
codegen报告配置cfg索贝尔cmain.h
默认情况下,如果你是在Windows上运行MATLAB®平台,可执行sobel.exe
在当前工作目录中生成。如果您正在运行MATLAB Windows以外的一个平台上,该平台的文件扩展名是相应的扩展。默认情况下,生成的代码的可执行文件的文件夹codegen / exe /索贝尔
。
Sobel过滤器运行应用程序
创建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);
运行可执行文件,传递文件
gray.bin
和阈值0.7。在MATLAB在Windows平台上运行示例:
系统(索贝尔。exe灰色。本0.7”);
可执行生成的文件
edge.bin
。
显示的图像
读取文件
edge.bin
成一个MATLAB矩阵edgeImExe
使用打开外部文件
和从文件中读
命令。fd = fopen (“edge.bin”,“r”);edgeImExe =从文件中读(fd、大小(灰色)“uint8”);文件关闭(fd);
通过矩阵
edgeImExe
的函数repmat
并显示图像。im3Exe = repmat (edgeImExe [1 1 3]);图像(im3Exe);
MATLAB的图像与图像匹配和墨西哥人功能。