opencv-Opencv SURF out of memory

问题描述

Opencv SURF out of memory

采用Opencv源码中sample/c中的findobj.cpp的compareSURFDescriptors()、naiveNearestNeighbor()、
findPairs()
static double compareSURFDescriptors( const float* d1, const float* d2, double best, int length )
{
double total_cost = 0;
assert( length % 4 == 0 );
for( int i = 0; i < length; i += 4 )
{
double t0 = d1[i ] - d2[i ];
double t1 = d1[i+1] - d2[i+1];
double t2 = d1[i+2] - d2[i+2];
double t3 = d1[i+3] - d2[i+3];
total_cost += t0*t0 + t1*t1 + t2*t2 + t3*t3;
if( total_cost > best )
break;
}
return total_cost;
}

static int naiveNearestNeighbor( const float* vec, int laplacian,
const CvSeq* model_keypoints,
const CvSeq* model_descriptors )
{
int length = (int)(model_descriptors->elem_size/sizeof(float));
int i, neighbor = -1;
double d, dist1 = 1e6, dist2 = 1e6;
CvSeqReader reader, kreader;
cvStartReadSeq( model_keypoints, &kreader, 0 );
cvStartReadSeq( model_descriptors, &reader, 0 );

for( i = 0; i < model_descriptors->total; i++ )
{
    const CvSURFPoint* kp = (const CvSURFPoint*)kreader.ptr;
    const float* mvec = (const float*)reader.ptr;
    CV_NEXT_SEQ_ELEM( kreader.seq->elem_size, kreader );
    CV_NEXT_SEQ_ELEM( reader.seq->elem_size, reader );
    if( laplacian != kp->laplacian )
        continue;
    d = compareSURFDescriptors( vec, mvec, dist2, length );
    if( d < dist1 )
    {
        dist2 = dist1;
        dist1 = d;
        neighbor = i;
    }
    else if ( d < dist2 )
        dist2 = d;
}
if ( dist1 < 0.6*dist2 )
    return neighbor;
return -1;

}

static void findPairs( const CvSeq* objectKeypoints, const CvSeq* objectDescriptors,
const CvSeq* imageKeypoints, const CvSeq* imageDescriptors, vector& ptpairs )
{
int i;
CvSeqReader reader, kreader;
cvStartReadSeq( objectKeypoints, &kreader );
cvStartReadSeq( objectDescriptors, &reader );
ptpairs.clear();

for( i = 0; i < objectDescriptors->total; i++ )
{
    const CvSURFPoint* kp = (const CvSURFPoint*)kreader.ptr;
    const float* descriptor = (const float*)reader.ptr;
    CV_NEXT_SEQ_ELEM( kreader.seq->elem_size, kreader );
    CV_NEXT_SEQ_ELEM( reader.seq->elem_size, reader );
    int nearest_neighbor = naiveNearestNeighbor( descriptor, kp->laplacian, imageKeypoints, imageDescriptors );
    if( nearest_neighbor >= 0 )
    {
        ptpairs.push_back(i);
        ptpairs.push_back(nearest_neighbor);
    }
}

}

int SurfMatch(IplImage* image1, IplImage* image2) {

initModule_nonfree();

CvMemStorage* storage = cvCreateMemStorage(0);

CvSeq* objectKeypoints = 0, *objectDescriptors = 0;
CvSeq* imageKeypoints = 0, *imageDescriptors = 0;
CvSURFParams params = cvSURFParams(500, 1);

cvExtractSURF(image1, 0, &objectKeypoints, &objectDescriptors, storage,
        params);

cvExtractSURF(image2, 0, &imageKeypoints, &imageDescriptors, storage,
        params);

vector<int> ptpairs;
findPairs(objectKeypoints, objectDescriptors, imageKeypoints,
        imageDescriptors, ptpairs);
cvReleaseMemStorage(&storage);
return ptpairs.size();

}

当匹配的图像对超过10对左右的时候,就out of memory了~想问一下~我在最后释放过了storage,为什么还是要爆呀~
谢谢!

解决方案

最简单的方法,用一些内存泄露的检测库来检测下看看哪儿有内存泄露,比如VLD类库

时间: 2025-01-20 12:58:21

opencv-Opencv SURF out of memory的相关文章

opencv下surf代码出错显示未经处理的异常: 0xC0000005

问题描述 opencv下surf代码出错显示未经处理的异常: 0xC0000005 #include "opencv2/core/core.hpp" #include "opencv2/features2d/features2d.hpp" #include "opencv2/highgui/highgui.hpp" #include "opencv2/nonfree/nonfree.hpp" #include using na

