Title: Sin ttulo de diapositiva
1PROGRAMACIO DE FUNCIONS VILI EN C
- 1. Nivells de programació en ViLi
- 2. Funcions C de processament dimatges
- tipus dimatge
- atributs i funcions dacces
- operacions de creació i eliminació dimatges
- apuntadors, funcions pel recorregut,
switch(ImType(ima)) - excepcions Raise(ltmissatge errorgt)
- 3. Exemples thr.c , sample2.c
- 4. Funció C dinterficie
- obtenció darguments Lisp xlgalttypegt() ,
xllastarg() , moreargs() - desencapsulament getlttypegt()
- encapsulament cvlttype conversiongt()
- 5. Exemples xthr.c , xsample2.c
- 6. Integració de la nova funció
21. Nivells de programació en ViLi
Interpret de Lisp
Nivell imatge
nodes Lisp
simbols Lisp
taula de funcions de linterpret
Interficie Lisp ?? C
funció en C dinterficie
arguments C
- funcions C
- imlib.dll
- (loadlibrary ... .dll)
Nivell pixel
32. Funcions C de processament dimatges
2.1 Tipus dimatges include\image.h typedef
struct Image char Ident / image
identifier / int Type / image type
IMA_BYTE IMA_SHORT IMA_LONG IMA_FLOAT IMA_COMPLEX
/ int NCol / number of columns / int
NLin / number of lines / int NPlanes /
number of planes 12d image, gt1 3d image /
int NChannels / number of channels ex colour
image (RGB) 3 / int GridType /
GRID_RECT, GRID_HEX / void Data / image
data / Image / image types / define
IM_BYTE 1 define IM_SHORT 2 define IM_LONG
3 define IM_FLOAT 4 define IM_COMPLEX
5 / grid types / define GRID_RECT
1 define GRID_HEX 2 / Tipo byte
/ typedef unsigned char Byte / Tipo complejo
/ typedef struct Complex float Re,Im /
parte real y parte imaginaria / Complex
42. Funcions C de processament dimatges
2.2 Atributs i funcions dacces
include\image.h define ImIdent(Im)
((Im)-gtIdent) define ImType(Im)
((Im)-gtType) define ImNLin(Im)
((Im)-gtNLin) define ImNCol(Im)
((Im)-gtNCol) define ImNPlanes(Im)
((Im)-gtNPlanes) define ImNChannels(Im)
((Im)-gtNChannels) define ImGridType(Im)
((Im)-gtGridType) / Dimensiones en Pixels de la
imagen / define DimImage(Im)
((Im)-gtNChannels(Im)-gtNPlanes(Im)-gtNLin(Im)-gtNC
ol) define DimChannel(Im) ((Im)-gtNPlanes(Im)-gtNL
in(Im)-gtNCol) define DimPlane(Im)
((Im)-gtNLin(Im)-gtNCol) define DimLine(Im)
((Im)-gtNCol)
2.3 Operacions de creació i eliminació
dimatges extern Image NewImage ARGS((char
Ident,int Type,int NCol, int NLin,
int NPlanes,int NChannels,int
GridType)) extern void DelImage
ARGS((Image)) define NewTypeIm(IM,Ident)
NewImage((Ident), \
(IM)-gtType, \ (int)
(IM)-gtNCol,(int) (IM)-gtNLin,(int) (IM)-gtNPlanes,
\ (int) (IM)-gtNChannels,(IM)-gt
GridType) extern void ImRename ARGS((Image,char
)) extern void SetImToVal ARGS((Image,double))
extern Image ImCpy ARGS((Image))
52. Funcions C de processament dimatges
2.4 Apuntadors, funcions pel recorregut ,
switch(ImType(ima))
Image Out register Byte pOut Out
NewImage(Resultat",IM_BYTE,
ncol, nlin, npla, ncha, GRID_RECT) pout
ImageB(Out) for (y0 yltnlin y) for
(x0 xltncol x) pout ....
pout
- les funcions ImageB, ImageS, ImageL, ImageF,
ImageC retornen respectivament - ladreça del primer pixel duna imatge dun
byte, short, long, float, complex per pixel. - els apuntadors de recorregut es declaran
register per intentar que el compilador es
assigni - als registres de la CPU
- depenent del tipus dimatge a generar/recorrer,
el proces es el mateix pero el tipus dels - apuntadors no. Ho distingim fer un
switch(ImType(ima)) (veure exemples).
62. Funcions C de processament dimatges
Quan es detecta un error per qualsevol causa,
voldrem imprimir un missatge dexplicació i
retornar a linterpret Lisp, no pas sortir del
ViLi. Ho fem cridant la funció de gestió
dexceptions ViLi, Raise(Missatge derror\n)
73. Exemples thr( )
Image thr(In, Umbral, Dentro, Fuera) Image
In double Umbral, Dentro, Fuera Image
Out register int NPix
NPixDimImage(In) OutNewTypeIm(In,"Thr")
switch (ImType(In)) case IM_BYTE
register Byte PIn, POut
register Byte u,d,f uUmbral d
Dentro f Fuera for
(PInImageB(In), POutImageB(Out) NPixgt0
--NPix) if (PIn gt u) POut
d else POut f break
case IM_SHORT register
short PIn, POut register short
u,d,f uUmbral d Dentro f
Fuera for (PInImageS(In),
POutImageS(Out) NPixgt0 --NPix)
if (PIn gt u) POut d else POut f
break
8 case IM_LONG register long
PIn, POut register long u,d,f
uUmbral d Dentro f Fuera
for (PInImageL(In), POutImageL(Out) NPixgt0
--NPix) if (PIn gt u) POut
d else POut f break
case IM_FLOAT register
float PIn, POut register float
u,d,f uUmbral d Dentro f
Fuera for (PInImageF(In),
POutImageF(Out) NPixgt0 --NPix)
if (PIn gt u) POut d else POut f
break default
DelImage(Out)
Raise(ErrTypeIm) / switch / return
Out / thr /
93. Exemples sample2( )
/ Funcio que mostreja una imatge seleccionant
punts cada un cert pas. Parametres -
Imatge d'entrada - pas per columna, fila,
pla i canal Retorna una imatge del mateix
tipus que la d'entrada, mostrejada. Errors
algun dels passos es menor que 1 / Image
sample2(In, stepcol, steprow, steppla,
stepcha) Image In int stepcol, steprow, steppla,
stepcha Image Out int filinp,
colinp, plainp, chainp int filout, colout,
plaout, chaout register short fil, col,
pla, cha / per recorrer la imatge In /
/ controls sobre els parametres / if
((steprow lt 1) (stepcol lt 1) (steppla lt 1)
(stepcha lt 1)) Raise(Sample2 step
less than 1\n")
103. Exemples sample2( )
/ nombre de files, columnes, plans i canals
de la imatge d'entrada / filinp
ImNLin(In) colinp ImNCol(In) plainp
ImNPlanes(In) chainp ImNChannels(In)
/ nombre de files, columnes, plans i canals de
la imatge de sortida / filout ceil(
(float) filinp / steprow ) colout ceil(
(float) colinp / stepcol ) plaout ceil(
(float) plainp / steppla ) chaout ceil(
(float) chainp / stepcha ) / creem la
imatge de sortida / Out NewImage("Sample",I
mType(In), colout, filout, plaout, chaout,
GRID_RECT) switch (ImType(In))
case IM_BYTE register
Byte pin, pout pin ImageB(In)
pout ImageB(Out) for
(cha 0 cha lt chainp cha stepcha)
for (pla 0 pla lt plainp pla
steppla) for (fil 0 fil lt
filinp fil steprow)
pin LineB(In, fil, pla, cha)
for (col 0 col lt colinp col stepcol,
pin stepcol, pout)
pout pin
break
113. Exemples sample2( )
case IM_SHORT register
short pin, pout pin ImageS(In)
pout ImageS(Out) for
(cha 0 cha lt chainp cha stepcha)
for (pla 0 pla lt plainp pla
steppla) for (fil 0 fil lt
filinp fil steprow)
pin LineS(In, fil, pla, cha)
for (col 0 col lt colinp col stepcol,
pin stepcol, pout)
pout pin
break case IM_LONG
register long pin, pout pin
ImageL(In) pout ImageL(Out)
for (cha 0 cha lt chainp cha
stepcha) for (pla 0 pla lt
plainp pla steppla) for (fil
0 fil lt filinp fil steprow)
pin LineL(In, fil, pla, cha)
for (col 0 col lt colinp col
stepcol,
pin stepcol, pout)
pout pin
break
123. Exemples sample2( )
case IM_FLOAT register
float pin, pout pin
ImageF(In) pout ImageF(Out)
for (cha 0 cha lt chainp cha
stepcha) for (pla 0 pla lt
plainp pla steppla) for (fil
0 fil lt filinp fil steprow)
pin LineF(In, fil, pla, cha)
for (col 0 col lt colinp col
stepcol,
pin stepcol, pout)
pout pin
break default
DelImage(Out) Raise(ErrTypeIm)
/ switch / return Out / sample2 /
134. Funció C dinterficie
Què fa la funció dinterficie ? 1. Protegeix
els arguments en front al mecanisme
dalliberament de memoria del Lisp 2. Obté i
verifica el tipus dels arguments passats a la
funció de linterpret 3. Verificar el número de
argumentos 4. Desencapsula els arguments
(transforma de Lisp a C) 5. Crida la funció de
processament en C 6. Encapsula el resultat (en
fa un node Lisp) 7. Desprotegeix els arguments
protegits abans 8. Retorna el resultat
xlsave1(LVAL) xlgalttipusgt() getArgument() xllas
targ() si nhi ha més, error moreargs() nhi
ha més encara ? getlttipusgt(LVAL) ltvariable Cgt
sample2(...) cvlttipusgt(ltvariable Cgt) xlpop(),
xlpopn(m) m nombre darguments protegits return
LVAL
144. Funció C dinterficie
Funcions per obtenir i verificar arguments Lisp
de diferents tipus xlgacons() xlgalist() xlgasy
mbol() xlgastring() xlgaobject() xlgafixnum() xlga
flonum() xlganum() xlgachar() xlgavector() xlgastr
eam() xlgaustream() xlgastruct() xlgaclosure() xlg
aimage()
Funcions de desencapsulament getfixnum(x) getflon
um(x) getchcode(x) getnum() getstring(x) getfile(x
) getImage(x)
sencers flotants sencers o flotants
Funcions dencapsulament LVAL
cvsymbol(char) LVAL cvstring(char) LVAL
cvfile(FILE) LVAL cvfixnum(int) LVAL
cvflonum(double) LVAL cvchar(char) LVAL
cvImageNode(Image)
155. Exemples xthr( )
/ Interficie de xthr. Format (thr
ltImagegt ltumbralgt ltDentrogt ltFueragt) / LVAL
xthr() LVAL Out,Arg double Umbral,
Dentro, Fuera xlsave1(Arg)
Argxlgaimage() Umbralgetnum(xlganum())
Dentro255.0 Fuera0.0 if (moreargs())
Dentrogetnum(xlganum())
Fueragetnum(xlganum()) xllastarg()
OutcvImageNode(Thr(getImage(Arg), Umbral,
Dentro, Fuera)) xlpop() return Out
165. Exemples xsample2( )
/ Interficie de sample2 Format ( sample2
ltImagegt ltintgt ltintgt ltintgt ltintgt )
Parametres imatge a mostrejar i pas per
columna, fila, pla i canal en
aquest ordre. Per defecte el pas es 1 / LVAL
xsample2 () LVAL Arg, Out int
ArgNum4 / maxim 4 arguments de pas / int
i xlsave1(Arg) Argxlgaimage()
/ llegim els passos i posem valors per defecte
/ for (i0 ilt4 i) ArgNumi 1
for (i0 ilt4 i) if (!moreargs())
break ArgNumigetfixnum(xlgafixnum())
xllastarg() Out cvImageNode (
sample2 (getImage(Arg), ArgNum0, ArgNum1,
ArgNum2,
ArgNum3) ) xlpop() return Out
176. Integració duna nova funció (Visual C)
- Cal crear una DLL amb Visual C que contingui la
nova funció a afegir al ViLi. - Crear un arxiu ltfunciogt.cpp que contingui
- a) includes ViLi f) funció (fixe) DllMain( )
com - include ltxlisp.hgt als exemples Sample2 i
- include ltimage.hgt diamferet de
- \CrossVisions\Examples\ViLi\
- b) altres includes necessaris, com ara
- include ltmath.hgt
- c) codi funció, ltfunciogt(), per exemple sample2()
- d) codi interficie de la funció xltfunciogt(), per
exemple xsample2() - e) define S SUBR
- define F FSUBR
- FUNDEF localFunTab
- "SAMPLE2", S, xsample2 ,
- 0, 0, 0
-
186. Integració duna nova funció (Visual C)
- 2. Entrar en Visual C i crear un projecte nou
de DLL, seguint al peu de la lletra - les instruccions de larxiu
- CrossVisions\Doc\Readme.txt
- a lapartat DLL ViLi o VisionOk
- 3. Copiar la DLL creada a \Debug al directori de
ViLi - CrossVisions\lib\
- 4. Executar entrant en ViLi i fent
- ViLigt (loadlibrary .dll)
- Consells
- editar larxiu dexemple Sample2.cpp per
fer el vostre. - provar en ViLi la funció polar amb
testpol.lsp
196. Integració duna nova funció (GCC per Unix,
Windows)
1. Copiar els fitxers del directori vili\usr de
la distribució de ViLi al directori de
treball. 2. Per a cada nova funció (p.e.
sample2), 2.1 al fitxer ...
afegir-hi
Usrftab.h
"SAMPLE2", S, xsample2 ,
Usrflib.h
extern Image sample2 ARGS((Image, int, int,
int, int))
Usrfdef.h
extern LVAL xsample2 ARGS((void))
2.2 Modificar el fitxer makefile afegint al lloc
apropiat xsample2.o xsample2.c usrfdef.h
usrflib.h sample2.o sample2.c usrflib.h OBJS
\ xsample2.o
sample2.o
2.3 Executar make desde DOS per fer un vili.exe
propi global nova funció
206. Integració duna nova funció
MAKEFILE DE VILI PARA GCC -
DOS
Definicion de las utilidades
y directorios Flags de compilacin en MSDOS
VILI es una variable de entorno establecida en
MS-DOS (p.e. set VILI c\archiv1\vili) CFLAG
S -W -g -m486 -I. -D_USR_ -D_USER_INTER_ GCC
gcc -I(VILI)/include -D_XLISP_
(CFLAGS) .c.o (GCC) -c -o _at_ lt all
ViLi.EXE
DEPENDENCIAS DE LOS
FICHEROS DE USUARIO xsample2.o xsample2.c
usrfdef.h usrflib.h sample2.o sample2.c
usrflib.h xshift.o xshift.c usrfdef.h
usrflib.h shift.o shift.c usrflib.h ...
etc. con todos los ficheros que contienen las
funciones citadas en los ficheros de include
usrf xbaiesima.o xbaiesima.c usrfdef.h
usrflib.h baiesima.o baiesima.c usrflib.h
Makefile
216. Integració duna nova funció
OBJETOS A LINKAR CON VILI
Modificar la siguiente linea para linkar con mas
ficheros si ocupan mas de una linea poner \ al
final de la linea. OBJS xsample2.o sample2.o
\ xshift.o shift.o \ xswapshort.o
swapshort.o \ ... xgabor.o
gabor.o \ xbaiesima.o baiesima.o
DEPENDENCIAS DE VILI xlftab.o usrftab.h
usrfdef.h (GCC) -c -o xlftab.o
(VILI)/xlisp/xlftab.c
Linkar
ViLi usuario ViLi.EXE (OBJS)
xlftab.o (GCC) -c -o Banner.o
(VILI)/xlisp/banner.c (GCC) -o vili.out
(VILI)/obj/vili.o (VILI)/obj/malloc.o\ (OBJS)\
banner.o XLFTab.o -lm -lpc -lgrx20 ViLi
ViLi.EXE