Main Content

Esta página aún no se ha traducido para esta versión. Puede ver la versión más reciente de esta página en inglés.

Generación de código con detección de células

Este ejemplo muestra cómo generar código C mediante MATLAB® Coder™ de aplicaciones que utilizan funciones.MATLABImage Processing Toolbox™ En el ejemplo se describe cómo configurar el entorno, preparar el código MATLAB para la generación de código y solucionar los problemas que pueda encontrar en el código que impidan la generación de código.MATLABMATLAB

Configure el compilador

En este ejemplo se muestra cómo especificar el compilador C/C++ con el que desea utilizar MATLAB Coder para generar código.

Utilice la función con la opción de especificar el compilador C/C++ con el que desea utilizarmex-setup MATLAB Coder.

mex -setup
MEX configured to use 'Microsoft Visual C++ 2010 (C)' for C language compilation. Warning: The MATLAB C and Fortran API has changed to support MATLAB   variables with more than 2^32-1 elements. In the near future   you will be required to update your code to utilize the   new API. You can find more information about this at:   https://www.mathworks.com/help/matlab/matlab_external/upgrading-mex-files-to-use-64-bit-api.html.  To choose a different C compiler, select one from the following: Microsoft Visual C++ 2012 (C)  mex -setup:C:\matlab\bin\win64\mexopts\msvc2012.xml C Intel C++ Composer XE 2013 with Microsoft Visual Studio 2012 (C)  mex -setup:C:\matlab\bin\win64\mexopts\intel_c_13_vs2012.xml C Intel C++ Composer XE 2011 with Microsoft Visual Studio 2010 (C)  mex -setup:C:\mexopts\intel_c_12_vs2010.xml C Intel C++ Composer XE 2013 with Microsoft Visual Studio 2010 (C)  mex -setup:C:\matlab\bin\win64\mexopts\intel_c_13_vs2010.xml C Microsoft Visual C++ 2010 (C)  mex -setup:C:\MATLAB\R2015a\mex_C_win64.xml C  To choose a different language, select one from the following:  mex -setup C++   mex -setup FORTRAN mex -setup FORTRAN

Generar código

En este ejemplo se muestra cómo generar código C a partir de código MATLAB que incluye funciones de Image Processing Toolbox mediante MATLAB Coder. Para ilustrar el proceso, el código utilizado por este ejemplo incluye algunos problemas de preparación y problemas de compilación que debe superar antes de poder generar código.

Copie el siguiente código en un archivo y guárdelo, dándole el nombre .cellDetectionMATLAB.m

function BWfinal = cellDetectionMATLAB(I) %cellDetectionMATLAB - detect cells using image segmentation.  [~, threshold] = edge(I, 'sobel'); fudgeFactor = .5; BWs = edge(I,'sobel', threshold * fudgeFactor); figure imshow(BWs) title('binary gradient mask');  se90 = strel('line', 3, 90); se0 = strel('line', 3, 0);  BWsdil = imdilate(BWs, [se90 se0]); figure imshow(BWsdil) title('dilated gradient mask');  BWdfill = imfill(BWsdil, 'holes'); figure imshow(BWdfill); title('binary image with filled holes');  BWnobord = imclearborder(BWdfill, 4); figure imshow(BWnobord) title('cleared border image');  seD = strel('diamond',1); BWfinal = imerode(BWnobord,seD); BWfinal = imerode(BWfinal,seD); figure imshow(BWfinal) title('segmented image');

Pruebe el código de ejemplo con una imagen de ejemplo. Utilice el archivo, incluido con ( ).cell.tifImage Processing Toolboxmatlab\toolbox\images\imdata\cell.tif

I = imread('cell.tif');  Iseg = cellDetectionMATLAB(I);  % Display the original image and the segmented image side-by-side. imshowpair(I,Iseg,'montage')

Cree una copia del código MATLAB antes de generar código C. Puesto que modifica este código para la generación de código, es bueno trabajar con una copia.

copyfile('cellDetectionMATLAB.m','cellDetectionCodeGeneration.m');

Abra la versión de generación de código de la función en el editor.MATLAB Como primer paso, cambie el nombre de la función en la firma de la función para que coincida con el nombre de archivo y agregue el MATLAB Coder directiva de compilación al final de la firma de la función.%#codegen Esta directiva indica al analizador de código que diagnostique problemas que prohibirían la generación correcta de código.MATLAB

function BWfinal = cellDetectionCodeGeneration(I) %#codegen . . . 

Abra el MATLAB Coder Aplicación. En MATLAB, seleccione la pestaña Aplicaciones, vaya a Generación de código y haga clic en el MATLAB Coder Aplicación. (Alternativamente, puede escribir en el símbolo del sistema de MATLAB.)coder

Especifique el nombre de la función de punto de entrada y pulse .cellDetectionCodeGenerationEnter

Determine la preparación del código para la generación de código. Haga clic (en la parte inferior derecha de la ventana del codificador).Next MATLAB Coder identifica cualquier problema que pueda impedir la generación de código. El código de ejemplo contiene cinco llamadas a funciones no admitidas.

Revise los problemas de preparación. Haga clic.Review Issues En el informe, MATLAB Coder muestra el código en una ventana de edición con los problemas de preparación que se enumeran a continuación, marcando los usos de la función que no admite la generación de código.imshow

Solucione los problemas de preparación. Quite las llamadas y el código de presentación relacionado del ejemplo.imshow Las instrucciones de visualización no son necesarias para la operación de segmentación. Puede editar el código de ejemplo en el MATLAB Coder. Cuando haya eliminado el código, haga clic para guardar las ediciones y volver a ejecutar la comprobación de preparación.Save Después de volver a ejecutar la comprobación de preparación, MATLAB Coder muestra el mensaje.No issues found

