openTLD算法在opencv3的PatchGenerator

2023-11-11

由于opencv3的各种版本相对于opencv2的版本已经改变了很多内容,openTLD跟踪算法所依赖的一些函数在opencv3中已经消失了,为此需要对openTLD进行适当修改才能使之在opencv3的各种版本中运行。


加入如下文件,并在对应的地方include头文件即可。



PatchGenerator.h

  1. #include <opencv2/opencv.hpp>  
  2. #ifndef PATCHGENERATOR_H  
  1. #define <span style="font-family: Arial, Helvetica, sans-serif;">PATCHGENERATOR_H</span>  
  2.   
  3. namespace cv  
  4. {  
  5. class CV_EXPORTS PatchGenerator  
  6. {  
  7. public:  
  8.     PatchGenerator();  
  9.     PatchGenerator(double _backgroundMin, double _backgroundMax,  
  10.                    double _noiseRange, bool _randomBlur=true,  
  11.                    double _lambdaMin=0.6, double _lambdaMax=1.5,  
  12.                    double _thetaMin=-CV_PI, double _thetaMax=CV_PI,  
  13.                    double _phiMin=-CV_PI, double _phiMax=CV_PI );  
  14.     void operator()(const Mat& image, Point2f pt, Mat& patch, Size patchSize, RNG& rng) const;  
  15.     void operator()(const Mat& image, const Mat& transform, Mat& patch,  
  16.                     Size patchSize, RNG& rng) const;  
  17.     void warpWholeImage(const Mat& image, Mat& matT, Mat& buf,  
  18.                         CV_OUT Mat& warped, int border, RNG& rng) const;  
  19.     void generateRandomTransform(Point2f srcCenter, Point2f dstCenter,  
  20.                                  CV_OUT Mat& transform, RNG& rng,  
  21.                                  bool inverse=falseconst;  
  22.     void setAffineParam(double lambda, double theta, double phi);  
  23.   
  24.     double backgroundMin, backgroundMax;  
  25.     double noiseRange;  
  26.     bool randomBlur;  
  27.     double lambdaMin, lambdaMax;  
  28.     double thetaMin, thetaMax;  
  29.     double phiMin, phiMax;  
  30. };  
  31. };  
  1. #endif  


PatchGenerator.cpp

  1. #include <opencv2/opencv.hpp>  
  2. #include <PatchGenerator.h>  
  3.   
  4. namespace cv  
  5. {  
  6.   
  7. /* 
  8.   The code below implements keypoint detector, fern-based point classifier and a planar object detector. 
  9.  
  10.   References: 
  11.    1. Mustafa Özuysal, Michael Calonder, Vincent Lepetit, Pascal Fua, 
  12.       "Fast KeyPoint Recognition Using Random Ferns," 
  13.       IEEE Transactions on Pattern Analysis and Machine Intelligence, 15 Jan. 2009. 
  14.  
  15.    2. Vincent Lepetit, Pascal Fua, 
  16.       "Towards Recognizing Feature Points Using Classification Trees," 
  17.       Technical Report IC/2004/74, EPFL, 2004. 
  18. */  
  19.   
  20. const int progressBarSize = 50;  
  21.   
  22.  Patch Generator //  
  23.   
  24. static const double DEFAULT_BACKGROUND_MIN = 0;  
  25. static const double DEFAULT_BACKGROUND_MAX = 256;  
  26. static const double DEFAULT_NOISE_RANGE = 5;  
  27. static const double DEFAULT_LAMBDA_MIN = 0.6;  
  28. static const double DEFAULT_LAMBDA_MAX = 1.5;  
  29. static const double DEFAULT_THETA_MIN = -CV_PI;  
  30. static const double DEFAULT_THETA_MAX = CV_PI;  
  31. static const double DEFAULT_PHI_MIN = -CV_PI;  
  32. static const double DEFAULT_PHI_MAX = CV_PI;  
  33.   
  34. PatchGenerator::PatchGenerator()  
  35. : backgroundMin(DEFAULT_BACKGROUND_MIN), backgroundMax(DEFAULT_BACKGROUND_MAX),  
  36. noiseRange(DEFAULT_NOISE_RANGE), randomBlur(true), lambdaMin(DEFAULT_LAMBDA_MIN),  
  37. lambdaMax(DEFAULT_LAMBDA_MAX), thetaMin(DEFAULT_THETA_MIN),  
  38. thetaMax(DEFAULT_THETA_MAX), phiMin(DEFAULT_PHI_MIN),  
  39. phiMax(DEFAULT_PHI_MAX)  
  40. {  
  41. }  
  42.   
  43.   
  44. PatchGenerator::PatchGenerator(double _backgroundMin, double _backgroundMax,  
  45.                                double _noiseRange, bool _randomBlur,  
  46.                                double _lambdaMin, double _lambdaMax,  
  47.                                double _thetaMin, double _thetaMax,  
  48.                                double _phiMin, double _phiMax )  
  49. : backgroundMin(_backgroundMin), backgroundMax(_backgroundMax),  
  50. noiseRange(_noiseRange), randomBlur(_randomBlur),  
  51. lambdaMin(_lambdaMin), lambdaMax(_lambdaMax),  
  52. thetaMin(_thetaMin), thetaMax(_thetaMax),  
  53. phiMin(_phiMin), phiMax(_phiMax)  
  54. {  
  55. }  
  56.   
  57.   
  58. void PatchGenerator::generateRandomTransform(Point2f srcCenter, Point2f dstCenter,  
  59.                                              Mat& transform, RNG& rng, bool inverse) const  
  60. {  
  61.     double lambda1 = rng.uniform(lambdaMin, lambdaMax);  
  62.     double lambda2 = rng.uniform(lambdaMin, lambdaMax);  
  63.     double theta = rng.uniform(thetaMin, thetaMax);  
  64.     double phi = rng.uniform(phiMin, phiMax);  
  65.   
  66.     // Calculate random parameterized affine transformation A,  
  67.     // A = T(patch center) * R(theta) * R(phi)' *  
  68.     //     S(lambda1, lambda2) * R(phi) * T(-pt)  
  69.     double st = sin(theta);  
  70.     double ct = cos(theta);  
  71.     double sp = sin(phi);  
  72.     double cp = cos(phi);  
  73.     double c2p = cp*cp;  
  74.     double s2p = sp*sp;  
  75.   
  76.     double A = lambda1*c2p + lambda2*s2p;  
  77.     double B = (lambda2 - lambda1)*sp*cp;  
  78.     double C = lambda1*s2p + lambda2*c2p;  
  79.   
  80.     double Ax_plus_By = A*srcCenter.x + B*srcCenter.y;  
  81.     double Bx_plus_Cy = B*srcCenter.x + C*srcCenter.y;  
  82.   
  83.     transform.create(2, 3, CV_64F);  
  84.     Mat_<double>& T = (Mat_<double>&)transform;  
  85.     T(0,0) = A*ct - B*st;  
  86.     T(0,1) = B*ct - C*st;  
  87.     T(0,2) = -ct*Ax_plus_By + st*Bx_plus_Cy + dstCenter.x;  
  88.     T(1,0) = A*st + B*ct;  
  89.     T(1,1) = B*st + C*ct;  
  90.     T(1,2) = -st*Ax_plus_By - ct*Bx_plus_Cy + dstCenter.y;  
  91.   
  92.     if( inverse )  
  93.         invertAffineTransform(T, T);  
  94. }  
  95.   
  96.   
  97. void PatchGenerator::operator ()(const Mat& image, Point2f pt, Mat& patch, Size patchSize, RNG& rng) const  
  98. {  
  99.     double buffer[6];  
  100.     Mat_<double> T(2, 3, buffer);  
  101.   
  102.     generateRandomTransform(pt, Point2f((patchSize.width-1)*0.5f, (patchSize.height-1)*0.5f), T, rng);  
  103.     (*this)(image, T, patch, patchSize, rng);  
  104. }  
  105.   
  106.   
  107. void PatchGenerator::operator ()(const Mat& image, const Mat& T,  
  108.                                  Mat& patch, Size patchSize, RNG& rng) const  
  109. {  
  110.     patch.create( patchSize, image.type() );  
  111.     if( backgroundMin != backgroundMax )  
  112.     {  
  113.         rng.fill(patch, RNG::UNIFORM, Scalar::all(backgroundMin), Scalar::all(backgroundMax));  
  114.         warpAffine(image, patch, T, patchSize, INTER_LINEAR, BORDER_TRANSPARENT);  
  115.     }  
  116.     else  
  117.         warpAffine(image, patch, T, patchSize, INTER_LINEAR, BORDER_CONSTANT, Scalar::all(backgroundMin));  
  118.   
  119.     int ksize = randomBlur ? (unsigned)rng % 9 - 5 : 0;  
  120.     if( ksize > 0 )  
  121.     {  
  122.         ksize = ksize*2 + 1;  
  123.         GaussianBlur(patch, patch, Size(ksize, ksize), 0, 0);  
  124.     }  
  125.   
  126.     if( noiseRange > 0 )  
  127.     {  
  128.         AutoBuffer<uchar> _noiseBuf( patchSize.width*patchSize.height*image.elemSize() );  
  129.         Mat noise(patchSize, image.type(), (uchar*)_noiseBuf);  
  130.         int delta = image.depth() == CV_8U ? 128 : image.depth() == CV_16U ? 32768 : 0;  
  131.         rng.fill(noise, RNG::NORMAL, Scalar::all(delta), Scalar::all(noiseRange));  
  132.         if( backgroundMin != backgroundMax )  
  133.             addWeighted(patch, 1, noise, 1, -delta, patch);  
  134.         else  
  135.         {  
  136.             forint i = 0; i < patchSize.height; i++ )  
  137.             {  
  138.                 uchar* prow = patch.ptr<uchar>(i);  
  139.                 const uchar* nrow =  noise.ptr<uchar>(i);  
  140.                 forint j = 0; j < patchSize.width; j++ )  
  141.                     if( prow[j] != backgroundMin )  
  142.                         prow[j] = saturate_cast<uchar>(prow[j] + nrow[j] - delta);  
  143.             }  
  144.         }  
  145.     }  
  146. }  
  147.   
  148. void PatchGenerator::warpWholeImage(const Mat& image, Mat& matT, Mat& buf,  
  149.                                     Mat& warped, int border, RNG& rng) const  
  150. {  
  151.     Mat_<double> T = matT;  
  152.     Rect roi(INT_MAX, INT_MAX, INT_MIN, INT_MIN);  
  153.   
  154.     forint k = 0; k < 4; k++ )  
  155.     {  
  156.         Point2f pt0, pt1;  
  157.         pt0.x = (float)(k == 0 || k == 3 ? 0 : image.cols);  
  158.         pt0.y = (float)(k < 2 ? 0 : image.rows);  
  159.         pt1.x = (float)(T(0,0)*pt0.x + T(0,1)*pt0.y + T(0,2));  
  160.         pt1.y = (float)(T(1,0)*pt0.x + T(1,1)*pt0.y + T(1,2));  
  161.   
  162.         roi.x = std::min(roi.x, cvFloor(pt1.x));  
  163.         roi.y = std::min(roi.y, cvFloor(pt1.y));  
  164.         roi.width = std::max(roi.width, cvCeil(pt1.x));  
  165.         roi.height = std::max(roi.height, cvCeil(pt1.y));  
  166.     }  
  167.   
  168.     roi.width -= roi.x - 1;  
  169.     roi.height -= roi.y - 1;  
  170.     int dx = border - roi.x;  
  171.     int dy = border - roi.y;  
  172.   
  173.     if( (roi.width+border*2)*(roi.height+border*2) > buf.cols )  
  174.         buf.create(1, (roi.width+border*2)*(roi.height+border*2), image.type());  
  175.   
  176.     warped = Mat(roi.height + border*2, roi.width + border*2,  
  177.                  image.type(), buf.data);  
  178.   
  179.     T(0,2) += dx;  
  180.     T(1,2) += dy;  
  181.     (*this)(image, T, warped, warped.size(), rng);  
  182.   
  183.     if( T.data != matT.data )  
  184.         T.convertTo(matT, matT.type());  
  185. }  
  186.   
  187.   
  188. // Params are assumed to be symmetrical: lambda w.r.t. 1, theta and phi w.r.t. 0  
  189. void PatchGenerator::setAffineParam(double lambda, double theta, double phi)  
  190. {  
  191.    lambdaMin = 1. - lambda;  
  192.    lambdaMax = 1. + lambda;  
  193.    thetaMin = -theta;  
  194.    thetaMax = theta;  
  195.    phiMin = -phi;  
  196.    phiMax = phi;  
  197. }  
  198. }; 

