Uso+de+cvSeq+y+ejemplos+con+secuencias

=Uso de secuencias en OpenCV= code format="c" /*Hecho por German Urrego Y Francisco Calderón si va a usar este programa como referencia por favor referenciar el trabajo de grado de pregrado titulado: Conteo automático de vehículos Pontificia universidad javeria Licencia CC 3.0 http://creativecommons.org/licenses/by-sa/3.0/deed.es_CO Referencias: Test Code for the CvSeq Data Structure in openCv tomado de http://www.vrac.iastate.edu/575x/S07/doku.php?id=code_samples:sequences Escrito por Alexander Stoytchev. struct blob {// entiendase como blob a algun elemento de interes de la imagen representado como una mancha blanca en fondo negro que en seguido por algun algoritmo int Id; //identificador del blob CvPoint pta;//punto donde esta el centro del contorno antes CvPoint ptd;//punto donde esta el centro del contorno después float dist;//distancia al anterior blob 0 si es nuevo int flag;//bandera para saber si esta asignado o no, 1 no asignado 0 si ya float velocidad;//velocidad del blob en pixeles por frame px/fr * fr/s = px/s y px/s m/px = m/s y lista la velocidad!!! }; blob nuevoblob(int aid, CvPoint pt1,CvPoint pt0,float dst,int flag,float vel) {	blob nblob={aid,pt1,pt0,dst,flag,vel};//inicialización de blob a retornar return nblob; } void ejemplosecuenciadesecuencias(void) {	// 1. Creacion de 3 secuencias de enteros CvMemStorage* storage0 = cvCreateMemStorage(0); CvSeq* seq0 = cvCreateSeq( 0, /* HAGA UNA SECUENCIA GENERICA */	sizeof(CvSeq), /* SIEMPRE VA ACÁ tamaño del header*/	sizeof(int), /* TAMAÑO DEl ELEMENTO DE LA SECUENCIA */	storage0 /* EL CvMemStorage DE ALMACENAMIENTO */ ); CvMemStorage* storage1 = cvCreateMemStorage(0); CvSeq* seq1 = cvCreateSeq( 0, /* HAGA UNA SECUENCIA GENERICA  */	sizeof(CvSeq), /*  SIEMPRE VA ACÁ tamaño del header */	sizeof(int), /* TAMAÑO DEl ELEMENTO DE LA SECUENCIA */	storage1 /*  EL CvMemStorage DE ALMACENAMIENTO */ ); CvMemStorage* storage2 = cvCreateMemStorage(0); CvSeq* seq2 = cvCreateSeq( 0, /* HAGA UNA SECUENCIA GENERICA */	sizeof(CvSeq), /* SIEMPRE VA ACÁ tamaño del header*/	sizeof(int), /* TAMAÑO DEl ELEMENTO DE LA SECUENCIA */	storage2 /* EL CvMemStorage DE ALMACENAMIENTO */ ); printf("\nSEQ0: PUSH (DE ATRAS)\n"); for( int i = 0; i < 5; i++ ) {		int* added = (int*)cvSeqPush( seq0, &i ); printf( "\t%d SE INSERTO\n", *added ); }	printf("\nSEQ1: VACIA\n"); printf("\nSEQ2: PUSH (POR EL FRENTE)\n"); for( int i = 20; i < 24; i++ ) {		int* added = (int*)cvSeqPushFront( seq2, &i ); printf( "\t%d SE INSERTO\n", *added ); }	// Crear una secuencia de secuencias de enteros CvMemStorage* storage = cvCreateMemStorage(0); CvSeq* seq = cvCreateSeq( 0, /* HAGA UNA SECUENCIA GENERICA */	sizeof(CvSeq), /* SIEMPRE VA ACÁ tamaño del header*/	sizeof(CvSeq), /* TAMAÑO DEl ELEMENTO DE LA SECUENCIA OJO cambió ahora es secuencia*/	storage /* EL CvMemStorage DE ALMACENAMIENTO */ ); //añador las 3 secuencias cvSeqPush(seq, seq0); cvSeqPush(seq, seq1); cvSeqPush(seq, seq2); printf("\nImprimir la secuencia de secuencias de enteros\n"); for( int i = 0; i < seq->total; i++ ) {		printf("\t Sub-Sequencia %d:\n", i); CvSeq* ss = (CvSeq*)cvGetSeqElem(seq, i ); if(ss->total == 0) {			printf("\t\t \n"); }		else {			for( int j = 0; j < ss->total; j++ ) {				int* number = (int*)cvGetSeqElem(ss, j ); printf( "\t\t [%d] -> %d\n", j, *number ); }		}	}	/* eliminar los storages al final "Es una buena practica hacerlo" */ cvReleaseMemStorage( &storage0 ); cvReleaseMemStorage( &storage1 ); cvReleaseMemStorage( &storage2 ); cvReleaseMemStorage( &storage ); } int main {	blob NBlob; /*inicialización del blob de ejemplo*/ NBlob.dist=1.4142; NBlob. flag=1; NBlob.ptd.x=2; NBlob.ptd.y=2; NBlob.pta.x=1; NBlob.pta.y=1; NBlob.velocidad=1.0; /*fin de la inicialización de blob*/
 * 1) include 
 * 2) include "cv.h"
 * 3) include "cvaux.h"
 * 4) include "highgui.h"
 * 5) include "cxcore.h"
 * 1) include "cxcore.h"

