sift算法

图像特征算法(二)——SURF算法简述及Python标记SURF特征检测实践 SURF算法简述及Python标记SURF特征检测实践一、SURF算法1.算法简介2.SURF与SIFT的具体差异二、Python代码实践1.测试环境2.测试代码3.核心函数4.测试结果 一、SURF算法 1.算法简介 SURF(Speeded-Up Robust Features)加速稳健特征,是一种稳健的局部特征点检测和描述算法。 SURF是对SIFT算法的改进,该算子在保持 SIFT 算子优良性能特点的基础上,同时解决了 SIFT 计算复杂度高、耗时长的缺点,提升了算法的执行效率,为算法在实时计算机视 阅读详情


作者:tornadomeet 出处:http://www.cnblogs.com/tornadomeet 欢迎转载或分享,但请务必声明文章出处。

sift算法在cv领域的重要性不言而喻,该作者的文章引用率在cv界是number1.本篇博客只是本人把sift算法知识点整理了下,以免忘记。本文比较早的一篇博文opencv源码解析之(3):特征点检查前言1 中有使用opencv自带的sift做了个简单的实验,而这次主要是利用Rob Hess的sift源码来做实验,其实现在的opencv版本中带的sift算法也是Rob Hess的,只是稍微包装了下。

  首先网上有不少文章介绍了sift算法,写得都不错,比如: 

     http://www.cnblogs.com/cfantaisie/archive/2011/06/14/2080917.html

     该博客对sift算法理论做了介绍,且有示意图辅助理解,从该文中可以了解sift算法的大概流程.

     http://www.cnblogs.com/linyunzju/archive/2011/06/14/2080950.html

     这篇文章对sift算法做了通俗易懂的解释.

  http://blog.youkuaiyun.com/v_july_v/article/category/795430

  这篇博客有教你怎样用c语言一步一步写sift算法。

  http://underthehood.blog.51cto.com/2531780/658350

  该文也对sift做了详细的介绍,博客的作者还对sift匹配做了讲解。

 

  下面还是简单看下sift算法的理论,具体的内容可以参考上面的几篇文章。

 

  一、Sift描述子形成的步骤

 

  1、 构造高斯差分空间图像。

  Sift特征点的检测时在DOG图像上进行的,DOG图像是将相邻尺度空间图像相减得到的。且金字塔的每一层都要构造一个DOG空间图像。默认参数是金字塔4层,即4个octave,每一个octave中有5张不同尺度的图片,不同octave的图片尺寸大小不同,所以每一层中就会得到4幅DOG图像。

高斯金字塔的第1层第1副原图像是将原图像放大2倍且sigma(sigma=1.6)模糊,第2幅图像是k*sigma(k等于根号2)模糊,第3幅是k*k*sigma模糊,后面类推…

     高斯金字塔第2层第1幅图是选择金字塔上一层(这里是第1层)中尺度空间参数为k*k*sigma的那幅图(实际上是2倍的尺度空间)进行降采样(尺寸大小为原来的1/4倍)得到,如果k不等于根号2,那么取原图的2*sigma降采样得到。第2层第2幅图是在本层第一幅图尺度模糊系数增加k倍模糊后的图像,后面类似…

  示意图如下所示:

  

     尺度不变当然是与图片尺寸有关,即图片的尺寸大小变化,但是其检测结果不变。

 

  2、寻找极大极小值点。

  将每个像素点与其所在的那幅图像邻域的8个像素,它所在的向量尺度空间上下2幅图对应位置邻域各9个点,总共26个点进行像素值比较,如果该点是最大或者最小点,则改点就暂时列为特征点。

  其邻图如下:

  

 

  3、精确定位极值点

  子像素级极值点:

  由于上面找到的近似极值点落在像素点的位置上,实际上我们在像素点附近如果用空间曲面去拟合的话,很多情况下极值点都不是恰好在像素点上,而是在附近。所以sift算法提出的作者用泰勒展开找到了亚像素级的特征点。这种点更稳定,更具有代表性。

  消除对比度低的特征点:

  对求出亮度比较低的那些点直接过滤点,程序中的阈值为0.03.

  消除边界上的点:

  处理方法类似harrs角点,把平坦区域和直线边界上的点去掉,即对于是边界上的点但又不是直角上的点,sift算法是不把这些点作为特征点的。

 

  4、选取特征点主方向

  在特征点附近选取一个区域,该区域大小与图图像的尺度有关,尺度越大,区域越大。并对该区域统计36个bin的方向直方图,将直方图中最大bin的那个方向作为该点的主方向,另外大于最大bin80%的方向也可以同时作为主方向。这样的话,由于1个特征点有可能有多个主方向,所以一个特征点有可能有多个128维的描述子。如下图所示:

  

 

     5、 构造特征点描述算子。

     以特征点为中心,取领域内16*16大小的区域,并把这个区域分成4*4个大小为4*4的小区域,每个小区域内计算加权梯度直方图,该权值分为2部分,其一是该点的梯度大小,其二是改点离特征点的距离(二维高斯的关系),每个小区域直方图分为8个bin,所以一个特征点的维数=4*4*8=128维。示意图如下(该图取的领域为8*8个点,因此描述子向量的维数为32维):

  

 

   6、实验部分

         下面来做下试验,试验sift代码采用Rob Hess的代码,opencv目前版本中的sift源码也是采用Rob Hess的。代码可以在他的主页上下载:http://blogs.oregonstate.edu/hess/code/sift/