原文 http://blog.csdn.net/j10527/article/details/51305087

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

openTLD算法在opencv3的PatchGenerator 的相关文章

  • 你应该掌握的七种回归技术

    摘要 本文解释了回归分析及其优势 重点总结了应该掌握的线性回归 逻辑回归 多项式回归 逐步回归 岭回归 套索回归 ElasticNet回归等七种最常用的回归技术及其关键要素 最后介绍了选择正确的回归模型的关键因素 编者按 回归分析是建模和分
  • 多目标跟踪2021总结

    11年it研发经验 从一个会计转行为算法工程师 学过C c java android php go js python CNN神经网络 四千多篇博文 三千多篇原创 只为与你分享 共同成长 一起进步 关注我 给你分享更多干货知识 目录 SOT
  • 基于相关滤波器的追踪(Correlation Filter-based Tracking)原理

    基于相关滤波器的追踪 Correlation Filter based Tracking 原理 基于相关滤波器的追踪算法 典型的算法有KCF DSST STC SAMF等 这些算法的大致框架都是差不多的 介绍 在视频的第一帧给定目标的初始位
  • 目标跟踪学习笔记

    参考 https zhuanlan zhihu com p 90835266 真心感觉目标跟踪任务的难度和复杂度要比分类和目标检测高不少 具有更大的挑战性 如果你跟我一样是正在学习目标跟踪的新手 希望本文能让你对目标跟踪任务和DeepSOR
  • kcf跟踪算法实例整理

    http blog csdn NET shenxiaolu1984 article details 50905283 本文的跟踪方法效果甚好 速度奇高 思想和实现均十分简洁 其中利用循环矩阵进行快速计算的方法尤其值得学习 另外 作者在主页上
  • Staple 跟踪: Complementary Learners for Real-Time Tracking

    目标跟踪算法 Staple Complementary Learners for Real Time Tracking 小小菜鸟一只 2017 03 25 09 26 42 15110 收藏 14 分类专栏 目标跟踪 版权 文章下载链接 文
  • centertrack

    模型70多m 有torch版dla 此外 CenterTrack 很容易扩展到单目 3D 跟踪 只需恢复额外的 3D 属性即可 以单目视频作为输入 以 28 FPS 运行 CenterTrack 在新发布的 nuScenes 3D 跟踪基准
  • ByteTrack 多目标跟踪 测试笔记

    目录 多目标跟踪2022个人汇总知识 Results on MOT challenge test set ByteTrack 简介 转自知乎 1 Motivation 2 byte原理
  • 相关滤波跟踪(MOSSE)

    相关滤波跟踪 MOSSE 在信号处理中 有这么一个概念 相关性 correlation 用来描述两个因素之间的联系 而相关性又分为cross correlation 互相关 两个信号之间的联系 和auto correlation 自相关 本
  • 基于全连接孪生网络的目标跟踪(siamese-fc)

    Fully Convolutional Siamese Networks for Object Tracking 这两年可以说deeplearning已经占领了visual object tracking这个领域 但是对于跟踪问题来说 这些
  • fhog资料整理

    fast hog资料整理 https github com joaofaro FHOG https github com ppaanngggg fhog 这个有两种 1 DPM的 Mat tmp image image convertTo
  • CTracker

    https github com pjl1995 CTracker 本机可以跑 jacke121 CTracker master 可视化 demo show py 效果不是特别好 论文地址 https arxiv org pdf 2007
  • openTLD算法在opencv3的PatchGenerator

    由于opencv3的各种版本相对于opencv2的版本已经改变了很多内容 openTLD跟踪算法所依赖的一些函数在opencv3中已经消失了 为此需要对openTLD进行适当修改才能使之在opencv3的各种版本中运行 加入如下文件 并在对
  • 百度飞浆行人多目标跟踪笔记

    开源地址 PaddleDetection configs mot at release 2 3 PaddlePaddle PaddleDetection GitHub 百度飞浆集成了多目标跟踪的多种算法 地址 PaddleDetection
  • GOTURN——Learning to Track at 100 FPS with Deep Regression Networks

    文章的题目叫 Learning to Track at 100 FPS with Deep Regression Networks 算法简称 GOTURN Generic Object Tracking Using Regression N
  • 检测跟踪分割网络笔记

    模型247 97m GitHub SysCV pcan Prototypical Cross Attention Networks for Multiple Object Tracking and Segmentation NeurIPS
  • SiamMask 测试程序分析

    之前分析了 DaSiamRPN 的测试代码 侧重于执行细节 到了 SiamMask 似乎主题应该有所升华 故事的明线为跟踪器构成 暗线为训练流图 相比于 DaSiamRPN SiamMask 不仅网络结构是现代化的 系统设计也更具匠心 这便
  • ubuntu 使用FFTW快速计算离散傅里叶变换

    FFTW the Faster Fourier Transform in the West 是一个快速计算离散傅里叶变换的标准C语言程序集 其由MIT的M Frigo 和S Johnson 开发 可计算一维或多维实和复数据以及任意规模的DF
  • KCF高速跟踪详解

    思想 一般化的跟踪问题可以分解成如下几步 1 在 It 帧中 在当前位置 pt 附近采样 训练一个回归器 这个回归器能计算一个小窗口采样的响应 2 在 It 1 帧中 在前一帧位置 pt 附近采样 用前述回归器判断每个采样的响应 3 响应最
  • 2016视觉目标跟踪总结

    最近学习视觉目标跟踪算法 主要了解了几个主流的跟踪算法 kcf stc dsst 算法原理网上很多 这里就不再赘述 只对跟踪效果做了测试记录 Kcf 全名Kernelized Correlation Filters 其中hog特征用的fho

