【NCC】之一:从Pearson相关系数到模板匹配的NCC方法

2023-05-16

文章目录

  • <center> NCC(Normalized Cross Correlation)
    • 1.**Pearson相关系数**
    • 2.**协方差 covariance**
    • 3. **方差 variance**
    • 4.模板匹配中的NCC方法
    • 5.实现过程
    • 6.测试结果
    • 7.部分核心源码
      • NCC.cpp

NCC(Normalized Cross Correlation)

从Pearson相关系数到模板匹配的NCC方法

1.Pearson相关系数

Pearson相关系数是用来衡量两个变量之间的相关性,由下式给出
p = c o v ( X , Y ) σ ( X ) σ ( Y ) p = \frac{cov(X,Y)}{\sigma(X)\sigma(Y)} p=σ(X)σ(Y)cov(X,Y)
p在数值上在[-1,1]之间

  • 当p=0时,说明两个变量不想关;
  • 当p>0时,两个变量正相关,而且p越大正相关性越强;
  • 当p<0时,两个变量负相关,而且p越小负相关性越强;

上式中 c o v ( X , Y ) cov(X,Y) cov(X,Y)表示的是两个变量 X 、 Y X、Y XY的协方差, σ ( X ) \sigma(X) σ(X)表示的是变量X的标准差差, σ ( Y ) \sigma(Y) σ(Y)表示的是变量Y的标准差$。

2.协方差 covariance

协方差也是用来衡量两个变量之间的相关性的,当两个变量之间的协方差是0时不相关(两个变量相互独立),大于0时正相关,小于0时负相关。例如身高和体重之间的协方差就是一个正数,因为身高和体重是正相关的。
协方差由下式给出:
c o v ( X , Y ) = E [ ( X − E ( X ) ) ( Y − E ( Y ) ) ] cov(X,Y)=E[(X-E(X))(Y-E(Y))] cov(X,Y)=E[(XE(X))(YE(Y))]
其中E()表示变量的数学期望,eg:E(X)表示变量X的数学期望, E [ X ] = Σ μ i x i , μ i 是 x i E[X]=\Sigma \mu_i x_i,\mu_i 是 x_i E[X]=Σμixi,μixi的权重,如果每个样本的权重都相等的话则写为: E [ X ] = Σ x i n E[X]=\frac{\Sigma x_i}{n} E[X]=nΣxi

此外协方差的等价式

c o v ( X , Y ) = E [ ( X − E ( X ) ) ( Y − E ( Y ) ) ] = E [ X Y − X E ( Y ) − Y E ( X ) + E ( X ) E ( Y ) ] = E ( X Y ) − 2 E ( X ) E ( Y ) + E ( X ) E ( Y ) = E ( X Y ) − E ( X ) E ( Y ) \begin{aligned} cov(X,Y) &= E[(X-E(X))(Y-E(Y))]\\ &=E[XY - XE(Y) - YE(X) + E(X)E(Y)]\\ &=E(XY)-2E(X)E(Y) + E(X)E(Y)\\ &=E(XY)-E(X)E(Y) \end{aligned} cov(X,Y)=E[(XE(X))(YE(Y))]=E[XYXE(Y)YE(X)+E(X)E(Y)]=E(XY)2E(X)E(Y)+E(X)E(Y)=E(XY)E(X)E(Y)

协方差示例
有三个人的身高体重数据,X表示身高,Y表示体重

X身高(cm): 100,150,200
Y体重(kg): 50,100,150

则身高和体重的协方差 c o v ( X , Y ) = E ( X Y ) − E ( X ) E ( Y ) 则身高和体重的协方差cov(X,Y)=E(XY)-E(X)E(Y) 则身高和体重的协方差cov(X,Y)=E(XY)E(X)E(Y)
其中:

E ( X ) = 1 3 ( 100 + 150 + 200 ) = 150 E(X)=\frac{1}{3}(100+150+200)=150 E(X)=31(100+150+200)=150,
E ( Y ) = 100 , E ( X Y ) = 1 3 ( 100 ∗ 50 + 150 ∗ 100 + 200 ∗ 150 ) = 50000 3 E(Y)=100,E(XY)=\frac{1}{3}(100*50+150*100+200*150)=\frac{50000}{3} E(Y)=100,E(XY)=31(10050+150100+200150)=350000
c o v ( X , Y ) = E ( X Y ) − E ( X ) E ( Y ) = 50000 3 − 150 ∗ 100 = 5000 3 . cov(X,Y)=E(XY)-E(X)E(Y)=\frac{50000}{3}-150*100=\frac{5000}{3}. cov(X,Y)=E(XY)E(X)E(Y)=350000150100=35000.

