akisatoさんのマイページ

Saliency mapをOpenCVで実装する

2011/10/28 21:25

ここ http://fussy.web.fc2.com/algo/algo12-3.htm の記事に刺激を受け,OpenCVでsaliency mapを実装してみることにしました.下記がインターフェースになります.SMGetSMが実際にsaliency mapを計算している関数で,映像ファイルやwebcamからの入力を可能にする関数も用意しました.#ifndef _SALIENCY_MAP_H_#define _SALIENCY_MAP_H_//******************************************************************************// Include Files//******************************************************************************#include #include #include #include #include #include #include #include #include #include //******************************************************************************// Constant & Definitions//******************************************************************************static const float WEIGHT_INTENSITY = 0.30;static const float WEIGHT_COLOR = 0.30;static const float WEIGHT_ORIENTATION = 0.20;static const float WEIGHT_MOTION = 0.20;static const float RANGEMAX = 255.00;static const float SCALE_GAUSS_PYRAMID = 1.7782794100389228012254211951927; // = 100^0.125static const float DEFAULT_STEP_LOCAL = 8;//******************************************************************************// Class Definition//******************************************************************************class SaliencyMap{public: SaliencyMap(int height, int width); CvMat* SMGetSM(IplImage * src); // Core: saliency map generation CvMat* SMGetSMFromVideoFrame(CvCapture * input_video, IplImage * &inputFrame_cur, int frameNo); CvMat* SMGetSMFromVideoFrameWebcam(videoInput &vi, int dev_id, IplImage * &inputFrame_cur); ~ParallelSaliencyMap(void);private: CvMat * R, * G, * B, * I; CvMat * prev_frame; CvMat * GaborKernel0; CvMat * GaborKernel45; CvMat * GaborKernel90; CvMat * GaborKernel135;private: // splitting color channels void SMExtractRGBI(IplImage * inputImage, CvMat * &R, CvMat * &G, CvMat * &B, CvMat * &I); // extracting feature maps void IFMGetFM(CvMat * src, CvMat * dst[6]); void CFMGetFM(CvMat * R, CvMat * G, CvMat * B, CvMat * RGFM[6], CvMat * BYFM[6]); void OFMGetFM(CvMat * I, CvMat * dst[24]); void MFMGetFM(CvMat * I, CvMat * dst_x[6], CvMat * dst_y[6]); // normalization void normalizeFeatureMaps(CvMat * FM[6], CvMat * NFM[6], int width, int height, int num_maps); CvMat* SMNormalization(CvMat * src); // Itti normalization CvMat* SMRangeNormalize(CvMat * src); // dynamic range normalization // extracting conspicuity maps CvMat * ICMGetCM(CvMat *IFM[6], CvSize size); CvMat * CCMGetCM(CvMat *CFM_RG[6], CvMat *CFM_BY[6], CvSize size); CvMat * OCMGetCM(CvMat *OFM[24], CvSize size); CvMat * MCMGetCM(CvMat *MFM_X[6], CvMat *MFM_Y[6], CvSize size);};#endif /* _SALIENCY_MAP_H_ */まずは,コア関数であるSMGetSMの実装を示します.オリジナル http://ilab.usc.edu/publications/Itti_etal98pami.html で用いられていた,輝度・色差・エッジ方向に加えて,映像応用を見据えて動きベクトルも基本特徴として加えてあります.また,各基本特徴に重みをつけて統合する機能も含まれています.SMGetSMの構成CvMat* SaliencyMap::SMGetSM(IplImage *src){ int inputWidth = src->width; // width of the image int inputHeight = src->height; // height of the image CvSize sSize = cvSize(inputWidth, inputHeight); //====================================================================================== // Intensity and RGB Extraction //====================================================================================== CvMat *R, *G, *B, *I; SMExtractRGBI(src, R, G, B, I); //====================================================================================== // Feature Map Extraction //====================================================================================== // intensity feature maps CvMat* IFM[6]; IFMGetFM(I, IFM); // color feature maps CvMat* CFM_RG[6]; CvMat* CFM_BY[6]; CFMGetFM(R, G, B, CFM_RG, CFM_BY); // orientation feature maps CvMat* OFM[24]; OFMGetFM(I, OFM); // motion feature maps CvMat* MFM_X[6]; CvMat* MFM_Y[6]; MFMGetFM(I, MFM_X, MFM_Y); cvReleaseMat(&R); cvReleaseMat(&G); cvReleaseMat(&B); cvReleaseMat(&I); //====================================================================================== // Conspicuity Map Generation //====================================================================================== CvMat *ICM = ICMGetCM(IFM, sSize); CvMat *CCM = CCMGetCM(CFM_RG, CFM_BY, sSize); CvMat *OCM = OCMGetCM(OFM, sSize); CvMat *MCM = MCMGetCM(MFM_X, MFM_Y, sSize); for(int i=0; i


Tags: Research
Binder: akisatoのバインダー(日記数:131/全体に公開)
このエントリーをはてなブックマークに追加

このブログにコメントをつけるには、ログインする必要があります。
マイページをお持ちでないひとは「マイページを作成する」ボタンを押してマイページを作成してください。
不適切なブログを見つけたら、こちらからご報告ください!

Mail Address(GMO ID):

Password:

自動ログインパスワードを忘れた方

最近書いたブログ


https://www.freeml.com/feed.php?u_id=6540769&f_code=1



Copyright(C)2019 GMO Media, Inc. All Rights Reserved.