帮老师做了一个简单的基于行为(主要是步态)的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 未经同意请勿用于商业用途)

【计算机视觉】基于行为的ReID演示的更多相关文章

  1. SpringBoot2.0 基础案例(12):基于转账案例,演示事务管理操作

    本文源码 GitHub地址:知了一笑 https://github.com/cicadasmile/spring-boot-base 一.事务管理简介 1.事务基本概念 一组业务操作ABCD,要么全部 ...

  2. 基于JavaFX图形界面演示的迷宫创建与路径寻找

    事情的起因是收到了一位网友的请求,他的java课设需要设计实现迷宫相关的程序--如标题概括. 我这边不方便透露相关信息,就只把任务要求写出来. 演示视频指路: 视频过审后就更新链接 完整代码链接: 网 ...

  3. PHP RBAC权限管理 基于角色的访问控制演示

    RBAC rbac:Role Based Access Controll,基于角色的访问控制. 今天理一理RBAC,话不多说,直接切入主题 功能需求: 权限管理(无限极) 角色管理(可以分配权限) 管 ...

  4. 【.NET6+WPF+Avalonia】开发支持跨平台的WPF应用程序以及基于ubuntu系统的演示

    前言:随着跨平台越来越流行,.net core支持跨平台至今也有好几年的光景了.但是目前基于.net的跨平台,大多数还是在使用B/S架构的跨平台上:至于C/S架构,大部分人可能会选择QT进行开发,或者 ...

  5. 行人重识别(ReID) ——基于深度学习的行人重识别研究综述

    转自:https://zhuanlan.zhihu.com/p/31921944 前言:行人重识别(Person Re-identification)也称行人再识别,本文简称为ReID,是利用计算机视 ...

  6. 行人重识别(ReID) ——技术实现及应用场景

    导读 跨镜追踪(Person Re-Identification,简称 ReID)技术是现在计算机视觉研究的热门方向,主要解决跨摄像头跨场景下行人的识别与检索.该技术能够根据行人的穿着.体态.发型等信 ...

  7. Person Re-ID行人重试别梳理

    定义 是利用计算机视觉技术判断图像或者视频序列中是否存在特定行人的技术.给定一张切好块的行人图像 (probe image,), 从一大堆切好块的图像 (gallery images) 中找到同一身份 ...

  8. javascript——touch事件介绍与实例演示

      分类: javascript2014-02-12 16:42 1742人阅读 评论(0) 收藏 举报 touch事件touchmovetouchstarttouchend 前言 诸如智能手机和平板 ...

  9. 基于 dbms_redefinition 在线重定义表

    Oracle 支持在线重定义表,也就是说我们可以在修改表结构(DDL)的同时进行相关的DQL.DML操作,使得前端的DML根本感觉不到表结构实际上已经发生了变化,对于用户而言是完全透明的.当然在线重定 ...

随机推荐

  1. [React] React Router: Named Components

    In this lesson we'll learn how to render multiple component children from a single route. Define a n ...

  2. NSRunLoop个人理解

    作者: xwang 出处: http://www.cnblogs.com/xwang/  本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保 ...

  3. 输入内容, 列出可选的项: QComboBox

    #include "widget.h" #include "ui_widget.h" #include <QtGui/QCompleter> #in ...

  4. Java基础知识强化53:经典排序之选择排序(SelectionSort)

    1.选择排序的原理图: 2. 选择排序代码实现: package cn.itcast_02; /* * 数组排序之选择排序: * 从0索引开始,依次和后面元素比较,小的往前放,第一次完毕,最小值出现在 ...

  5. CentOS6.7 常用操作命令

    centos 安装py环境 1.安装wget工具: yum install wget 2.安装Python-2.7.8: wget --no-check-certificate https://www ...

  6. hibernate连接数据库,进行操作的步骤

    //初始化 Configuration conf=null; SessionFactory sf=null; Session session=null; Transaction tx=null; tr ...

  7. RxJava漫谈-RxAndroid使用

    RxJava在github上的地址:https://github.com/ReactiveX/RxJava RxAndroid在github上的地址:https://github.com/Reacti ...

  8. mysql 查询大量数据内存溢出

    使用非buffer 的sql 查询 比如pymysql 的 pymysql.cursor.SSCursion

  9. js判断一个变量是否为数组的解决方案

    前端开发中,在做项目的时候,我们经常需要对一个变量进行数组类型的判断,当然即使你暂时没遇到,但是这个问题也是大家去面试时的高频问题,有必要拿出来说一说. 大家都知道js中可以使用typeof来判断变量 ...

  10. ie6兼容性

    文本重复Bug 在IE6中,一些隐藏的元素(如注释.display:none;的元素)被包含在一个浮动元素里,就有可能引发文本重复bug.解决办法:给浮动元素添加display:inline;. 躲猫 ...