亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? minutia.c

?? 指紋識別 C代碼
?? C
字號:
/*############################################################################# * 文件名:minutia.c * 功能:  細節點的一些函數接口 * modified by  PRTsinghua@hotmail.com#############################################################################*/#include <string.h>#include <stdlib.h>#include <math.h>#include "minutia.h"typedef struct iFvsMinutiaSet_t{    FvsInt_t     nbminutia;     FvsInt_t     tablesize;    FvsMinutia_t ptable[1]; } iFvsMinutiaSet_t;/******************************************************************************  * 功能:創建一個細節點集合  * 參數:size  集合的大小  * 返回:若失敗,返回空;否則返回新的對象句柄******************************************************************************/FvsMinutiaSet_t MinutiaSetCreate(const FvsInt_t size){    iFvsMinutiaSet_t* p = NULL;    p = (iFvsMinutiaSet_t*)malloc(sizeof(iFvsMinutiaSet_t)    				+size*sizeof(FvsMinutia_t));    if (p!=NULL)    {       	/* 表中無細節點 */        p->nbminutia = 0;        p->tablesize = size;    }        return (FvsMinutiaSet_t)p;}/******************************************************************************  * 功能:銷毀細節點集合。  *       一旦銷毀,該對象不再可以為任何函數所用,直到重新申請。  * 參數:minutia      細節點集合  * 返回:無******************************************************************************/void MinutiaSetDestroy(FvsMinutiaSet_t minutia){    iFvsMinutiaSet_t* p = NULL;    if (minutia==NULL)        return;    p = minutia;    free(p);}/******************************************************************************  * 功能:獲得細節點集合的大小  * 參數:minutia      細節點集合  * 返回:細節點集合大小******************************************************************************/FvsInt_t MinutiaSetGetSize(const FvsMinutiaSet_t min){    const iFvsMinutiaSet_t* minutia = (iFvsMinutiaSet_t*)min;    FvsInt_t nret = 0;        if (minutia!=NULL)        nret = minutia->tablesize;    return nret;}/******************************************************************************  * 功能:細節點集合的實際元素個數  * 參數:minutia      細節點集合  * 返回:元素個數******************************************************************************/FvsInt_t MinutiaSetGetCount(const FvsMinutiaSet_t min){    const iFvsMinutiaSet_t* minutia = (iFvsMinutiaSet_t*)min;    FvsInt_t nret = 0;        if (minutia!=NULL)        nret = minutia->nbminutia;    return nret;}/******************************************************************************  * 功能:返回細節點集合的數據緩沖區指針  * 參數:minutia      細節點集合  * 返回:指針******************************************************************************/FvsMinutia_t* MinutiaSetGetBuffer(FvsMinutiaSet_t min){    iFvsMinutiaSet_t* minutia = (iFvsMinutiaSet_t*)min;    FvsMinutia_t* pret = NULL;    if (minutia!=NULL)        pret = minutia->ptable;    return pret;}/******************************************************************************  * 功能:清空細節點集合  * 參數:minutia      細節點集合  * 返回:錯誤編號******************************************************************************/FvsError_t MinutiaSetEmpty(FvsMinutiaSet_t min){    iFvsMinutiaSet_t* minutia = (iFvsMinutiaSet_t*)min;    FvsError_t nRet = FvsOK;    if (minutia!=NULL)        minutia->nbminutia = 0;    else        nRet = FvsMemory;    return nRet;}/******************************************************************************  * 功能:在集合中添加一個細節點,如果滿了,返回一個錯誤  * 參數:minutia      細節點集合  *       x            細節點的X坐標  *       y            細節點的Y坐標  *       type         細節點類型  *       angle        角度  * 返回:錯誤編號******************************************************************************/FvsError_t MinutiaSetAdd(FvsMinutiaSet_t min,       const FvsFloat_t x, const FvsFloat_t y,       const FvsMinutiaType_t type, const FvsFloat_t angle){    iFvsMinutiaSet_t* minutia = (iFvsMinutiaSet_t*)min;    FvsError_t nRet = FvsOK;    if (minutia->nbminutia < minutia->tablesize)    {        minutia->ptable[minutia->nbminutia].x       = x;        minutia->ptable[minutia->nbminutia].y       = y;        minutia->ptable[minutia->nbminutia].type    = type;        minutia->ptable[minutia->nbminutia].angle   = angle;        minutia->nbminutia++;    }    else        /* 表中無空間 */        nRet = FvsMemory;    return nRet;}static FvsError_t MinutiaSetCheckClean(FvsMinutiaSet_t min){    iFvsMinutiaSet_t* minutia = (iFvsMinutiaSet_t*)min;    FvsError_t    nRet = FvsOK;    FvsFloat_t    tx, ty, ta;    FvsInt_t      i, j;    FvsMinutia_t* mi, *mj;    tx = 4.0;    ty = 4.0;    ta = 0.5;    if (minutia!=NULL && minutia->nbminutia > 1)    {        /* 檢驗表中是否已有該細節點 */        for (j = 0;   j < minutia->nbminutia; j++)        for (i = j+1; i < minutia->nbminutia; i++)        {            mi = minutia->ptable + i;            mj = minutia->ptable + j;            /* 比較細節點i,j */            /* 規則 1: 相似的細節點彼此靠近 -> 刪除一個 */            if ( (fabs(mi->x     - mj->x    ) < tx) &&                 (fabs(mi->y     - mj->y    ) < ty) &&                 (fabs(mi->angle - mj->angle) < ta)               )            {                minutia->nbminutia--;                *mi = minutia->ptable[minutia->nbminutia];            }            /* 規則 2: 方向相反,距離靠近 -> 同時刪除 */        }    }    else        /* 表中無空間 */        nRet = FvsMemory;    return nRet;}#define P(x,y)      p[(x)+(y)*pitch]/******************************************************************************  * 功能:在圖像中畫出細節點,不改變背景  * 參數:minutia      細節點集合  *       image        指紋圖像  * 返回:錯誤編號******************************************************************************/FvsError_t MinutiaSetDraw(const FvsMinutiaSet_t min, FvsImage_t image){    FvsInt_t w       = ImageGetWidth(image);    FvsInt_t h       = ImageGetHeight(image);    FvsInt_t pitch   = ImageGetPitch(image);    FvsByte_t* p     = ImageGetBuffer(image);    FvsInt_t n, x, y;    FvsFloat_t fx, fy;    FvsMinutia_t* minutia = MinutiaSetGetBuffer(min);    FvsInt_t nbminutia    = MinutiaSetGetCount(min);    if (minutia==NULL || p==NULL)        return FvsMemory;    /* 畫出每個細節點 */    for (n = 0; n < nbminutia; n++)    {        x = (FvsInt_t)minutia[n].x;        y = (FvsInt_t)minutia[n].y;        if (x<w-5 && x>4)        {            if (y<h-5 && y>4)            {                switch (minutia[n].type)                {                case FvsMinutiaTypeEnding:                    P(x,y)    = 0xFF;                    P(x-1, y) = 0xA0;                    P(x+1, y) = 0xA0;                    P(x, y-1) = 0xA0;                    P(x, y+1) = 0xA0;                    break;                case FvsMinutiaTypeBranching:                    P(x,y)    = 0xFF;                    P(x-1, y-1) = 0xA0;                    P(x+1, y-1) = 0xA0;                    P(x-1, y+1) = 0xA0;                    P(x+1, y+1) = 0xA0;                    break;                default:                    continue;                }                fx = sin(minutia[n].angle);                fy = -cos(minutia[n].angle);                P(x+(int32_t)(fx)    ,y+(int32_t)(fy)    ) = 0xFF;                P(x+(int32_t)(fx*2.0),y+(int32_t)(fy*2.0)) = 0xFF;                P(x+(int32_t)(fx*3.0),y+(int32_t)(fy*3.0)) = 0xFF;                P(x+(int32_t)(fx*4.0),y+(int32_t)(fy*4.0)) = 0xFF;                P(x+(int32_t)(fx*5.0),y+(int32_t)(fy*5.0)) = 0xFF;            }        }    }    return FvsOK;}/* 宏定義 */#define P1  P(x  ,y-1)#define P2  P(x+1,y-1)#define P3  P(x+1,y  )#define P4  P(x+1,y+1)#define P5  P(x  ,y+1)#define P6  P(x-1,y+1)#define P7  P(x-1,y  )#define P8  P(x-1,y-1)/******************************************************************************  * 功能:從細化圖像中提取細節點,并儲存到集合中。  *       申請的細節點集合必須足夠大,如果太小了,滿了后會停止搜索細節點。  * 參數:minutia      細節點集合,用來保存細節點  *       image        細化后的圖像  *       direction    用來計算方向用  *       mask         用來表示有效的指紋區域  * 返回:錯誤編號******************************************************************************/FvsError_t MinutiaSetExtract    (    FvsMinutiaSet_t       minutia,    const FvsImage_t      image,    const FvsFloatField_t direction,    const FvsImage_t      mask    ){    FvsInt_t w      = ImageGetWidth(image);    FvsInt_t h      = ImageGetHeight(image);    FvsInt_t pitch  = ImageGetPitch(image);    FvsInt_t pitchm = ImageGetPitch(mask);    FvsByte_t* p    = ImageGetBuffer(image);    FvsByte_t* m    = ImageGetBuffer(mask);    FvsInt_t   x, y;    FvsFloat_t angle = 0.0;    FvsInt_t   whitecount;    if (m==NULL || p==NULL)        return FvsMemory;    (void)MinutiaSetEmpty(minutia);    /* 遍歷圖像,提取細節點 */    for (y = 1; y < h-1; y++)    for (x = 1; x < w-1; x++)    {        if (m[x+y*pitchm]==0)             continue;        if (P(x,y)==0xFF)        {            whitecount = 0;            if (P1!=0) whitecount++;            if (P2!=0) whitecount++;            if (P3!=0) whitecount++;            if (P4!=0) whitecount++;            if (P5!=0) whitecount++;            if (P6!=0) whitecount++;            if (P7!=0) whitecount++;            if (P8!=0) whitecount++;            switch(whitecount)            {            case 0:                /* 孤立點,忽略 */                break;            case 1:                /* 檢測角度 */  	            angle = FloatFieldGetValue(direction, x, y);                (void)MinutiaSetAdd(minutia, (FvsFloat_t)x, (FvsFloat_t)y,                              FvsMinutiaTypeEnding, (FvsFloat_t)angle);                break;            case 2:                break;            default:                {     	            angle = FloatFieldGetValue(direction, x, y);                    (void)MinutiaSetAdd(minutia, (FvsFloat_t)x, (FvsFloat_t)y,                                  FvsMinutiaTypeBranching, (FvsFloat_t)angle);                }                break;            }        }    }    (void)MinutiaSetCheckClean(minutia);        return FvsOK;}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产欧美视频在线观看| 国产日韩欧美高清在线| 亚洲午夜免费电影| 亚洲高清免费视频| 欧美中文字幕一区| 人人狠狠综合久久亚洲| 中文字幕av一区二区三区高 | 精品国免费一区二区三区| 中文字幕在线观看不卡| av在线播放成人| 亚洲精品成人a在线观看| 欧美喷潮久久久xxxxx| 懂色av中文字幕一区二区三区 | 久久久不卡影院| 精品国产一区a| 国产91精品一区二区麻豆网站| 国产传媒一区在线| 国产夜色精品一区二区av| 精品一区二区三区免费播放| 久久久久99精品一区| 欧美日本在线观看| 色哟哟精品一区| 国产成人小视频| 麻豆精品新av中文字幕| 亚洲国产日日夜夜| 欧美日韩五月天| 亚洲欧美在线观看| 久久嫩草精品久久久精品| 欧美系列在线观看| 一本久久综合亚洲鲁鲁五月天| 东方欧美亚洲色图在线| 国产美女精品人人做人人爽 | 国产精品久久久久久亚洲毛片 | 成人综合婷婷国产精品久久免费| 亚洲情趣在线观看| 亚洲欧美电影院| 亚洲精品一卡二卡| 亚洲一区二区黄色| 国产99久久久久久免费看农村| 国产精品亚洲人在线观看| 黑人巨大精品欧美黑白配亚洲| 日韩国产欧美三级| 精品一区二区三区免费视频| 精品一区精品二区高清| 成人av免费在线播放| 91亚洲精华国产精华精华液| 99精品桃花视频在线观看| 欧美情侣在线播放| 国产午夜精品在线观看| 亚洲午夜精品在线| 久久久精品国产免费观看同学| 欧美激情资源网| 一区二区成人在线观看| 国产麻豆精品久久一二三| 在线观看三级视频欧美| 26uuu精品一区二区| 亚洲黄色在线视频| 暴力调教一区二区三区| 日韩免费性生活视频播放| 久久久综合精品| 亚洲欧美色图小说| 国产一区二区福利视频| 欧美日韩一区小说| 亚洲精品中文在线| 99国产精品久久久久久久久久久| 久久亚洲一区二区三区四区| 欧美96一区二区免费视频| 欧美自拍偷拍午夜视频| 亚洲精品成人在线| 色噜噜夜夜夜综合网| 久久免费电影网| 国产成人免费在线观看不卡| 日韩欧美国产综合在线一区二区三区| 五月天一区二区| 欧美日韩久久久| 麻豆精品视频在线观看免费| 精品99一区二区| av不卡在线观看| 亚洲国产aⅴ天堂久久| 日韩欧美国产精品| 国产成人免费视| 国产精品视频免费看| 色偷偷88欧美精品久久久 | 国产三级欧美三级日产三级99 | 欧美日韩一级黄| 青青青爽久久午夜综合久久午夜| 欧美一区二区视频免费观看| 蜜桃av噜噜一区| 亚洲免费在线看| 欧美色爱综合网| 国产裸体歌舞团一区二区| 亚洲一区二区三区在线播放| 666欧美在线视频| 99久久精品国产毛片| 免费成人av资源网| 亚洲香肠在线观看| 亚洲国产精品成人久久综合一区| 欧美另类一区二区三区| 国产成人免费视频一区| 午夜精品久久久久久久| 国产精品你懂的在线| 欧美成人一区二区三区片免费| 顶级嫩模精品视频在线看| 精品午夜久久福利影院| 爽好多水快深点欧美视频| 亚洲三级电影网站| 亚洲私人黄色宅男| 日本一区二区三区国色天香| 欧美不卡视频一区| 精品日韩99亚洲| 欧美不卡一区二区| 久久久三级国产网站| 欧美亚洲另类激情小说| 久久国产精品第一页| 毛片av一区二区| 久久99国产精品免费网站| 久久机这里只有精品| 日韩专区在线视频| 蜜桃视频免费观看一区| 秋霞影院一区二区| 久久66热偷产精品| 成人性生交大合| 色婷婷亚洲精品| 欧美日韩卡一卡二| 国产亚洲短视频| 亚洲国产视频在线| 黑人巨大精品欧美一区| 91丝袜呻吟高潮美腿白嫩在线观看| 97久久超碰精品国产| 欧美色国产精品| 久久久99精品免费观看不卡| 玉米视频成人免费看| 奇米精品一区二区三区在线观看一| 美国欧美日韩国产在线播放| av不卡免费电影| 欧美一区二区三区免费在线看| 国产女同性恋一区二区| 亚洲国产精品影院| 91视频精品在这里| 欧美国产欧美综合| 久久国产精品第一页| 91高清视频免费看| 国产精品初高中害羞小美女文| 五月天丁香久久| 91美女在线看| 亚洲欧洲av另类| 成人性色生活片免费看爆迷你毛片| 日韩免费福利电影在线观看| 午夜伦理一区二区| 色欧美乱欧美15图片| 国产无人区一区二区三区| 久久激情综合网| 久久久不卡影院| 国产乱码字幕精品高清av| 久久日一线二线三线suv| 蜜桃视频一区二区| 久久精品亚洲精品国产欧美| 久久精品国产99| 国产精品系列在线| 91亚洲大成网污www| 亚洲成人激情社区| 欧美电视剧在线看免费| 国产一区二区伦理片| 国产精品久久久久久久久免费樱桃| 国产剧情在线观看一区二区| 国产精品理论在线观看| 91蜜桃视频在线| 久久97超碰国产精品超碰| 国产精品美女视频| 在线观看91精品国产入口| 免费在线看成人av| 欧美国产激情二区三区| 欧美三级视频在线观看 | 美女任你摸久久| 中文字幕制服丝袜成人av | 在线观看av一区二区| 国产在线视频一区二区三区| 26uuuu精品一区二区| 一本大道综合伊人精品热热 | 日韩电影一二三区| 国产精品人妖ts系列视频| 欧美精品亚洲二区| 99在线视频精品| 国产成人夜色高潮福利影视| 日日摸夜夜添夜夜添精品视频| 国产精品成人一区二区艾草| 日韩精品一区二区三区三区免费 | 美女看a上一区| 中文一区二区完整视频在线观看| 成人污污视频在线观看| 欧美韩国日本综合| 国产一区啦啦啦在线观看| 国产精品三级电影| 91香蕉视频在线| 日本伊人午夜精品| 一区二区三区四区在线| 免费成人av在线| 日韩制服丝袜先锋影音| 亚洲午夜精品17c| 午夜不卡av在线|