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élula

En este ejemplo se muestra cómo generar código C mediante MATLAB®Coder™ de las aplicaciones que utilizan funciones.MATLABImage Processing Toolbox™ En el ejemplo se describe cómo configurar el entorno, preparar el código de MATLAB para la generación de código y solucionar cualquier problema que pueda surgir en el código que impida la generación de código.MATLABMATLAB

Configurar el compilador

En este ejemplo se muestra cómo especificar qué compilador de C/C++ desea usar con MATLABCoder para generar código.

Utilice la función con la opción de especificar el compilador de C/C++ que desea utilizar conmex-setup MATLABCoder.

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 del cuadro de herramientas de procesamiento de imágenes mediante MATLABCoder. Para ilustrar el proceso, el código utilizado en 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 el ().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 de su código de MATLAB antes de generar el 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 función para que coincida con el nombre de archivo y agregue el MATLABCoder 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 de código correcta.MATLAB

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

Abra el MATLABCoder Aplicación. En MATLAB, seleccione la pestaña aplicaciones, vaya a generación de código y haga clic en el MATLABCoder Aplicación. (Como alternativa, 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 de su código para la generación de código. Haga clic en (en la parte inferior derecha de la ventana del codificador).Next MATLABCoder 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, MATLABCoder muestra el código en una ventana de edición con los problemas de preparación enumerados a continuación, marcando los usos de la función que no admite la generación de código.imshow

Aborde los problemas de preparación. Quite las llamadas y el código de visualización relacionado de su 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 MATLABCoder. Cuando haya quitado el código, haga clic para guardar los cambios y vuelva a ejecutar la comprobación de preparación.Save Después de volver a ejecutar la comprobación de preparación, MATLABCoder 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 de tamaño fijo, tamaño variable o constante. Hay varias maneras de especificar el tamaño de su argumento de entrada, pero la forma más fácil es dar MATLABCoder un ejemplo de llamada a la 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 presione.Enter

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

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

Compruebe si hay problemas de tiempo de ejecución. A pesar de que realizó el MATLABCoder comprobaciones de preparación, pueden surgir problemas adicionales durante el proceso de compilación que puede evitar la generación de código. Mientras que las comprobaciones de disponibilidad examinan las dependencias de función para determinar la preparación, el proceso de compilación examina los patrones de codificación. Puede utilizar el mismo código que introdujo para definir los tipos de entrada (que está precargado en el cuadro de diálogo). Haga clic.Check for Issues

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

Aborde los problemas de compilación identificados. Para este ejemplo, debe modificar la llamada para evitar pasar una matriz de objetos Strel.imdilate Esto se logra reemplazando la única llamada a con dos llamadas separadas 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 corrigen el problema. Haga clic.Check for Issues MATLAB Coder muestra un mensaje declarando que no se detectaron 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 la opción seleccionada y seleccione genérico para hardware de producción y MATLAB host computer para el tipo de dispositivo.C Cuando se elige MATLAB host Computer, MATLAB Coder genera código que depende de una biblioteca compartida precompilada. Las funciones del cuadro de herramientas de procesamiento de imágenes utilizan una biblioteca compartida para conservar las optimizaciones de rendimiento. Cuando haya hecho sus selecciones, haga clic en.Generate

Genere código. Cuando se hace,MATLABCoder muestra el código generado.

Si eligió la opción biblioteca dinámica de C/C++, MATLABCoder 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 una con 30369 elementos.Iunsigned char 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 in () se representa como un.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 de tamaño fijo. Se espera que la segunda entrada sea una con 30369 elementos.BWfinalboolean_T Se utiliza para pasar un puntero a la imagen de salida.

Tenga en cuenta que hay una diferencia en la forma y C las matrices de almacén en la memoria. almacena matrices en orden de columna-mayor y C almacena matrices en orden de fila-mayor.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++ ejecutable". En este caso se debe especificar una función principal que invoca el código generado. Tenga en cuenta que no hay utilidades ya preparadas para importar datos. Para obtener un ejemplo, consulte el uso de la asignación de memoria dinámica para una simulación de "átomos" en el MATLABCoder 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 sobre cómo generar código, consulte el MATLABCoder Documentación.

Temas relacionados