3. 方差 variance

在考察单个变量的分布特征时有方差(variance)的概念,方差是一个大于等于0的实数,方差为0表示变量分布完全集中在一个点上,方差越大变量的分布越分散。方差由下式给出: v a r ( X ) = E [ ( X − E ( X ) ) 2 ] var(X)=E[(X-E(X))^2] var(X)=E[(XE(X))2] 观察可以看到方差是协方差的一个特例,即cov(X,X)=var(X).$

4.模板匹配中的NCC方法

模板匹配就是给定一个目标图和一个搜索图,采用一定的搜索策略去找到一个和目标相近的区域,在刚性模板匹配中,一般都是采用滑窗的方法来搜索,在比较两个图的相似度时有很多种方法,最简单的就是两个图像直接相减,NCC(Normalized Cross Correlation)就是计算两张图的pearson相关性,值越大说明两个图像越相像。

记 T m × n 为目标图 ( t a r g e t ) 记T_{m\times n}为目标图(target) Tm×n为目标图(target), S M × N S_{M\times N} SM×N为源搜索图(source), S x , y S_{x,y} Sx,y为S中以点 ( x , y ) (x,y) (x,y)为左上角的和T大小相同的子图, R ( M − m + 1 ) × ( N − n + 1 ) R_{(M-m+1)\times (N-n+1)} R(Mm+1)×(Nn+1)为匹配的结果图,则 R ( x , y ) = c o v ( S x , y , T ) σ ( S x , y ) σ ( T ) R(x,y)=\frac{cov(S_{x,y},T)}{\sigma(S_{x,y})\sigma(T)} R(x,y)=σ(Sx,y)σ(T)cov(Sx,y,T)

其中 c o v ( S x , y , T ) = E ( S x , y T ) − E ( S x , y ) E ( T ) = Σ i = 1 m Σ j = 1 n S x , y ( i , j ) T ( i , j ) m n − S x , y ˉ T ˉ \begin{aligned} cov(S_{x,y},T) &=E(S_{x,y}T)-E(S_{x,y})E(T)\\ &=\frac{\Sigma_{i=1}^{m}\Sigma_{j=1}^{n}S_{x,y}(i,j)T(i,j)}{mn} - \bar{S_{x,y}}\bar{T} \end{aligned} cov(Sx,y,T)=E(Sx,yT)E(Sx,y)E(T)=mnΣi=1mΣj=1nSx,y(i,j)T(i,j)Sx,yˉTˉ

S x , y ˉ = Σ i = 1 m Σ j = 1 n S x , y ( i , j ) m n \bar{S_{x,y}}=\frac{\Sigma_{i=1}^{m}\Sigma_{j=1}^{n}S_{x,y}(i,j)}{mn} Sx,yˉ=mnΣi=1mΣj=1nSx,y(i,j)

T ˉ = Σ i = 1 m Σ j = 1 n T ( i , j ) m n \bar{T} = \frac{\Sigma_{i=1}^{m}\Sigma_{j=1}^{n}T(i,j)}{mn} Tˉ=mnΣi=1mΣj=1nT(i,j)

σ ( S x , y ) = v a r ( S x , y ) = Σ i = 1 m Σ j = 1 n ( S x , y ( i , j ) − S x , y ˉ ) 2 m n \sigma(S_{x,y})=\sqrt{var(S_{x,y})}=\sqrt{\frac{\Sigma_{i=1}^{m}\Sigma_{j=1}^{n}{(S_{x,y}(i,j)-\bar{S_{x,y}}})^2}{mn}} σ(Sx,y)=var(Sx,y) =mnΣi=1mΣj=1n(Sx,y(i,j)Sx,yˉ)2

σ ( T ) = v a r ( S x , y ) = Σ i = 1 m Σ j = 1 n ( T ( i , j ) − T ˉ ) 2 m n \sigma(T)=\sqrt{var(S_{x,y})}=\sqrt{\frac{\Sigma_{i=1}^{m}\Sigma_{j=1}^{n}{(T(i,j)-\bar{T}})^2}{mn}} σ(T)=var(Sx,y) =mnΣi=1mΣj=1n(T(i,j)Tˉ)2