/*DECLARACIÓN DE UNA SECUENCIA DE BLOBS USANDO CVSEQ Y LA ESTRUCTURA BLOBS DE PREFERENCIA*/ CvMemStorage* almacenamiento_de_blobs = cvCreateMemStorage(0); CvSeq* blobs = cvCreateSeq( 0, /* HAGA UNA SECUENCIA GENERICA */	sizeof(CvSeq), /* SIEMPRE VA ACÁ ??? */	sizeof(blob), /* TAMAÑO DE LA SECUENCIA */	almacenamiento_de_blobs /* EL CvMemStorage DE ALMACENAMIENTO */ ); /*añadir blobs*/ for( int i = 0; i < 3; i++ )//para añadir 3 blobs {		NBlob.Id=i; blob* pblob = (blob*)cvSeqPush( blobs, &NBlob );//por delante //blob* pblob = (blob*)cvSeqPushFront( blobs, &NBlob );//por detras printf( "añadi un blob que estaba en (%d,%d) y paso a (%d,%d) con el Id %d\n", pblob->pta.x,pblob->pta.y, pblob->ptd.x,pblob->ptd.y,i); }	printf( "\n***************************************************\n");

//traer información de la secuencia for( int i = 0; i < blobs->total; i++ ) {		blob* tblob = (blob*)cvGetSeqElem(blobs, i ); printf( "encontre un blob que estaba en (%d,%d) y paso a (%d,%d) con el Id %d\n", tblob->pta.x,tblob->pta.y, tblob->ptd.x,tblob->ptd.y,tblob->Id); }	printf( "\n***************************************************\n"); //borrar un blob seleccionado int b=2; cvSeqRemove( blobs, b );//borra el blob x de la secuencia printf( "borre el blob %d\n",++b);//++x suma primero y luego pasa el dato printf( "\n***************************************************\n"); //traer información de la secuencia y modificarla for( int i = 0; i < blobs->total; i++ ) {		blob* tblob = (blob*)cvGetSeqElem(blobs, i ); printf( "encontre un blob que estaba en (%d,%d) y paso a (%d,%d) con el Id %d\n", tblob->pta.x,tblob->pta.y, tblob->ptd.x,tblob->ptd.y,tblob->Id); tblob->pta.x++; tblob->pta.y++; tblob->ptd.x++; tblob->ptd.y++; printf( "y lo cambie a en (%d,%d) y paso a (%d,%d) con el Id %d\n", tblob->pta.x,tblob->pta.y, tblob->ptd.x,tblob->ptd.y,tblob->Id); }	printf( "\n***************************************************\n"); //traer información de la secuencia for( int i = 0; i < blobs->total; i++ ) {		blob* tblob = (blob*)cvGetSeqElem(blobs, i ); printf( "encontre un blob que estaba en (%d,%d) y paso a (%d,%d) con el Id %d\n", tblob->pta.x,tblob->pta.y, tblob->ptd.x,tblob->ptd.y,tblob->Id); }	printf( "\n***************************************************\n");

/*BORRAR BLOBS PERDIDOS*/ int numblob=blobs->total; for(int p = 0;p < numblob ;p++)//p recorre los blobs para borrar lo que no esté marcado con flag=1 {		blob* tblob = (blob*)cvGetSeqElem(blobs, p );//trae la información de blob i		if(tblob->flag)//si la bandera esta en uno lo borra {			cvSeqRemove( blobs, p );//borra el blob x de la secuencia if (p!=0)//mientras no sea el último blob que queda {				p--;//si no se pone eso se queda un blob sin revisar //              printf( "estoy en (%d,%d)\n",p,numblob); }			numblob--; }

}	if(blobs->total) printf( "todos los blobs borrados\n");

//libera el espacio de memoria donde se guardaron los blobs cvReleaseMemStorage( &almacenamiento_de_blobs ); printf( "\n-+***********************************************+-\n"); printf( "Segundo ejemplo, secuencia de secuencias\n"); printf( "\n---\n"); ejemplosecuenciadesecuencias; return 0; }

code