-
大小: 13KB文件類(lèi)型: .cpp金幣: 1下載: 0 次發(fā)布日期: 2021-05-24
- 語(yǔ)言: C/C++
- 標(biāo)簽:
資源簡(jiǎn)介
原版的Itti代碼是Matlab,在本人上傳列表里也有,這個(gè)是我重新調(diào)整結(jié)構(gòu),用opencv和vs2012寫(xiě)的,速度不快,在2-3秒,這也是由算法本身決定的。
代碼片段和文件信息
//Itti視覺(jué)注意模型的opencv實(shí)現(xiàn)
//代碼參照Matlab的代碼進(jìn)行編寫(xiě),結(jié)構(gòu)上進(jìn)行了一定得優(yōu)化
//Matlab代碼的下載地址見(jiàn)本人CSDN資源
//http://download.csdn.net/detail/megaarthur/7402441
//2014.5.20——2014.5.25
//by?Yin?Ruoxuan?
#include?
#include
#include
#include
#include
#include
#define?PI?3.1415926
using?namespace?std;
//高斯金字塔結(jié)構(gòu)體
typedef?struct?GaussPyr
{
IplImage?*lev[9];
}GaussPyr;
//將金字塔尺寸定義為全局變量
CvSize?PyrSize[9]?=?{NULL};
//初始化金字塔結(jié)構(gòu)體
void?initPyr(GaussPyr?*p)
{
for(int?i?=?0;?i?9;?i++)
p->lev[i]?=?cvCreateImage(PyrSize[i]?IPL_DEPTH_64F?1);
}
//根據(jù)層數(shù),求第i層的尺寸
int?downsample(int?x?int?level)
{
if(level--?>?0)
{
if(x%2?==?0)
x?=?x/2;
else
x?=?(x+1)/2;
downsample(xlevel);
}
if(level?==?-1)
return?x;
}
//計(jì)算并產(chǎn)生一幅圖的高斯金字塔
void?Gscale(GaussPyr?*p?IplImage?*data?int?level?double?sigma)
{
for(int?i?=?0;?i {
if(i?==?0)
cvSmooth(data?p->lev[0]?CV_GAUSSIAN?5?5?sigma?0);
else
{
IplImage?*tem?=?cvCreateImage(PyrSize[i-1]?IPL_DEPTH_64F?1);
cvSmooth(p->lev[i-1]?tem?CV_GAUSSIAN?5?5?sigma?0);
for(int?a?=?0;?a? for(int?b?=?0;?b? ((double?*)(p->lev[i]->imageData?+?a*p->lev[i]->widthStep))[b]?=?((double?*)(tem->imageData?+?2*a*tem->widthStep))[2*b];
}
}
}
//c-s過(guò)程中用到的跨尺度相減
void?overScaleSub(IplImage?*s1?IplImage?*s2?IplImage?*dst)
{
cvResize(s2?dst?CV_INTER_LINEAR);
cvAbsDiff(s1?dst?dst);
}
//求圖像的局部最大值
void?getLocalMaxima(IplImage?*scr?double?thresh?double?*lm_sum?int?*lm_num?double*lm_avg)
{
*lm_sum?=?0.0;
*lm_num?=?0;
*lm_avg?=?0.0;
int?count?=?0;
for(int?a?=?1;?a?((scr->height)?-?1);?a++)
for(int?b?=?1;?b((scr->width)?-?1);?b++)
{
double?val?=?((double?*)(scr->imageData?+?a*scr->widthStep))[b];
if((val?>=?thresh)?&&
(val?>=?((double?*)(scr->imageData?+?(a-1)*scr->widthStep))[b])?&&
(val?>=?((double?*)(scr->imageData?+?(a+1)*scr->widthStep))[b])?&&
(val?>=?((double?*)(scr->imageData?+?a*scr->widthStep))[b-1])?&&
(val?>=?((double?*)(scr->imageData?+?a*scr->widthStep))[b+1]))
{
if(val?==?10)?count++;
*lm_sum?+=?val;
(*lm_num)?++;
}
}
if(*lm_num?>?count)
{
*lm_sum?=?*lm_sum?-?10*count;
*lm_num?=?*lm_num?-?count;
if(*lm_num?>?0)
*lm_avg?=?*lm_sum?/?*lm_num;
else
*lm_avg?=?0;
}
else
*lm_avg?=?0;
}
//N操作,包括下采樣到第5層的尺寸
void?N_operation(IplImage?*scr?IplImage?*dst)
{
cvNormalize(scr?scr?1.0?0.0?CV_MINMAX?NULL);
cvConvertScale(scr?scr?10?0);
int?lm_num;
double?lm_sum;
double?lm_avg;
getLocalMaxima(scr?1?&lm_sum?&lm_num?&lm_avg);
if(lm_num?>?0)
cvConvertScale(scr?scr?(10-lm_avg)*(10-lm_avg)?0);
//下采樣,先判斷目前的層數(shù)
if(?scr->height?==?PyrSize[2].height?)//scr在第三層
{
for(int?a?=?0;?a? for(int?b?=?0;?b?
評(píng)論
共有 條評(píng)論