上面的式子展开看起来感觉很复杂,以往看到的也都是这样完全展开又组合在一起的式子,就像opencv官网的解释,很完整但是让人很费解,具体为什么是这样搞不清楚(也可能是我菜吧),但是看上面R(x,y)的式子意义是很明确的,就是计算两个图之间的Pearson相关系数。按照公式就可以直接开工写代码了。

5.实现过程

观察式子: R ( x , y ) = c o v ( S x , y , T ) σ ( S x , y ) σ ( T ) R(x,y)=\frac{cov(S_{x,y},T)}{\sigma(S_{x,y})\sigma(T)} R(x,y)=σ(Sx,y)σ(T)cov(Sx,y,T)

可以发现 σ ( T ) \sigma(T) σ(T)是固定的,模板给定之后值就确定了,只需要计算一次。 σ ( S x , y )和 c o v ( S x , y , T ) \sigma(S_{x,y})和cov(S_{x,y},T) σ(Sx,y)和cov(Sx,y,T)的计算过程中一直要用到 S x , y ˉ \bar{S_{x,y}} Sx,yˉ,如果直接去计算这个平均值将会有很多计算是浪费掉的,可以用积分图来加速这个过程

几个核心的步骤

  • 计算两个图的协方差
  • 计算图的灰度均值
  • 计算图的标准差

在实现上第一版先只打算跑通整个NCC的计算流程,后续如果有机会的话可以再考虑做几个优化版本。目前很明确想到的有下面这几个:

  • 积分图加速均值的计算
  • 计算协方差时用到卷积用FFT加速
  • 金字塔加速
  • 指令集优化
  • 多线程

6.测试结果

  • source
    在这里插入图片描述

  • target

在这里插入图片描述

  • result

在这里插入图片描述

可以看到在目标处得到最大值,也就是正确匹配到了目标图。

7.部分核心源码

source image size w,h = (1095,680)
target image size w,h = (89,91)
my NCC run 10 times, use 12359.000000 ms       
opencv NCC run 10 times, use 14.000000 ms

opencv的速度是该版本的882.78倍。

NCC.cpp

