matlab的内存问题

昨天晚上运行实验,早上过来,看到这样的错误

??? A read error occurred while reading from lab 3.  This is causing:
java.lang.ArrayIndexOutOfBoundsException: 0

查了一下,又是内存错误:

http://www.mathworks.com/matlabcentral/newsreader/view_thread/235387

http://www.mathworks.com/support/solutions/en/data/1-18I2C/index.html

可以通过设置Java虚拟机的heap size来解决。

不过不准备这么做了,因为这不是根本解决之道。

matlab很容易写出处理大批量数据的程序。也就容易搞出内存过载的问题。

准备回到以前的老路,把每个小块的结果单独save起来,起一个容易查询的文件名。这样也方便增量式的处理。

如果块不多的话,应该也还好。块太多会引起经常的读写,对硬盘不好。

convention

有很多的参数配置

每种配置都需要输出文件

程序需要根据配置来读入文件

也需要根据配置来构造变量名什么的

很多很多的批量处理

很多很多不同类型的处理结果

用matlab scripts

解决办法是各种各样的convention

比如实验结果输出的目录结构和文件名

比如数据结构的变量名

convention over configuration似乎是自然的选择

另外还有table driven

第一列是什么,第二列是什么,这些都是convention

开始是用变量来表达不同的域,但是那样重复代码太多

不如直接一个table

另外还有matlab scripts可以做运行单元,互相嵌套

根据convention,函数都不需要定义

这样会有一些陷阱,但是感觉也还好,调试也不难发现

matlab的eval语句也很强大,动态运行一个字符串的代码

 

pca

最近pca用的比较多,以前听说过,学过,就是没用过

现在用了一下,体会深了很多

算covariance matrix其实也相当于算pca

算基于cov倒数的距离相当于在pca变换后的对轴进行校正后的距离。

轴校正后点的分布成为一个圆

现在的问题是优化计算,每次有大量点和上次重复。只要加上新的点XX‘去除旧的点就可以。均值算是一个点。

//半夜没睡好,想这个问题去了。

OpenCV Image Data Access

被一个很奇怪的bug折腾了好久

用大部分数据都没问题

用某个数据有问题

加上一个开关没问题

加上另一个开关有时有问题,有时没有问题

用ctrl+F5运行有问题,用F5运行没有问题

今天终于让这个问题不断的重现,在debug模式下

在cvSaveImage的时候报错

检查Image也看不出啥毛病

后来一行一行的注释,再添加

终于找到问题所在,其实不是在cvSaveImage那个地方

而是另外一个给Image赋值的地方,wk~

又是指针问题

用了不恰当的index

感觉被这个问题咬了不止一次了

关于Opencv Image Data Access搜到两篇

http://opencv.willowgarage.com/wiki/faq

http://www.cs.iit.edu/~agam/cs512/lect-notes/opencv-intro/opencv-intro.html

general的方法是这样:

 

I(x,y)c ~ ((T*)(img->imageData + img->widthStep*y))[x*N + c]

N对应nChannels, c对应第几个channel,T对应数据类型

widthStep对应一行有多少个字节,这个数目并不等于image的宽度乘以数据长度乘以nChannels,opencv会根据需要补两个字节,这样让行长是4的倍数?

总之呢,这个数代表了一行用多少个字节来存,所以image->imageData + image->widthStep * y会移到下一行的开始

如果存储数据类型是32个bit,用float来表示,那么T就是float

用类型转换,然后后面的x*N+c就对应x列,channel c

比如

IplImage* im = cvCreateImage(cvSize(600, 800), IPL_DEPTH_32F, 3)

那么T = float, N = 3,

其实这么access非常容易出错

因为access一个x, y, c,还得考虑widthstep,考虑类型转换,理想的状况当然是I (x, y, c)

OpenCV有CvGet2D,但是效率很低

怎么整一个好的解决方案呢?其实大多数时候都是单个元素简单的操作,然后循环

以前写过一个Iterator,不过仅仅针对单个图像处理,也没考虑不同数据类型问题

也许应该写一个更灵活一些的Iterators


 

robot

PhD的题目是从robot开始的

论文最终以robot结束

但是几年下来,其实花的时间并不多

尽管这是最感兴趣的方向

不知道以后工作了还会不会有时间继续下去

希望还会有机会吧

今天又想了想这方面的东西

还是视觉方面

其实应该综合多种特征

lines, colors, motion, 

应该都考虑

还有prior knowledge

一幅图像的骨架可以由lines, vanishing points, ground plane大致来定义

然后texture, colors可以用来做细节的分类,建模

之前做的东西都比较零散

一直想着结合起来

但是也没时间做

也许在sfm的基础之上,再做结构化的建模

比如lines,planes等等

任何一个空间都会有主要的几个planes

每个图像可以分解成很多的小的块

根据motion和对应,可以把这些小的块对应到不同的平面上去

对于远方的结构,可以根据分类来确定对应的面

如何确定planes呢?

可以根据线,piror knowledge

 

 

 

scattered data approximation

From <<scattered data approximation>>

In practical applications over a wide field of study one often faces the problem of reconstructing an unknown function f from a finite set of discrete data. These data consist of data sites X = {x_1, …, x_N) and data values f_j = f(x_j), 1<=j<=N, and the reconstruction has to approximate the data values at the data sites. In other words, a function s is sought that either interpolates the data, i.e., that satisfies s(x_j) = f_j, 1<=j <= N, or at least approximates the data, s(x_j) ~= f_j. That latter is in particular important if the data contain noise.

Explicit surfaces play an important role in terrain modeling, for example. They can be represented as the graph of a function f:O->R defined on some region O <( Rd, where d is in general given by d = 2. Staying with the terminology of terrain modeling, the data sites X <( O depict certain points on a map, while a data value f_j = f(x_j) describes the height at the point x_j. The data sites might form a regular grid, they might be situated on isolines (as in Figure 1.1), or they might have no structure at all.

The reconstruction of an implicit surface, or more precisely of a compact, orientable manifold, is even more demanding. Such surfaces appear for example as sculptures, machine parts, and archaeological artifacts. They are often digitized using laser scanners, which easily produce hugh point clouds X = {x_1, …, x_N} <( S consisting of several million points in R3. In this situation, the surface S can no longer be represented as a graph of a single function f. There are in the main two different approaches to building accurate models for implicit surfaces. In the first approach, one tries to find local parameterizations of the object that allow an efficient rendering. However, for complicated models this approach is limited. In the second approach, one tries to describe S as the zero-level set of a function F, i.e. S = { x<( O : F(x) = 0}. Such an implicit representation easily delivers function-based operations, for example shape blending or deformation or any other constructive solid geometry (CSG) operation such as the union, difference, or intersection of two or more objects.