这里我下载的是windows版本的,并采用Qt做了个简单的界面。

         环境:WindowsXP+Opencv2.4.2+Qt4.8.2+QtCreator2.5.1,QtCreator内部采用的是vc的编译器。

         运行软件,单击Open Image后选择一张需要进行特征点检测的图片,我这里显示的结果如下:  

    

 

         单击Sift Detect按钮后,检测到的效果如下:

    

  

   

主要代码部分如下(附录有工程code下载链接):

SiftDetect.h:

复制代码
#ifndef SIFTDETECT_H
#define SIFTDETECT_H

#include <QDialog>
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
//#include <opencv/cxcore.h>
//#include <opencv/highgui.h>
//#include <opencv/imgproc.h>
#include <stdio.h>
#include <stdio.h>
#include "sift.h"
#include "imgfeatures.h"
#include "utils.h"


using namespace cv;

namespace Ui {
class SiftDetect;
}

class SiftDetect : public QDialog
{
    Q_OBJECT
    
public:
    explicit SiftDetect(QWidget *parent = 0);
    ~SiftDetect();
    
private slots:


    void on_openButton_clicked();

    void on_detectButton_clicked();

    void on_closeButton_clicked();

private:
    Ui::SiftDetect *ui;

    Mat src, dst;
    IplImage* img;
    struct  feature* features;
    int n;
    int display;
    int intvls;
    double sigma;
    double contr_thr;
    int curv_thr;
    int img_dbl;
    int descr_width;
    int descr_hist_bins;
};

#endif // SIFTDETECT_H
复制代码

 

SiftDetect.cpp:

复制代码
#include "siftdetect.h"
#include "ui_siftdetect.h"
#include <QtGui>
#include <QtCore>
#include "sift.h"
#include "imgfeatures.h"
#include "utils.h"
//#include <sift.c>

SiftDetect::SiftDetect(QWidget *parent) :
    QDialog(parent),
    ui(new Ui::SiftDetect)
{
    ui->setupUi(this);

    n = 0;
    display = 1;
    intvls = SIFT_INTVLS;
    sigma = SIFT_SIGMA;
    contr_thr = SIFT_CONTR_THR;
    curv_thr = SIFT_CURV_THR;
    img_dbl = SIFT_IMG_DBL;
    descr_width = SIFT_DESCR_WIDTH;
    descr_hist_bins = SIFT_DESCR_HIST_BINS;
}

SiftDetect::~SiftDetect()
{
 //   cvReleaseImage( &img );//释放内存退出程序后竟然报错
    delete ui;
}



void SiftDetect::on_openButton_clicked()
{
    QString img_name = QFileDialog::getOpenFileName(this, "Open Image", "../sift_detect",
                                                    tr("Image Files(*.png *.jpeg *.jpg *.bmp)"));
  //  img = cvLoadImage( img_name.toAscii().data() );
    src = imread( img_name.toAscii().data() );
    imwrite( "../sift_detect/src.jpg", src );
    ui->textBrowser->clear();
    ui->textBrowser->setFixedSize( src.cols, src.rows );
    ui->textBrowser->append( "<img src=../sift_detect/src.jpg>" );

}