namespace mycv
{


/**
 * @brief 模板匹配,归一化交叉相关算法。衡量模板和待匹配图像的相似性时
 * 用(Pearson)相关系数来度量。
 * r=cov(X,Y)/(sigma(X) * sigma(Y))
 * 其中cov(X,Y): 表示两个变量的协方差
 * cov(X,Y) = E[(X-E(x)) * (Y-E(Y))] = E(XY) - E(x)E(Y)
 * sigma(X): 表示X变量的标准差
 * sigma(Y): 表示Y变量的标准差
 * 
 * @param source : 搜索图CV_8UC1格式
 * @param target :模板图CV_8UC1格式
 * @param result : 匹配结果的map图
 * @return int : 程序运行的状态码
 */
int NormalizedCrossCorrelation(
    const cv::Mat &source,
    const cv::Mat &target,
    cv::Mat &result
    )
    {
        if(source.empty() || target.empty())
        {
            MYCV_ERROR(kImageEmpty,"NCC empty input image");
            return kImageEmpty;
        }
        int H = source.rows;
        int W = source.cols;
        int t_h = target.rows;
        int t_w = target.cols;
        if(t_h > H || t_w > W)
        {
            MYCV_ERROR(kBadSize,"NCC source image size should larger than targe image");
            return kBadSize;
        }

        //r = cov(X,Y)/(sigma(X) * sigma(Y))
        //sigma(X) = sqrt(var(X))
        int r_h = H - t_h + 1; //结果图的高度
        int r_w = W - t_w + 1;
        double target_mean = calculateMean(target);
        double target_var = calculateVariance(target,target_mean);
        double target_std_var = std::sqrt(target_var);
        result = cv::Mat::zeros(cv::Size(r_w,r_h),CV_32FC1);
        for(int row = 0; row < r_h ; row++)
        {
            float * p = result.ptr<float>(row);
            for(int col = 0; col < r_w; col++)
            {
                cv::Rect ROI(col,row,t_w,t_h);//source上和目标图匹配的子图
                cv::Mat temp = source(ROI);
                double temp_mean = calculateMean(temp);
                double cov = calculateCovariance(temp,target,temp_mean,target_mean);
                double temp_var = calculateVariance(temp,temp_mean);
                double temp_std_var = std::sqrt(temp_var);
                p[col] = cov / ((temp_std_var + 0.0000001) * (target_std_var + 0.0000001));
            }
        }


        return kSuccess;
    }


/**
 * @brief 计算图像上ROI区域内的均值
 * 
 * @param input  : 输入的图像CV_8UC1
 * @param ROI  : 输入的ROI区域
 * @param mean  : 返回的区域均值
 * @return int 
 */
int calculateRegionMean(const cv::Mat &input,const cv::Rect &ROI,double &mean)
{
    if(input.empty())
    {
        MYCV_ERROR(kImageEmpty,"input empty");
        return kImageEmpty;
    }
    if(1 != input.channels())
    {
        MYCV_ERROR(kBadDepth,"Now only sopurt for one channel image");
        return kBadDepth;
    }
    int h = input.rows;
    int w = input.cols;
    
    if((ROI.x+ROI.width > w ) || (ROI.y+ROI.height > h)
    || ROI.width <= 0 || ROI.height <= 0 )
    {
        MYCV_ERROR(kBadSize,"ROI is too big");
        return kBadSize;
    }
    int tpx = ROI.x;
    int tpy = ROI.y;
    int btx = ROI.x + ROI.width;
    int bty = ROI.y + ROI.height;
    double sum = 0;
    for(int row = tpy; row < bty; row++)
    {
        const uchar *p = input.ptr<uchar>(row);
        for (int col = tpx ; col < btx ; col++)
        {
            sum += p[col];
        }
    }
    int pixels_num = ROI.height * ROI.width;
    mean = sum / pixels_num;
    return kSuccess;
}

/**
 * @brief 计算两个输入图的协方差,两个输入图的尺寸需要一致,在计算目标图和原图子块的协方差时,
 * 目标图(模板图)是固定的,均值只需要计算一次,所以如果传入图像均值的话就不在计算均值,均值默认为-1
 * cov(X,Y): 表示两个变量的协方差
 * cov(X,Y) = E[ (X-E(x)) * (Y-E(Y)) ] = E(XY) - E(x)E(Y)
 * 
 * @param A  : 输入图A CV_8UC1
 * @param B  : 输入图B CV_8UC1
 * @param mean_a  : A的像素均值
 * @param mean_b  : B的像素均值
 * @return double : 两个图像的协方差
 */
double calculateCovariance(const cv::Mat &A, const cv::Mat &B,double mean_a,double mean_b)
{
    if(A.empty() || B.empty())
    {
        MYCV_ERROR(kImageEmpty,"input image is empty");
        return kImageEmpty;
    }
    if (A.cols != B.cols || A.rows != B.rows)
    {
        MYCV_ERROR(kBadSize,"mat A B should be in same size");
        return kBadSize;
    }
    
    //E(XY)
    double sum = 0;
    for (int row = 0; row < A.rows; row++)
    {
        const uchar *pa = A.ptr<uchar>(row);
        const uchar *pb = B.ptr<uchar>(row);
        for (int  col = 0; col < A.cols; col++)
        {
            sum += (double)pa[col] * (double)pb[col];
        }
        
    }

    double mean_AB = sum / ((double)A.rows * (double)A.cols);

    if (-1 == mean_a)
    {
        mean_a = calculateMean(A);
    }
    if (-1 == mean_b)
    {
        mean_b = calculateMean(B);
    }
    
    //cov(X,Y) = E[ (X-E(x)) * (Y-E(Y)) ] = E(XY) - E(x)E(Y)
    double cov_AB = mean_AB - (mean_a * mean_b);
    
    return cov_AB;
}

/**
 * @brief 计算输入图像的方差,如果已知mean就不再计算mean
 * 
 * @param image  : 输入图CV_8UC1
 * @param mean  : 图像的灰度均值,默认值为-1,不输入时会计算mean
 * @return double :图像的方差
 */
double calculateVariance(const cv::Mat &image,double mean)
{
    if (image.empty())  
    {
        MYCV_ERROR(kImageEmpty,"empty image");
        return -1;//正常的方差不会小于0
    }
    if (-1 == mean)
    {
        mean = calculateMean(image);
    }

    double sum = 0 ;
    for (int  row = 0; row < image.rows; row++)
    {
        const uchar * p = image.ptr<uchar>(row);
        for (int col = 0; col < image.cols; col++)
        {
            sum += (p[col] - mean) * (p[col] - mean);
        }
        
    }

    double var = sum / ((double)image.cols * (double)image.rows);
    
    return var;    
}



/**
 * @brief 计算输入图的灰度均值
 * 
 * @param image  : 输入图CV_8UC1
 * @return double : 输入图像的灰度均值
 */
double calculateMean(const cv::Mat &image)
{
     if (image.empty())  
    {
        MYCV_ERROR(kImageEmpty,"empty image");
        return -1;
    }

    double sum = 0 ;
    for (int  row = 0; row < image.rows; row++)
    {
        const uchar * p = image.ptr<uchar>(row);
        for (int col = 0; col < image.cols; col++)
        {
            sum += p[col];
        }
        
    }

    double mean = sum / ((double)image.cols * (double)image.rows);
    return mean;
}




} //end namespace mycv

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

