帮老师做了一个简单的基于行为(主要是步态)的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. [Node.js] node-persist: localStorage on the server

    // Save data var storage = require('node-persist'); storage.init(); var people= require('./people.js ...

  2. [iOS] App引导页的简单实现 (Swift 2)

    转载请注明出处:http://www.jianshu.com/p/024dd2d6e6e6# 已更新至 Xcode7.2.Swift2.1 在第一次打开App或者App更新后通常用引导页来展示产品特性 ...

  3. Shell-WEB目录监控

    #!/bin/sh #date:2015-12-08 #filename:check_webfile.sh #作者:李兴利 #Email:1162572407@qq.com #version:v1.1 ...

  4. mybati之#与$的区别

    $是用于sql的拼接: //因为user_name是String类型,所以在sql中加上单引号,需要手动的判断数据类型,value是如果没有指定参数的话,value就是默认参数名称,获取穿的参数就是: ...

  5. NumberSpinner( 数字微调) 组件

    本节课重点了解 EasyUI 中 Spinner(微调)组件的使用方法,这个组件依赖于Numberbox(数值输入框)和 Spinner(微调)组件. 一. 加载方式//class 加载方式<i ...

  6. C#异步编程的实现方式——ThreadPool线程池

    在需要创建的线程很多,且都是比较小的线程的情况下,可以使用线程池(ThreadPool类).ThreadPool是一个静态方法,提供了对一个线程集合的操作,它会在线程数不足时增加线程,空闲线程数过多时 ...

  7. SQL Server中的临时表和表变量 Declare @Tablename Table

    在SQL Server的性能调优中,有一个不可比面的问题:那就是如何在一段需要长时间的代码或被频繁调用的代码中处理临时数据集?表变量和临时表是两种选择.记得在给一家国内首屈一指的海运公司作SQL Se ...

  8. include,include_once,require,require_once的区别

    1.include,require在其被调用的位置处包含一个文件. 2.include_once,require_once函数的作用与include相同,不过它会首先验证是否已包含该文件.如果已经包含 ...

  9. 原生拖拽,拖放事件(drag and drop)

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  10. asp.net 的那点事(2、浏览器和一般处理程序)

    从今天开始我们接着来学习:asp.net中一般处理程序和浏览器的通信. 一.第一个图解: 从图解中我们看出,整个过程是:"请求---处理---响应".这个也就是经常面试的时候,面试 ...