Defina el tamaño y el tipo de datos de las entradas de la función. Cada entrada del código debe especificarse para que tenga un tamaño fijo, un tamaño variable o una constante. Hay varias maneras de especificar el tamaño de su argumento de entrada, pero la forma más fácil es dando MATLAB Coder un ejemplo de llamar a su función. Escriba un script que llame a la función en el campo de entrada de texto. Para este ejemplo, escriba el código siguiente y pulse .Enter

I = imread('cell.tif');  Iseg = cellDetectionCodeGeneration(I);

Para obtener más información sobre la definición de entradas, consulte el MATLAB Coder Documentación. Después MATLAB Coder devuelve con la definición de tipo de entrada, haga clic en .Next

Compruebe si hay problemas en tiempo de ejecución. A pesar de que usted realizó el MATLAB Coder comprobaciones de preparación, pueden surgir problemas adicionales durante el proceso de compilación que pueden impedir la generación de código. Mientras que las comprobaciones de preparación examinan las dependencias de la función para determinar la preparación, el proceso de compilación examina los patrones de codificación. Puede utilizar el mismo código introducido para definir tipos de entrada (que se carga previamente en el cuadro de diálogo). Haga clic.Check for Issues

Este ejemplo contiene un problema de compilación: pasa una matriz de objetos y las matrices de objetos no se admiten para la generación de código.strelimdilate

Solucione los problemas de compilación identificados. En este ejemplo, debe modificar la llamada para evitar pasar una matriz de objetos strel.imdilate Esto se logra reemplazando la llamada única a con dos llamadas independientes a donde se pasa un objeto strel con cada llamada, resaltado en la siguiente figura.imdilateimdilate

Vuelva a ejecutar la compilación de prueba para asegurarse de que los cambios han solucionado el problema. Haga clic.Check for Issues MATLAB Coder muestra un mensaje que declara que no se han detectado problemas. Ahora está listo para generar código. Haga clic.Next

Elija el tipo de código que desea generar y seleccione la plataforma de destino. MATLAB Coder puede generar código fuente C o C++, un archivo MEX, una biblioteca estática, una biblioteca compartida o un ejecutable independiente. Para Hardware de producción, puede seleccionar entre muchas opciones, incluidos los procesadores ARM e Intel. Para este ejemplo, seleccione Código fuente y, para el idioma, deje seleccionada la opción y seleccione Genérico para hardware de producción y Equipo host MATLAB para el tipo de dispositivo.C Al elegir MATLAB Host Computer, MATLAB Coder genera código que depende de una biblioteca compartida precompilada. Las funciones de Image Processing Toolbox utilizan una biblioteca compartida para conservar las optimizaciones de rendimiento. Cuando haya realizado sus selecciones, haga clic en .Generate

Generar código. Cuando se hace,MATLAB Coder muestra el código generado.

Si ha elegido la opción Biblioteca dinámica C/C++, MATLAB Coder genera la siguiente interfaz. Esta interfaz se puede utilizar para integrarse con una aplicación externa:

type codegen\dll\cellDetectionCodeGeneration\cellDetectionCodeGeneration.h 
/*  * cellDetectionCodeGeneration.h  *  * Code generation for function 'cellDetectionCodeGeneration'  *  */  #ifndef __CELLDETECTIONCODEGENERATION_H__ #define __CELLDETECTIONCODEGENERATION_H__ /* Include files */ #include <math.h> #include <stddef.h> #include <stdlib.h> #include <string.h>  #include "rtwtypes.h" #include "cellDetectionCodeGeneration_types.h"  /* Function Declarations */ #ifdef __cplusplus extern "C" { #endif extern void cellDetectionCodeGeneration(const unsigned char I[30369], boolean_T BWfinal[30369]); #ifdef __cplusplus } #endif #endif /* End of code generation (cellDetectionCodeGeneration.h) */ 

La firma de función expuesta indica que hay dos entradas. Se espera que la primera entrada sea un con 30369 elementos.Iunsigned char Esto se utiliza para pasar la imagen de entrada en la que se va a realizar la detección de celdas. El tipo de la imagen de entrada en ( ) se representa como un archivo .MATLABuint8unsigned char El tamaño de la imagen es 159 x 191, es decir, 30369 elementos. El número de elementos se especifica a través de la interfaz, ya que la entrada se definió como tamaño fijo. Se espera que la segunda entrada sea un con 30369 elementos.BWfinalboolean_T Esto se utiliza para pasar un puntero a la imagen de salida.

Tenga en cuenta que hay una diferencia en la forma y las matrices de almacenamiento de C en la memoria. almacena matrices en orden principal de columna y C almacena matrices en orden de fila principal.MATLABMATLAB Para ilustrar, considere la siguiente matriz:

[ 1  2   3  4 ] 

almacena la matriz en la memoria como donde C almacena los elementos como .MATLAB[1 3 2 4 ][1 2 3 4 ] Debe tener en cuenta esta diferencia al trabajar con matrices.

También puede generar un ejecutable independiente mediante la opción "C/C++ Executable". En este caso, se debe especificar una función principal que invoca el código generado. Tenga en cuenta que no hay utilidades prefabricadas para importar datos. Para obtener un ejemplo, consulte el uso de la asignación dinámica de memoria para una simulación de "átomos" en el MATLAB Coder Documentación.

Haga clic para completar el proceso.Next MATLAB Coder muestra información sobre lo que generó. De forma predeterminada, MATLAB Coder crea una subcarpeta en la carpeta de trabajo que contiene la salida generada.codegen Para obtener más información acerca de la generación de código, consulte el MATLAB Coder Documentación.

Temas relacionados