调用opencv的grabcut函数后,采用valgrind进行检测时,会提示存在疑似内存泄漏的问题。我想大家都遇到了 。
首先,这是一种正常情况,不会真的出现内存泄漏问题。发现这个问题的同学无需顾虑。
下面简单分析该问题和出现该问题的原因:
问题描绘:
valgrind显示检测结果:
16 bytes in 2 blocks are still reachable in loss record 1 of 2
at 0x4A06019: operator new(unsigned long) (vg_replace_malloc.c:167)
by 0x54E83CC: cv::theRNG() (in /home/yongpan/.bm_plat/lib/libcxcore.so.2.1)
阅读更多…
使用opencv读取过大bmp图像文件会出现core down,这个问题已经有一些同学做了解释。可参见http://blog.csdn.net/lcy9819/article/details/5916907,该文章分析了读取失败的原因和修改opencv源代码进更正的方法。
我也遇到这个问题,但是偷懒不想修改opencv的源代码,从新布置服务器。于是采用了一个折中的方法。
阅读更多…
在介绍如何解析gif图像文件之前,首先简单介绍一下gif图像文件。
GIF: 任何商业目的运用都需要CompuServe公司授权
- 特点:
- GIF只支持256色以内的图像。
- GIF采用无损压缩存储,在不影响图像质量的情况下,可以生成很小的文件。(而且,编码解码速度都高于jpeg图像文件)
- GIF支持透明色,可以让图像浮现在背景上。
- GIF可以制作成动画,只是它最突出的特点
- 文件主要包含的内容:
- 文件头:用于标识版本号等
- GIF数据流:包含颜色列表和图像数据等
- 文件终结器:用于标示文件的终结
- 注: 图像数据包含LZW编码长度和数据块,数据块的第一个字节标示数据块的大小(数据块大小不一[0, 255])
使用opencv进行解码的同学会发现,由于版权等原因,opencv没有提供解码gif文件的代码。
阅读更多…
image watermarking based on invariant regions of scale-space representation
2006年 韩国
一、实现算法:
水印添加算法:
1、 通过harris算法得到图像特征点
2、 通过特征点选择合适的水印添加区域,选择方法:由三个特征点或者四个特征点构成一个封闭的三角区域或者四角区域。一幅图像可以构成多个如此的区域。
3、 通过添加水印的区域的像素强度创建HVS矩阵
4、 创建初始的随机水印矩形矩阵
5、 计算水印区域与水印的几何关系矩阵
6、 在设定的区域添加水印
水印识别算法:
阅读更多…
Projective-invariant digital image watermarking technique using four co-planar feature points
2005年 泰国
一、实现算法:
水印添加算法:
1. 通过角点算法,确定共面的切三点不共线四个比较稳定的角点
2. 设置多对
,得到多个和之前的四个点共面但是三点不共线的第五点。确定原理为,三点不共线的五点共面区域的三角区域率具有投影不变性,参考“Geometric Invariance in Computer Vision, MIT press, 1992”。
3. 将水印添加到这些选取的第五点上
水印识别算法:
阅读更多…
Robust Image watermarking using local invariant features
2006年 韩国
一、实现步骤:
水印添加算法:
1. 使用sift算法提取图像特征点。
2. 通过特征点信息确定水印添加的区域,圆心为特征点位置,半径为特征尺度。(不合适的尺度已经被剃掉)
3. 产生一个服从高斯分布的随机矩阵。
4. 将产生的随机矩阵极坐标化。
5. 将得到的极坐标化的随机矩阵加性的添加到水印区域。
水印识别算法:
阅读更多…
K-means是最简单常用的聚类。但是比较有趣的是,K-means实际上是一个简单的EM(Expectation-Maximization)的实现。
提纲如下:
K-means是一个迭代求解的过程。
有两个变量需要通过迭代求解,一个是每个feature的类别,一个是每个cluster的中心。
优化函数是所有feature到其类中心的距离和(暂时假定为欧式距离)。
一般做法是
step1:先随机给定一组cluster中心,然后求取每个feature的类别;
step2: 根据feature的类别,更新cluster中心;
step1就是E步骤,step2就是M步骤。
阅读更多…
问题
—-
PCA是一种常见的降维工具,由于我们常常需要在高维空间中处理问题,所以PCA的应用相当广泛。首先用一个小例子说明,PCA的目的和作用。
假设我们需要观测弹簧的运动轨迹,并发现其中的规律。
如果我们足够聪明的话,我们会知道,只需要安排一个观测器观察弹簧在x轴上的运动就行了。但是在绝大多数问题中,我们并不是这么聪明,我 们常常只能通过设置大量的观测器去揣测一个事情的规律。
在这个问题中,假设我们在弹簧周围设定了3个观测器,camera A, camera B, camera C。
这三个观测器互相之间也并不正交(在高维空间中,我们很难确定两个被观测量是否正交)。
PCA会帮助我们从一大堆杂乱的测量数据中发现,最有意义的测量坐标,以及用这个坐标,去重新表达这些数据。在这个有关弹簧的例子中,PCA就是帮我们发现,有意义的变量仅仅是x轴变量而已。
常见语言都有简单的图像处理库,我知道java、python等都有。这些库一般比较简单,方便在对应的语言下进行简单的图像处理。另外,一些需要图像处理的芯片也会实现自己独立的图像处理库。
在学习工作过程中,我一般使用matlab、magick、opencv进行图像处理(opengl一般进行图形处理)。
matlab是一个非常强大的软件,包含很多数学处理基础,图像处理,模式识别,信号处理等,和数学沾边的方方面面几乎在matlab中都有比较完美的实现。堪称数学界的神曲。但是它不太合适用于工程应用,着重于过程实现。它函数使用非常简单,如果有想法可以先在matlab下试试。
magick和opencv是在实际项目中比较常用的两个图像处理软件,在实际的应用中,他们各有优缺点。下面介绍一下这两个图像处理库。
magick的官方网站:http://www.imagemagick.org/script/index.php(imagemagick)
http://www.graphicsmagick.org/(graphicmagick)
opencv的官方网站:http://opencv.willowgarage.com/wiki/
阅读更多…