void SiftDetect::on_detectButton_clicked()
{
    //将Mat型的src转换成IplImage*型的img,因为这里是opencv新老版本混合编程的方法。
     img = &src.operator IplImage();
     n = _sift_features( img, &features, intvls, sigma, contr_thr, curv_thr, img_dbl, descr_width, descr_hist_bins );
     if( display )
         {
             draw_features( img, features, n );
             ui->textBrowser->clear();
             //将IplImage*型的img转换成Mat型的dst,这也是opencv新老版本混合编程的一种方法。
             dst = Mat( img );
             imwrite( "../sift_detect/dst.jpg", dst );
             //cvSaveImage( "../sift_detect/dst.jpg", img );
             ui->textBrowser->append( "<img src=../sift_detect/dst.jpg>" );
         }
}

void SiftDetect::on_closeButton_clicked()
{
    close();
}
复制代码

 

 

  二、Sift特征点匹配过程

 

  由步骤一我们已经获得了图片的特征点向量集合。现在来看看特征点匹配,特征点匹配的一个应用就是物体的识别,比如说我有2张图片A和B,图片的内容相同,只是图片的大小尺寸不同。假设A图片尺寸比较大,且我们已经采用sift算法对图片A和B都进行了检测,获得了它们的特征点集合,现在我们的问题是需要把A和B中相应的特征点给对应连线起来。

  既然是匹配,当然每个特征点向量要相似才能匹配到一起,这里采用的是欧式距离来衡量其相似度。

  对B中的特征点x,去寻找A中最相似的点y,最简单的方法就是拿x与A中所有点进行相似度比较,距离最小的那个为匹配点。但是如果图片中特征点数目很多的话,这样效率会很低。所以我们需要把A中特征点向量集合用一种数据结构来描述,这种描述要有利于x在A中的搜索,即减少时间复杂度。在sift匹配中,这种数据结构采用的是kd-tree。

  关于kd-tree的讲解,可以参考博文http://underthehood.blog.51cto.com/2531780/687160

  里面讲得比较详细,且举了例子,很容易理解,这里就没有必要重复了。

     同样,采用Rob Hess的代码做了个sift匹配的实验,开发环境与上面的一样。

     打开软件后,单击Open Image按钮,依次打开需要匹配的2张图片,如下图所示:

  

 

     单击Sift Detect按钮,则程序会单独对这2幅图片进行sift特征点检测,结果如下图所示:

  

 

     单击Sift Match按钮,则会对这2幅图的特征点结果进行匹配,本次实验的匹配图如下所示:

  

 

实验主要部分代码(附录有工程code链接下载):

SiftMatch.h:

复制代码
#ifndef SIFTMATCH_H
#define SIFTMATCH_H

#include <QDialog>
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>

using namespace cv;

namespace Ui {
class SiftMatch;
}

class SiftMatch : public QDialog
{
    Q_OBJECT
    
public:
    explicit SiftMatch(QWidget *parent = 0);
    ~SiftMatch();
    
private slots:
    void on_openButton_clicked();

    void on_detectButton_clicked();

    void on_matchButton_clicked();

    void on_closeButton_clicked();

private:
    Ui::SiftMatch *ui;
    Mat src1, src2, src1_c, src2_c, dst;
    IplImage *img1, *img2, *img3, *stacked;
    Point pt1, pt2;
    double d0, d1;
    struct feature *feat1, *feat2, *feat;
    struct feature **nbrs;
    struct kd_node *kd_root;
    int open_image_number;
    int n1, n2, k, i, m;
};

#endif // SIFTMATCH_H
复制代码

 

SiftMatch.cpp:

复制代码
#include "siftmatch.h"
#include "ui_siftmatch.h"

#include <QtCore>
#include <QtGui>
#include "imgfeatures.h"
#include "kdtree.h"
#include "minpq.h"
#include "sift.h"
#include "utils.h"
#include "xform.h"

/* the maximum number of keypoint NN candidates to check during BBF search */
#define KDTREE_BBF_MAX_NN_CHKS 200