【NCC】之一:从Pearson相关系数到模板匹配的NCC方法 的相关文章

  • form表单中把星号*去掉

    只需要把required true去掉就好了 关于表单验证中会有许多的细节问题需要注意 写法有很多种 注意格式 还有一点 xff0c 如果验证方法是写在行内 xff0c 那么他的方法需要在methods种写
  • 移动端开发的vconsole插件

    vConsole A lightweight extendable front end developer tool for mobile web page 一个轻量级 可扩展的移动网页前端开发工具 是腾讯的一个开源工具 功能 xff1a
  • vite打包工具的介绍

    vite Vite是Vue的作者尤雨溪开发的Web开发构建工具 xff0c 它是一个基于浏览器原生ES模块导入的开发服务器 xff0c 在开发环境下 xff0c 利用浏览器去解析import xff0c 在服务器端按需编译返回 xff0c
  • 初步了解win32界面库DuiLib

    DuiLib是一个开源win32界面库 xff1b 下载地址 xff1a https github com duilib duilib 可以做类似一些杀毒软件的界面 xff1b 效果还是比较好 xff1b 先下载一个demo看一下 xff1
  • this指向 js作用域链

    this 指向 xff5c 作用域与闭包 实战是检验真理的唯一标准深入理解 this作用域闭包到底是什么 this 问题总结 这里将以实战为引子 xff0c 带领大家一起总结出 this 指向问题的规律 默认绑定 xff08 函数直接调用
  • css中zoom和scale

    css中我们常用来缩放的样式元素是transform scale xff1b 也还有我们不熟悉的zoom xff0c 在实际的应用场景中 xff0c 我们需要根据自身项目的需要 xff0c 结合不同的解决方案的优缺点来选择适合我们项目解决方
  • 客户端存储和http缓存

    通过本文学习 xff0c 将获得以下知识 xff1a 1 web 端存储有哪些方式 2 不同存储之间的区别 xff0c 以及使用场景 3 http缓存有哪些策略 web 存储的由来 为什么需要 web 存储呢 xff0c 也就是客户端存储
  • 将React 类组件转换成 函数式组件

    将React 类组件转换成 函数式组件 步骤 xff1a 将class 类定义的React 元素转换成 变量或者函数class 中的 render 函数 直接去掉 xff0c 直接return html 元素将 state 变量使用 use
  • IndexedDB 数据库的使用

    前端的存储方式 前端的存储 xff0c 可以使得页面交互更加友好 xff0c 特别是在保存草稿 xff0c 网络差的情况下对用户来说是很有用的 前端的存储方式有多种 xff0c 像 Local storage Session storage
  • typedef的使用

    typedef的使用 1 为基本数据类型定义新的类型名 typedef double MYDBL 2 为自定义类型 xff08 结构体 共用体和枚举 xff09 起别名 简化类型名关键字 span class token keyword t
  • 解决Vscode每次连接ssh登入需要输入密码问题(免密登入)

    提示 xff1a 解决Vscode每次连接ssh登入需要输入密码问题 xff08 免密登入 xff09 文章目录 问题一 解决方案二 使用步骤1 win10操作 参考文献 问题 可以看到每次登入 xff0c 或者切换的时候都需要输入密码 x
  • 《Bottom-Up and Top-Down Attention for Image Captioning and Visual Question Answering》——2018 CVPR论文笔记

    这是一篇2018 年的 CVPR 的论文 xff0c 使用自下而上和自上而下相结合的注意力机制实现了image captioning和 VQA xff0c 作者使用这个注意力模型在image captioning上取得了非常好的效果 xff
  • Arduino Esp8266 UDP通信

    使用2个WeMos D1mini通过UDP通信实现传输字符串类 WeMos D1 Mini 基于Esp8266的开发板 用Arduino Ide 43 安卓线即可实现程序编译烧录 非常适合于物联网 通信等方面 UDP通信 UDP通信很近似于
  • ROS学习笔记#4 ros节点介绍&常见的rosnode命令

    ros节点 xff1a 是运行计算的过程 xff0c 所有的节点都包含在一张图中 xff08 rqt graph可以查看 xff09 xff0c 通过话题流 xff0c RPC服务和参数服务器彼此进行通信 xff0c 1个机器人控制系统包含
  • MFC CArray类的基本使用

    CArray 类 支持类似于 C 数组的数组 xff0c 但可以根据需要动态减小和增大 语法 template lt class TYPE class ARG TYPE 61 const TYPE amp gt class CArray p
  • 树莓派4B上手教程 2.SSH安装及相关设置

    SSH简介 SSH是一种网络协议 xff0c 用于计算机之间的加密登录 如果一个用户从本地计算机 xff0c 使用SSH协议登录另一台远程计算机 xff0c 我们就可以认为 xff0c 这种登录是安全的 xff0c 即使被中途截获 xff0
  • Ubuntu4B上手教程 3.5如何关闭虚拟桌面

    暑假马上要完事了 树莓派也跟着我要换网络环境 现在的树莓派 虽说插上电就能用 但是也得是同一局域网下 到学校wifi就换了 不知道怎么在ssh和vnc都用不了的情况下让树莓派连接新的WiFi 于是今天想着把虚拟桌面先关掉它 学校起码有显示器
  • 树莓派4B上手教程 4.ROS2不换源安装

    安装ROS对于大多数人来说是一个比较不好的回忆 再难受也得一步一步来啊 不多说了 分享一下我安装ROS2的一些经验 安装环境 我的安装环境是树莓派4B 烧的Ubuntu22 04LTS桌面版镜像 对应的ROS版本是ros2 humble 安
  • 苹果输入法自动合并两个短横线/减号的解决方法

    最近在学MD的时候学到了表格 xff0c 怎么打都打不出来 仔细一看发现在连着打两个横线的时候 xff0c 他合到了一起了 解决方法 设置 通用 键盘 智能标点 Off 问题解决
  • (一篇绝杀)考研英语二阅读题型与技巧总结

    目录 题型一 xff1a 词汇 短语 句子题 xff08 indicate xff09 题型二 xff1a 推断题 xff08 inferred implicit indicate xff09 题型三 xff1a 判断题 xff08 EXC