随机推荐

  • KVM和QEMU

    原文地址 KVM和QEMU 作者 embeddedlwp 目录 1 硬件虚拟化技术背景 2 KVM的内部实现概述 2 1 KVM的抽象对象 2 2 KVM的vcpu 2 3 KVM的IO虚拟化 2 3 1 IO的虚拟化 2 3 2 Virt
  • jdk1.8.191 JVM内存参数 InitialRAMPercentage和MinRAMPercentage

    MaxRAMPercentage InitialRAMPercentage MinRAMPercentage 这三个参数是JDK8U191为适配Docker容器新增的几个参数 类比Xmx Xms 至于 XX InitialRAMFracti
  • 物联网安全概述

    什么是物联网 在你学习有关IPv6的时候 你的老师或许说过 有一天在你的房子每个设备都会有一个IP 物联网基本上就是处理每天的事务 并把它们连接到互联网上 一些常见的物联网设备 如灯光 窗帘 空调 也有像冰箱这样的不太常见的设备 甚至一个卫
  • [sicily] 1003. 相连的1

    声明 原题目转载自中山大学sicily平台 解答部分为原创 Problem 对于一个01矩阵A 求其中有多少片连成一片的1 每个1可以和上下左右的1相连 请为下面的Solution类实现解决这一问题的函数countConnectedOnes
  • 聚合支付行业术语,你get到了吗?

    俗话说 内行看门道外行凑热闹 每一个行业都有它独特的专业术语 对于外行人来说 这些专业术语就跟专有名词一样难懂 支付行业也是一样 因为是近几年的新兴行业 很多人对这一行不懂 甚至一些在支付行业工作的人 对这一行的很多名词概念也很模糊 认知仅
  • 基础篇(二):内存屏障是什么

    目录 前置知识 内存屏障 什么是内存屏障 作用 内存屏障的分类 1 强制读取 刷新主内存的屏障 强制刷新主内存 Load屏障 强制读取主内存 Store屏障 总结 2 禁止指令重排序的屏障 LoadLoad屏障 StoreStore屏障 L
  • 怎么修改游戏内存服务器,修改游戏服务器内存

    修改游戏服务器内存 内容精选 换一换 当您成功创建私有镜像后 镜像的状态为 正常 您可以使用该镜像创建服务器实例或云硬盘 也可以将镜像共享给其他帐号 或者复制镜像到其他区域 私有镜像的生命周期如图1所示 通过华为云创建的ECS服务器默认使用
  • mysql客户端小海豚_MySQL基础

    1 数据库概述 1 1数据的存储方式 第一种存储方式是创建对象 实际上new出来的对象不就是用来存数据的嘛 创建对象就是在堆内存中为对象请求了一个空间 相当于是将对象存入堆内存 第二种方式存文件中 这个在IO流部分我们就是这么处理的 但是缺
  • Python批量改文件名

    对以下路径中的文件名批量修改 文章目录 一 读取指定路径中的文件名 二 正则表达式提取需要保留的部分 1 介绍re库 2 re库中函数的用法 1 re findall 最常用 2 re sub pattern repl string cou
  • 数仓知识点

    传统数仓知识 1 数据仓库分层 ODS 数据准备层 该区为数据仓的准备区 直接输入源数据 如业务库 埋点日志和消息队列等 DWD 数据细节层 该层为业务层和数据层的隔离层 保持和ODS层相同的颗粒度 该层还进行了数据清洗和规范化操作 例如去
  • 阿里巴巴笔试-2020.7.27-第二题 藏宝架

    题目 有个藏宝架有n层 每层的宝物数量不一 每个宝物都有其价值 现在要求拿出m个宝物 并且需要遵守规则 每次只能拿选定层的两端的宝物 要拿出的m个宝物的总价值是各种方案里最大的 输入 第一行是 n 和 m 后面每一行是各层的数据 n m 下
  • WebSocket 基于JAVA Spring boot Spring Colud 的使用

    先上代码再看调试结果 package com qiang user util import com alibaba fastjson JSONObject import org springframework stereotype Comp
  • 软考网络工程师-最新最全小白攻略

    一 前言 最近Beau 博主本人 也是考取了2023年上半年的软考网络工程师 这里也准备给小白们做一些避坑流程 这里附上通过图 二 考前准备 1 报考条件 无 无年龄 资质 学历限制 无需通过软考初级才能报考 是中国守法公民即可报名 2 考
  • webpack 保存文件后自动打包_自动打包插件webpack-dev-server的安装、配置及使用

    1 介绍 webpack dev server插件可以实现Webpack的自动打包编译 这样 就不需要每次修改完代码都重新手动输入webpack打包了 2 安装 在项目的根路径下输入 cnpm i webpack dev server D
  • Python----模块(Module)和包(Package)

    Python 包 包 定义 为了组织好模块 会将多个模块分为包 Python 处理包也是相当方便的 简单来说 包就是文件夹 但该文件夹下必须存在 init py 文件 常见的包结构如下 最简单的情况下 只需要一个空的 init py 文件即
  • uniapp中使用网页录音并上传声音文件(发语音)——js-audio-recorder的使用【伸手党福利】

    uniapp中上传音频只能在app或小程序当中实现 如何使用网页完成语音的录制和上传则成为了困扰前端童鞋的重点 本文着重解决 js audio recorder报 error 浏览器不支持getUserMedia 的问题 js audio
  • qt使用socket连续发图片,服务端使用qt或者python接受图片

    首先客户端是用qt 不能用python这种 首先在pro里面 QT network 然后引入头文件 include
  • 2023最新AI创作商用ChatGPT源码分享+支持AI绘画

    一 SparkAI智能创作系统 SparkAi创作系统是基于国外很火的ChatGPT进行开发的Ai智能问答系统 本期针对源码系统整体测试下来非常完美 可以说SparkAi是目前国内一款的ChatGPT对接OpenAI软件系统 那么如何搭建部
  • Vue 中使用 Upload 组件上传 Excel

    vue 中使用 Element 的 upload 组件上传 Excel 大致可以分两种情况 使用 action 上传到服务器 使用 axios 上传到服务器 注意 上传文件可能由于前后端格式不统一导致上传失败 application x w
  • openTLD算法在opencv3的PatchGenerator

    由于opencv3的各种版本相对于opencv2的版本已经改变了很多内容 openTLD跟踪算法所依赖的一些函数在opencv3中已经消失了 为此需要对openTLD进行适当修改才能使之在opencv3的各种版本中运行 加入如下文件 并在对