/* threshold on squared ratio of distances between NN and 2nd NN */
#define NN_SQ_DIST_RATIO_THR 0.49

SiftMatch::SiftMatch(QWidget *parent) :
    QDialog(parent),
    ui(new Ui::SiftMatch)
{    
    open_image_number = 0;
    m = 0;

    ui->setupUi(this);   
}

SiftMatch::~SiftMatch()
{
    delete ui;
}

void SiftMatch::on_openButton_clicked()
{
    QString img_name = QFileDialog::getOpenFileName(this, "Open Image", "../sift_detect",
                                                    tr("Image Files(*.png *.jpeg *.jpg *.bmp)"));
    open_image_number++;
    //打开第1张图片
    if( 1 == open_image_number )
        {
            src1 = imread( img_name.toAscii().data() );
            img1 = cvLoadImage( img_name.toAscii().data() );
            //转换成IplImage*类型,但是这样转换过的后面使用起来感觉还是不特别顺利,说明并不是完全100%兼容了。
      //      img1 = &src1.operator IplImage();
            imwrite( "../sift_match/src1.jpg", src1 );
            ui->textBrowser->setFixedSize( src1.cols, src1.rows );
            ui->textBrowser->append( "<img src=../sift_match/src1.jpg>" );
         }
    //打开第2张图片
    else if( 2 == open_image_number )
        {
            src2 = imread( img_name.toAscii().data() );
            img2 = cvLoadImage( img_name.toAscii().data() );
         //   img2 = &src2.operator IplImage();
            imwrite( "../sift_match/src2.jpg", src2 );
            ui->textBrowser->setFixedSize( src2.cols+src1.cols, src2.rows+src1.rows );
            ui->textBrowser->append( "<img src=../sift_match/src2.jpg>" );
        }
    else
        open_image_number = 0;

}

void SiftMatch::on_detectButton_clicked()
{
    //将2幅图片合成1幅图片
    //img1 = cvLoadImage();
    stacked = stack_imgs( img1, img2 );
    ui->textBrowser->clear();

    //显示第1幅图片上的特征点
    n1 = sift_features( img1, &feat1 );
    draw_features( img1, feat1, n1 );
    src1_c = Mat(img1);
    imwrite("../sift_match/src1_c.jpg", src1_c);
    ui->textBrowser->append("<img src=../sift_match/src1_c.jpg>");

    //显示第2幅图片上的特征点
    n2 = sift_features( img2, &feat2 );
    draw_features( img2, feat2, n2 );
    src2_c = Mat(img2);
    imwrite("../sift_match/src2_c.jpg", src2_c);
    ui->textBrowser->append("<img src=../sift_match/src2_c.jpg>");
}

void SiftMatch::on_matchButton_clicked()
{
    kd_root = kdtree_build( feat2, n2 );
    for( i = 0; i < n1; i++ )
        {
            feat = feat1+i;
            k = kdtree_bbf_knn( kd_root, feat, 2, &nbrs, KDTREE_BBF_MAX_NN_CHKS );
            if( k == 2 )
                {
                    d0 = descr_dist_sq( feat, nbrs[0] );
                    d1 = descr_dist_sq( feat, nbrs[1] );
                    if( d0 < d1 * NN_SQ_DIST_RATIO_THR )
                        {
                            pt1 = Point( cvRound( feat->x ), cvRound( feat->y ) );
                            pt2 = Point( cvRound( nbrs[0]->x ), cvRound( nbrs[0]->y ) );
                            pt2.y += img1->height;
                            cvLine( stacked, pt1, pt2, CV_RGB(255,0,255), 1, 8, 0 );
                            m++;
                            feat1[i].fwd_match = nbrs[0];
                        }
                }
             free( nbrs );
         }
    dst = Mat( stacked );
    imwrite( "../sift_match/dst.jpg", dst );
    ui->textBrowser->clear();
    ui->textBrowser->setFixedSize( dst.cols, dst.rows );
    ui->textBrowser->append("<img src=../sift_match/dst.jpg>");

}

void SiftMatch::on_closeButton_clicked()
{
    close();
}
复制代码

 

   总结:

   通过整理下sift算法知识点,对sift算法有了更全面的认识,另外感谢Rob Hess开源了sift算法的代码,感觉写好这个算法确实不同意的。(另外,本文博客中引用了上面提到的博客中的图片,在此声明一下。)

 

 

         附录一:

         Rob Hess sift的c代码在c++中的使用。

