Integrálkép - FPGA

     Egy újabb lépéssel vagyunk közelebb a projekt végéhez. Megírtam az integrálkép számolás programot FPGA-ra. Lényege, hogy a sorosan beküldött információkból integrálképet számol, hogy majd a későbbiekben fel tudjuk használni a Viola-Jones féle arcfelismeréshez.

     Forráskód :

#include "xparameters.h"

#include "stdio.h"

#include "xutil.h"

#include "xuartlite.h"

#include "xuartlite_l.h"

#include "xintc_l.h"

#include "xgpio.h"

//====================================================
// Definitions
//====================================================

#define BAUDRATE 115200
#define USE_PARITY 0
#define PARITY_ODD 1
#define DATABITS 8

//====================================================
// GLOBAL VARIABLES
//====================================================
int data;
XUartLite serial;
u32 *intimage=(u32*)XPAR_MICRON_RAM_MEM0_BASEADDR;
Xuint8 szelesseg=0, magassag=0;
Xuint8 x=0, y=0;
unsigned int sor_osszeg;
Xuint8 flag=0;

//====================================================
// INTERRUPT HANDLER FUNCTION
//====================================================

void uart_interrupt_handler(void* addr_p)
{ 
    int empty;
        empty = XUartLite_IsReceiveEmpty(XPAR_RS232_PORT_BASEADDR);
            if (empty == FALSE )
            data = XUartLite_RecvByte(XPAR_RS232_PORT_BASEADDR);
        if(flag==1) //itt olvassuk be a kepmeretet.
        {
            intimage[x+szelesseg*y]=data;
            x=x+1;
            if(x>szelesseg) 
            {
                y=y+1;
                x=0;
            }
        }
        if(flag == 2)//itt olvassuk be az adatokat.
        {
            if(szelesseg > 0)
                magassag = data;
            else szelesseg = data;
            if((szelesseg > 0)&&(magassag > 0)) flag = 0;
        }
}

int main()
{
unsigned int i;
//XUartLite serial;
//XUartLite_Config UART_Configuration;
//UART_Configuration.DeviceId = XPAR_RS232_SECOND_DEVICE_ID;
//UART_Configuration.RegBaseAddr = XPAR_RS232_SECOND_BASEADDR;
//UART_Configuration.BaudRate = BAUDRATE;
//UART_Configuration.UseParity = USE_PARITY;
//UART_Configuration.ParityOdd = PARITY_ODD;
//UART_Configuration.DataBits = DATABITS; 
//
// //UART init:
//XUartLite_CfgInitialize (&serial, &UART_Configuration, XPAR_RS232_PORT_BASEADDR) ;
//
//xil_printf("UART configured to send any data.\n");
////-----------------
    
    XIntc_RegisterHandler(XPAR_XPS_INTC_0_BASEADDR,
                                 XPAR_INTC_0_UARTLITE_1_VEC_ID,
                                 (XInterruptHandler)uart_interrupt_handler,
                                 (void *)XPAR_RS232_PORT_BASEADDR);    
    
    XIntc_MasterEnable(XPAR_XPS_INTC_0_BASEADDR);
    
    XIntc_EnableIntr(XPAR_XPS_INTC_0_BASEADDR, 0x1);
    
    XIntc_EnableIntr(XPAR_XPS_INTC_0_BASEADDR, XPAR_RS232_PORT_INTERRUPT_MASK);
    
    XUartLite_Initialize(&serial,XPAR_RS232_PORT_DEVICE_ID);
    
    XUartLite_SetRecvHandler(&serial,
                                     (XUartLite_Handler)  uart_interrupt_handler,  
                                     (void *)XPAR_RS232_PORT_BASEADDR);  
    
    XUartLite_EnableInterrupt(&serial);  
    
    microblaze_enable_interrupts();
    
    xil_printf("Add meg a kep szelesseget es magassagat. \n");
    
    flag = 2;
    while(flag == 2);
    
    xil_printf("Szelesseg = %d     Magassag = %d\n",szelesseg,magassag);

    xil_printf("Kuldjed a pixel ertekeket, balrol jobbra es fentrol lefele. \n");
    x=0;
    y=0;
    flag=1;
    while(y<magassag);
    flag = 0;
    
    for (x=0;x<szelesseg-1;x++)
    {
    intimage[x+1]=intimage[x]+intimage[x+1];
    xil_printf("X : %d, INT[x] = %d\n",x+1,intimage[x+1]);
    }
    xil_printf("-----------------------Elso sor megvan.-----------------------\n");
    for(y=1;y<magassag;y++)
    {
        for(x=0;x<szelesseg;x++)
        {
            sor_osszeg = sor_osszeg+intimage[y*szelesseg+x];
            intimage[y*szelesseg+x]=intimage[(y-1)*szelesseg+x]+sor_osszeg;
            xil_printf("X = %d, Y = %d, INT = %d\n",x,y,intimage[y*szelesseg+x]);
        }
        sor_osszeg = 0;
    }
    xil_printf("-----------------------Vegeztunk.-----------------------\n");
}



     Úgy érzem, nem igazán kell kommentárt hozzáfűzzek. Interruptban lekezeljük az érkező információt, majd miután minden pixelérték megérkezett, fogjuk és kiszámoljuk belőle az integrálkép értékét. Figyelni kell mindenképp a változók tipusára, mert Xuint8-ban csak 255-ig tudunk elszámolni. Vagyis, ha 255-nél nagyobb valamelyik paraméterünk (szélesség vagy magasság), akkor mindenképp meg kell változtatni a tipust Xuint16-ra, vagy valami hasonlóra.

Mégegy érdekesség : Rengeteget használom a ledeket, hogy a lehetséges hibákat észrevegyem és ki tudjam küszöbölni. Ha benne vannak a ledek is a programban, (vagyis debug mód), akkor

mb-size TestApp_Memory_microblaze_0/executable.elf 
   text       data        bss        dec        hex    filename
  10470        412       2210      13092       3324    TestApp_Memory_microblaze_0/executable.elf


ha meg nincs benne, akkor

mb-size TestApp_Memory_microblaze_0/executable.elf 
   text       data        bss        dec        hex    filename
   8602        380       2190      11172       2ba4    TestApp_Memory_microblaze_0/executable.elf

Erre is érdemes odafigyelni, ha az ember egy nagyobb projektet készül megvalósítani. Egy kis fölösleges ledvillogtatás, és már nem is férünk bele a memóriába.

     Röviden ennyi mára. Asszem átnézem egy kicsit a kinematikát, mert abból még nagyon zéró vagyok.

0 megjegyzés:

Megjegyzés küldése

Return top