OpenCV特征点检测------Surf(特征点篇)

Surf(Speed Up Robust Feature) Surf算法的原理                                                                           1.构建Hessian矩阵构造高斯金字塔尺度空间 其实surf构造的金字塔图像与sift有很大不同,就是因为这些不同才加快了其检测的速度.Sift采用的是DOG图像,而surf采用的是Hessian矩阵行列式近似值图像.Hessian矩阵是Surf算法的核心,为了方便运算

OpenCV特征点检测算法对比

识别算法概述: SIFT/SURF基于灰度图, 一.首先建立图像金字塔,形成三维的图像空间,通过Hessian矩阵获取每一层的局部极大值,然后进行在极值点周围26个点进行NMS,从而得到粗略的特征点,再使用二次插值法得到精确特征点所在的层(尺度),即完成了尺度不变.   二.在特征点选取一个与尺度相应的邻域,求出主方向,其中SIFT采用在一个正方形邻域内统计所有点的梯度方向,找到占80%以上的方向作为主方向:而SURF则选择圆形邻域,并且使用活动扇形的方法求出特征点主方向,以主方向对齐即完成旋转

25 行 Python 代码实现人脸检测——OpenCV 技术教程

OpenCV OpenCV 是最流行的计算机视觉库,原本用 C 和 C++ 开发,现在也支持 Python. 它使用机器学习算法在图像中搜索人的面部.对于人脸这么复杂的东西,并没有一个简单的检测能对是否存在人脸下结论,而需要成千上万的特征匹配.算法把人脸识别任务分解成数千个小任务,每个都不难处理.这些任务也被称为分类器. 对于类似于人脸的对象,你或许需要不少于 6000 个分类器,每一个都需要成功匹配(当然,有容错率),才能检测出人脸.但这有一个问题:对于人脸识别,算法从左上角开始计算一个个数据

手把手教你如何用 OpenCV + Python 实现人脸识别

下午的时候,配好了OpenCV的Python环境,OpenCV的Python环境搭建.于是迫不及待的想体验一下opencv的人脸识别,如下文.   必备知识 Haar-like Haar-like百科释义.通俗的来讲,就是作为人脸特征即可. Haar特征值反映了图像的灰度变化情况.例如:脸部的一些特征能由矩形特征简单的描述,如:眼睛要比脸颊颜色要深,鼻梁两侧比鼻梁颜色要深,嘴巴比周围颜色要深等. opencv api 要想使用opencv,就必须先知道其能干什么,怎么做.于是API的重要性便体现

ROS(8):Lubuntu下openCV 开发

本文的原文连接是: http://blog.csdn.net/freewebsys/article/details/48379799 未经博主允许不得转载. 博主地址是:http://blog.csdn.net/freewebsys 1,关于openCV OpenCV于1999年由Intel建立,如今由Willow Garage提供支持.OpenCV是一个基于(开源)发行的跨平台计算机视觉库,可以运行在Linux.Windows和Mac OS操作系统上.它轻量级而且高效--由一系列C函数和少量C

基于OpenCV的PHP图像人脸识别技术_php技巧

openCV是一个开源的用C/C++开发的计算机图形图像库,非常强大,研究资料很齐全.本文重点是介绍如何使用php来调用其中的局部的功能.人脸侦查技术只是openCV一个应用分支. 1.安装 从源代码编译成一个动态的so文件. 1.1.安装 OpenCV (OpenCV 1.0.0) 下载地址:http://sourceforge.net/project/showfiles.php?group_id=22870&package_id=16948 #tar xvzf OpenCV-1.0.0.ta

win7+Qt+OpenCV安装攻略

为了让桌面背景炫一点,灵活一点,升级了home basic版到ultimate版,有几个发现 1.gnome在win7下也有主题可以用,但是很难看,和fedora18下的gnome完全不是一个味道 2.升级之后系统path中的内容被清除,直接导致一些程序无法运行: 1)cmd下的ping和ipconfig命令失效,PATH中加入;%SystemRoot%\system32修复 2)我的Qt与OpenCV失效,Qt导入图片的基本操作都not work了! 为了用Qt+OpenCV所以重装了Qt,C

opencv安装指南

opencv安装指南 用包管理器安装 比如ubuntu下是apt-get,mac下是brew.(windows下或许用nuget?)以ubuntu下为例. 查看opencv相关的包 aptitude search opencv 执行安装 发现有很多包.不妨安装绝大多数: sudo apt-get install libopencv-* sudo apt-get install opencv-data python-opencv 编译安装 为什么编译安装 opencv有些功能放在opencv_co