由于Rob Hess的代码是基于c的,如果在其它关于界面开发的c++程序中,比如Qt,MFC等。我这里是Qt,连接时会报如下错误:

siftdetect.obj:-1: error: LNK2019: 无法解析的外部符号 "int __cdecl _sift_features(struct _IplImage *,struct feature * *,int,double,double,int,int,int,int)" (?_sift_features@@YAHPAU_IplImage@@PAPAUfeature@@HNNHHHH@Z),该符号在函数 "private: void __thiscall SiftDetect::on_detectButton_clicked(void)" (?on_detectButton_clicked@SiftDetect@@AAEXXZ) 中被引用

         网上也有不少网友碰到过类似的情况,比如http://www.opencv.org.cn/forum/viewtopic.php?p=53307和http://topic.youkuaiyun.com/u/20120111/21/0368bba0-54b4-42df-8ed5-8e50920ac197.html 但是他们都没有给出解决办法。

         因此我们要找本质的原因,原因就是c语法和c++语法毕竟不同,所以难免有些兼容性问题。看错误提示我们知道是在函数_sift_features时报的错,该函数在Rob Hess的头文件中是被定义的extern类型。而在c的编译器中,extern的函数文件名编译后会自动在前面加一杆,”_”;而c++语法中会有函数重载的现象,因此它不是像c那样直接在前面加”_”,否则会冲突,因此c++编译器会在其函数名后面加入一些像乱码的东西(反正链接时是机器去寻找,只要能区分即可)。

         具体的内容可以参考博客:http://blog.youkuaiyun.com/wujian53/article/details/706975 这里面讲得比较明白,谢谢这位博主。

         本次实验的解决方法是在Rob Hess的sift.h等几个头文件文件开始处加入语句:

#ifdef __cplusplus

extern "C" {

#endif     

该文件的结处加入语句:

#ifdef __cplusplus

}

#endif

 

  这样的话编译器在编译该文件时会知道这是C语法,所以其中间文件命名规则会相应改变,问题也就相应的解决了。

     另外,如果出现错误提示:

  utils.obj:-1: error: LNK2019: 无法解析的外部符号 _va_end,该符号在函数 _fatal_error 中被引用。

    则在utils.c代码中找到va_start( ap, format );和va_end( ap );并将其注释起来即可。


SIFT算法详解 尺度不变特征变换匹配算法详解 Scale Invariant Feature Transform(SIFT) Just For Fun zdd  zddmail@gmail.com 对于初学者,从David G.Lowe的论文到实现,有许多鸿沟,本文帮你跨越。 1、SIFT综述 尺度不变特征转换(Scale-invariant feature transform或SIFT) 阅读详情

相关推荐

【Python】:SIFT算法的实现

SIFTSIFTSIFT 本文侧重于如何使用Python语言实现SIFT算法 一、什么是SIFT算法   SIFT,即尺度不变特征变换(Scale-invariant feature transform,SIFT),是用于图像处理领域的一种描述。这种描述具有尺度不变性,可在图像中检测出关键点,是一种局部特征描述子。 二、准备工作 2.1 实验设备   本文在Windows10系统上,使用pycharm软件完成所有实验。 2.2 OpenCV安装   我们可以使用OpenCV库中的cv2.xfeatures2

王乐予的博客 2万+

C++ OpenCV4.5版本SIFT特征检测及匹配

学更好的别人,做更好的自己。——《微卡智享》本文长度为2739字,预计阅读6分钟前言关于SIFT的特征点检测在《C++ OpenCV特征提取之SIFT特征检测》有介绍过,在OpenCV4....

Vaccae的博客 1万+

SIFT算法原理

SIFT算法 SIFT即尺度不变特征变换,是用于图像处理领域的一种描述。这种描述具有尺度不变性,可在图像中检测出关键点,是一种局部特征描述子。 一、SIFT算法特点: 1、具有较好的稳定性和不变性,能够适应旋转、尺度缩放、亮度的变化,能在一定程度上不受视角变化、仿射变换、噪声的干扰。 2、区分性好,能够在海量特征数据库中进行快速准确的区分信息进行匹配 3、多量性,就算只有单个物体,也能产生大量特征...