随机推荐

  • Cache 和 Buffer 都是缓存,主要区别是什么?

    提到这个问题 xff0c 可能意味着你意识到了两者的相关性 的确 xff0c 他们确实有那么一些联系 首先cache是缓存 xff0c buffer是缓冲 xff0c 虽然翻译有那么一个字的不同 xff0c 但这不是重点 个人认为他们最直观
  • C++课后练习

    题目需求 xff1a 编写一个程序 xff0c 它要求用户首先输入其名 xff0c 再输入其姓 然后程序使用一个逗号和空格组合起来 xff0c 并存储和显示组合结果 请使用char数组和头文件cstring 中的函数 xff0c 下面是该程
  • 像睿智一样简单地使用 Shiro

    加我微信索要我正在使用的 Apacher Shiro参考手册中文版学习 pdf 我们一起学习吧 Apache Shiro 中文文档 Apache Shiro 教程 Docs4dev Apache Shiro 是一个功能强大且易于使用的 Ja
  • Zookeeper 安装

    单机版 1 下载 tar gz 2 解压到 usr local zookeeper 下 3 在任何地方 xff08 我是在zookeeper bin 同级下 xff09 创建一个data文件夹 xff0c 用于存放运行时缓存数据 4 在 c
  • 【推荐系统算法之多任务学习】

    推荐系统算法之多任务学习 引言多任务学习设计思路ESMM模型实验 MMOE模型 引言 本文主要是在组队学习 xff0c pytorch复习推荐模型课程中 xff0c 学习课程笔记进行的总结 多任务学习 多任务学习是指模型在同一时间可以学习多
  • Idea快捷键

    1 进入 返回方法快捷键 Ctrl 43 B 进入光标所在方法定义的地方或返回该方法被使用的地方 xff08 代替Ctrl 43 鼠标点击方法进入方式 xff0c 避免了手指在键盘和鼠标之间切换 xff0c 非常好用的快捷键 xff09 C
  • ASP.NET C# 获取当前日期 时间 年 月 日 时 分 秒

    转贴 xff09 在 ASP net c 中 我们可以通过使用DataTime这个类来获取当前的时间 通过调用类中的各种方法我们可以获取不同的时间 xff1a 如 xff1a 日期 xff08 2008 09 04 xff09 时间 xff
  • ASP.NET中的几种弹出框提示基本方法

    NET程序的开发过程中 xff0c 常常需要和用户进行信息交互 xff0c 对话框的出现将解决了这些问题 xff0c 下面是本人对常用对话框使用的小结 xff0c 希望对大家有所帮助 我们在 NET程序的开发过程中 xff0c 常常需要和用
  • 单链表的就地逆置(头插,就地,递归)

    http blog csdn net lycnjupt article details 47103433 https blog csdn net v xchen v article details 53067448 单链表的就地逆置是指辅助
  • Panads(四):数据清洗——对缺失值的处理

    文章目录 一 处理缺失值的四个函数二 使用1 1 数据样子1 2 处理 一 处理缺失值的四个函数 isnull函数 xff1a 检测是否是空值 xff0c 可用于df和series notnull函数 xff1a 检测是否是空值 xff0c
  • 单片机数字钟(调时,调时闪烁,万年历,年月日)超详细解析

    2019 07 13 单片机数字钟 xff08 调时 xff0c 调时闪烁 xff0c 万年历 xff0c 年月日 xff09 超详细解析 发表日期 xff1a 2019 07 13 单片机开发板 xff1a 巫妖王2 0 xff0c 使用
  • MATLAB轨迹规划 发给ROS中机器人实现仿真运动

    MATLAB轨迹规划 发给ROS中机器人实现仿真运动 现象如图所示 xff1a 0 matlab 与 ROS 通信 xff1a https blog csdn net qq 40569926 article details 11216287
  • 树莓派 Ubuntu mate 16.04使用VNC开启远程桌面

    1 安装 vncserver sudo apt span class token operator span get span class token operator span y install vnc4server 2 启动 vncs
  • js for in 循环出现bug

    这样使用for in循环时可能会有一种bug for let item in list 原因 xff1a for in循环会把某个类型的原型 prototype 中方法与属性给遍历出来 xff0c 所以这可能会导致代码中出现意外的错误 解决
  • 面试官:Spring中用了哪些设计模式?

    spring中常用的设计模式达到九种 xff0c 我们举例说明 以后再也不怕面试官问我 xff1a Spring中用了哪些设计模式了 1 简单工厂模式 又叫做静态工厂方法 xff08 StaticFactory Method xff09 模
  • 论文笔记 | Learning Deep Features for Discriminative Localization

    作者 Bolei Zhou Aditya Khosla Agata Lapedriza Aude Oliva Antonio Torralba Bolei Zhou Abstract 受到NIN 的启发 xff0c 将global aver
  • stm32 编码器配置

    stm32f103 void TIM4 Encoder Config void GPIO InitTypeDef GPIO InitStructure span class hljs comment span TIM TimeBaseIni
  • 树莓派部署(三):安装teamviewer远程软件

    安装teamviewer远程软件 下载Teamviewer安装因受网络原因影响 xff0c 国外源安装依赖失败则需要切换源一 修改文件二 安装依赖三 安装Teamviewer三 启动Teamviewer 不用命令行启动可忽略 下载Teamv
  • 【数字图像处理】MATLAB实现直方图均衡化

    直方图均衡化的MATLAB实现 目录 1 回顾 直方图均衡化2 代码实现 1 回顾 直方图均衡化 基本原理 直方图均衡化方法的基本思想是 xff1a 对在图像中像素个数多的灰度级进行展宽 xff0c 而对像素个数少的灰度级进行缩减 xff0
  • 【NCC】之一:从Pearson相关系数到模板匹配的NCC方法

    文章目录 lt center gt NCC Normalized Cross Correlation 1 Pearson相关系数 2 协方差 covariance 3 方差 variance 4 模板匹配中的NCC方法5 实现过程6 测试结