【電腦視覺】基於行為的ReID示範

來源:互聯網
上載者:User

標籤:style   blog   http   color   width   2014   

幫老師做了一個簡單的基於行為(主要是步態)的ReID問題的Demo,效果如:


下面是提取的集中特徵,前三個都是GEI系的,後幾個是基於光流場的。然後右邊是識別出的幾個對象的排序,因為沒有角度和衣服,書包等協變數改變的問題,所以識別比較準確,排第一的就是對的。其實特徵是之前提好的,因為對象也不多,識別序列對也是一次性計算的。右邊識別出的幾個人是顯示的動態行走的順序圖表,所以預先把每個人resize的剪影儲存在vector中。

int main(int argc, char*argv[]){string video_name(argv[1]);int video_height=240;int video_width=320;int window_height=video_height+feature_height;int window_width=video_width+feature_width;vector<vector<int> > pairs;process(pairs);vector<vector<Mat> > features;vector<vector<Mat> > images;readFeatures(features,images);Mat window=Mat::zeros(window_height,window_width,CV_8UC3);Rect rect;rect.x=rect.y=0;rect.width=video_width;rect.height=video_height;Mat window_video(window,rect);VideoCapture video(video_name);int frame_num=0;Mat frame; video>>frame;vector<Mat> frames; string people_num_str=video_name.substr(0,3);int people_num=atoi(people_num_str.c_str());while(!frame.empty()||!frames.empty()){frame_num++;if(!frame.empty()){frame.copyTo(window_video);Mat tmp;frame.copyTo(tmp);frames.push_back(tmp);video>>frame;}else{int show_num=frame_num%frames.size();(frames[show_num]).copyTo(window_video);}if(frame_num>40){for(int ci=0;ci<class_size;ci++){Rect rect;rect.x=ci*feature_width;rect.y=video_height;rect.width=feature_width;rect.height=feature_height;Mat featre_mat(window,rect);if(frame_num>ci*10+40)features[ci][people_num-1].copyTo(featre_mat);}}if(frame_num>120){for(int i=0;i<4;i++){int recp=pairs[people_num-1][i+1];Rect rect;rect.x=video_width;rect.y=i*feature_height;rect.width=feature_width;rect.height=feature_height;Mat rec_mat(window,rect);int recpnum=frame_num%40;images[recp-1][recpnum].copyTo(rec_mat);if(pairs[people_num-1][i+1]==people_num)rectangle(window,rect,Scalar(0,0,255));}}Mat largeWinow(window_height*2,window_width*2,CV_8UC3);resize(window,largeWinow,Size(),2.0f,2.0f,INTER_LINEAR);imshow("Gait",largeWinow);waitKey(50);}return 0;}
其實主要的代碼是process()和readFeatures(),一個用來計算識別排序的對組合,一個用來讀取之前提取的特徵和每個人用來顯示在右邊的行走順序圖表,不過也比較好理解,這裡不再貼了,有個計算前k個最小值的代碼放一下把。

void getKMinScores(vector<float>&scores,vector<float>& k_scores,int KNN_K){for(int k=0;k<KNN_K;k++){k_scores[k] = FLT_MAX;}int people_size = scores.size();for(int pi=0;pi<people_size;pi++){int change_id = -1;for(int kk=0;kk<KNN_K;kk++){if(scores[pi]<k_scores[kk]){change_id = kk;}}if(change_id>=0){if(change_id==(KNN_K-1)||(change_id<(KNN_K-1)&&scores[pi]!=k_scores[change_id+1])){for(int c=0;c<change_id;c++){k_scores[c] = k_scores[c+1];}k_scores[change_id] = scores[pi];}}}return ;}
抱歉,水文一篇~


(轉載請註明作者和出處:http://blog.csdn.net/xiaowei_cqu 未經允許請勿用於商業用途)


相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.