Yokia 16万+

特征点检测学习_1(sift算法)

      sift算法在cv领域的重要性不言而喻,该作者的文章引用率在cv界是number1.本篇博客只是本人把sift算法知识点整理了下,以免忘记。本文比较早的一篇博文opencv源码解析之(3):特征点检查前言1 中有使用opencv自带的sift做了个简单的实验,而这次主要是利用Rob Hess的sift源码来做实验,其实现在的opencv版本中带的sift算法也是Rob Hess的,只...

weixin_33862041的博客 500

SIFT算法

文章目录1、基本内容1.1 起源1.2 解决的问题1.3 概念2、实现步骤3、SIFT算法3.1 SIFT特征提取并展示特征点3.1.1 单张照片3.1.2 多张照片3.2 两张图片的SIFT特征匹配3.3 输出匹配最多的三张图片4、总结 1、基本内容 1.1 起源 David G.Lowe教授在1999年总结了基于特征不变技术的检测方法,在图像尺度空间基础上,提出了对图像缩放、旋转保持不变性的图...

weixin_44060222的博客 2182

Matlab实现SIFT+RANSAC图像拼接与融合

本资源是用Matlab实现的SIFT+RANSAC图像拼接与融合源码。 其中main.m是主程序,里面对各功能函数有比较详细的说明。 应该是点击运行,然后等待一会就可以跑出最终结果及中间结果。

detectSIFTFeatures(MATLAB)

detectSIFTFeatures(MATLAB)

qq_71547093的博客 1002

sift特征提取与匹配C++范例(基于opencv、VS17)

sift特征提取与匹配C++代码,1000行完整代码,超详细注释,基本每五行一注释,有少许BUG。 1.提取特征点算法(包括尺度空间的极值探测、关键点的精确定位、确定关键点的主方向、关键点的描述); 2.匹配算法 3.运行需要调用openCV3.4.0库。

SIFT算法原理介绍

SIFT算法 SIFT即尺度不变特征变换,是用于图像处理领域的一种描述。这种描述具有尺度不变性,可在图像中检测出关键点,是一种局部特征描述子。 一、SIFT算法特点: 1、具有较好的稳定性和不变性,能够适应旋转、尺度缩放、亮度的变化,能在一定程度上不受视角变化、仿射变换、噪声的干扰。 2、区分性好,能够在海量特征数据库中进行快速准确的区分信息进行匹配 3、多量性,就算只有单个物体,也能产生大量特征向量 4、高速性,能够快速的进行特征向量匹配 5、可扩展性,能够与其它形式的特征向量进行联合 二、SIF

gyp_666的博客 5109

OpenEarthMap 与 xBD 数据集合并

整合好的数据:链接: https://pan.baidu.com/s/1uJ_Zg6n-s3u1D49OW52D7Q?pwd=2vwx 提取码: 2vwx完整整合步骤与代码如下。

qq_60293814的博客 1593

七自由度机械臂逆运动学实战:从几何简化到KDL库高效求解

本文深入探讨了七自由度机械臂逆运动学求解的实战方法。针对冗余自由度带来的挑战,文章对比了两种核心方案:一是利用任务约束进行几何简化,快速求解特定任务;二是基于DH参数法配置KDL库,实现通用高效的数值迭代求解。文中结合宇树H1机器人实例,详细阐述了从模型解析、参数提取到代码实现与验证的全流程,并提供了几何法与KDL库的适用场景对比与避坑指南。

weixin_29044713的博客 635

特征点匹配——SIFT算法详解

