帮老师做了一个简单的基于行为(主要是步态)的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. java byte 16进制转换

    整型转16进制: int devIdInt = Integer.parseInt(devId);String devIdString = Integer.toHexString(devIdInt); ...

  2. response和request

    请求响应流程图 response response是用来向客户端响应的对象! 需要回忆一下http响应内容: l  首行:状态码 l  响应头: 1头1值,1头多值: l  响应体(正文):html ...

  3. 【iOS开发-从网络上获取图片尺寸】

    实际开发过程中,容易碰到从网络上获取图片尺寸的场景,比如一个UIImageView要装载从网络上获取的图片,但要先设置其frame,此时又不知道图片尺寸,就要从网络上获取尺寸了.为了最好的用户体验,一 ...

  4. ComboTree( 树型下拉框) 组件

    本节课重点了解EasyUI中Tree(树)组件的使用方法, 这个组件依赖于Combo(下拉框)和 Tree(树)组件.一. 加载方式//class 加载方式<select id="cc ...

  5. hdu 2032

    水题 AC代码: #include <stdio.h> int main() { int a[31][31]; int i,j,n; a[1][1]=a[2][1]=a[2][2]=1; ...

  6. Hyper-v虚拟机上网

    Windows 8中内置的Hyper-V管理器可以说给许多人带来了惊喜!在Hyper-V管理器强大的同时,也同样面临着设置中一些不可避免的麻烦.有人说,Hyper-V虚拟机联网麻烦,其实,只要掌握了技 ...

  7. NSUserDefaults的使用方法

    NSUserDefaults对象是用来保存,恢复应用程序相关的偏好设置,配置数据等等,用户再次打开程序或开机后这些数据仍然存在.默认系统允许应用程序自定义它的行为去迎合用户的喜好.你可以在程序运行的时 ...

  8. [Leetcode][048] Rotate Image 略详细 (Java)

    题目在这里 https://leetcode.com/problems/rotate-image/ [个人分析] 这个题目,我觉得就是考察基本功.考察细心的,算法方面没有太多东西,但是对于坐标的使用有 ...

  9. php 初学笔记

    1.变量定义和使用 php中定义变量名为:$aa 在类中一般定义一个新变量需要添加var字,如var $aaa. 但是过程或函数中是不需要添加var 关键字,如$aaa=$_POST['aaaa'], ...

  10. HTML元素遮挡Flash之梦

    wmode参数: transparent模式:可用z-index控制层级 opaque模式:可用z-index控制层级 window模式:flash层级在浏览器核心显示窗口之上,flash会盖住与他重 ...