之前在学习三维重建的过程中,了解过SIFT算法,现在老师要求详细的了解SIFT算法,看看能不能对它进行改进,于是又详细的看了一遍SIFT算法。记录一下 我把SIFT算法的流程分别写在了三个博客中,第一部分就是本文。 第二部分直通车:SIFT算法详解(2)特征点精确定位与特征点的方向计算 第三部分直通车:SIFT算法详解(3)特征点描述符生成一、SIFT算法综述SIFT(Scale Invar

lhanchao的博客 7万+

第二十七届华东杯数学建模A 题 跳台滑雪问题 完整思路模型及代码

考虑到滑行过程中的空气阻力和摩擦力对速度的影响,我们引入了不同姿态下运动员迎风面积和空气阻力系数的变化,利用牛顿第二定律建立加速度表达式,并通过数值模拟比较常见姿态下的终端速度。针对问题二,我们构建了二维空中飞行动力学模型,结合起跳速度、身体迎角、滑雪板倾角等因素,模拟运动员在空中飞行的轨迹与姿态变化,采用欧拉法对运动过程进行仿真,优化飞行路径和稳定性。仿真结果表明,运动员应在起跳后保持滑雪板与身体成“V”字形打开、重心略后倾的姿态,以增强升力、延长飞行距离并提高姿态得分。,并模拟出跳跃的轨迹和最终得分。

lichensun的博客 3209

sift算法matlab详解,sift算法原理详解及应用

描述一、Sift算法简介Sift算法是David Lowe于1999年提出的局部特征描述子,并于2004年进行了更深入的发展和完善。Sift特征匹配算法可以处理两幅图像之间发生平移、旋转、仿射变换情况下的匹配问题,具有很强的匹配能力。总体来说,Sift算子具有以下特性:(1)Sift特征是图像的局部特征,对平移、旋转、尺度缩放、亮度变化、遮挡和噪声等具有良好的不变性,对视觉变化、仿射变换也保持一定...

weixin_34805367的博客 3496

STM32L452与FPGA通信翻车?手把手教你关闭I2C时钟延展避坑(附OVR错误解决方案)

本文深入解析STM32L452与FPGA在I2C通信中因时钟延展功能导致的常见问题,提供关闭I2C时钟延展的详细配置方法(NOSTRETCH模式),并针对可能出现的OVR错误给出Combined模式解决方案。通过实战案例和波形分析,帮助工程师快速排查和解决嵌入式系统中的I2C兼容性问题。

e3f4g5的博客 214

osg点云加载与渲染

osg点云加载与渲染

cangqiongxiaoye的博客 821

SIFT算法之python实现

本文记录 数字图像与视频处理 课程的一次作业,欢迎一起交流学习。 0. 算法原理细节可参考: https://blog.youkuaiyun.com/abcjennifer/article/details/7639681 https://blog.youkuaiyun.com/zddblog/article/details/7521424?depth_1-utm_source=distribute.pc_relevan...

W Jin的博客 1万+

S7-1200 PLC PID功能 | 调节PID参数

S7-1200 PLC PID功能 | 调节PID参数

Robot_PLC_HMI_Automation 1万+

SIFT与SURF算法

SIFT与SURF算法 1. SIFT与SURF的特征 SIFT即尺度不变特征变换,是用于图像处理领域的一种描述。这种描述具有尺度不变性,可在图像中检测出关键点,是一种局部特征描述子。 Sift算法的优点是特征稳定,对旋转、尺度变换、亮度保持不变性,对视角变换、噪声也有一定程度的稳定性;缺点是实时性不高,并且对于边缘光滑目标的特征点提取能力较弱。 Surf(Speeded Up Robust Features)改进了特征的提取和描述方式,用一种更为高效的方式完成特征的提取和描述。 2. SIFT算法实现流程

weixin_46331334的博客 7646

海波龙(Hyperion,现属 Oracle)合并报表以 HFM(Hyperion Financial Management)为核心系统,方法论核心是以控制为基础确定合并范围,通过维度建模统一数据口径

摘要:海波龙合并报表系统(HFM)采用"规则驱动、维度建模"的方法论,通过四个核心环节实现自动化合并:确定合并范围、数据标准化、自动抵销调整及报表生成。系统支持多会计准则,以控制为基础划分合并方法(完全合并/权益法/成本法),通过维度建模统一数据口径,自动处理内部交易抵销、外币折算等复杂操作。业务操作流程涵盖数据采集、转换、抵销调整到报表生成全过程,关键控制点包括内部交易匹配、股权变动处理等。最终输出合规合并报表及完整审计线索,满足监管与管理需求。(150字)

金牌架构师 1302

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

上一篇: hog源码分析
下一篇: surf算法
淡淡的生活
博客等级 码龄16年 341粉丝 8原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值