|
|
August 26
OpenCV 编程入门
OpenCV 编程入门
美国伊力诺理工学院计算机科学系Gady Adam
翻译:Mensch
GUI 命令
OpenCV 基础数据结构
图像处理
矩阵操作
视频序列处理
- 什么是OpenCV
- 开源C/C++计算机视觉库.
- 面向实时应用进行优化.
- 跨操作系统/硬件/窗口管理器.
- 通用图像/视频载入、存储和获取.
- 由中、高层API构成.
- 为Intel®公司的 Integrated Performance Primitives (IPP) 提供了透明接口.
特性:
- 图像数据操作 (分配,释放, 复制, 设定, 转换).
- 图像与视频 I/O (基于文件/摄像头输入, 图像/视频文件输出).
- 矩阵与向量操作与线性代数计算(相乘, 求解, 特征值, 奇异值分解SVD).
- 各种动态数据结构(列表, 队列, 集, 树, 图).
- 基本图像处理(滤波, 边缘检测, 角点检测, 采样与插值, 色彩转换, 形态操作, 直方图, 图像金字塔).
- 结构分析(连接成分, 轮廓处理, 距离转换, 模板匹配, Hough转换, 多边形近似, 线性拟合, 椭圆拟合, Delaunay三角化).
- 摄像头标定 (寻找并跟踪标定模板, 标定, 基础矩阵估计, homography估计, 立体匹配).
- 动作分析(光流, 动作分割, 跟踪).
- 对象辨识 (特征方法, 隐马可夫链模型HMM).
- 基本GUI(显示图像/视频, 键盘鼠标操作, 滚动条).
- 图像标识 (直线, 圆锥, 多边形, 文本绘图)
OpenCV 模块:
- cv - OpenCV 主要函数.
- cvaux - 辅助 (实验性) OpenCV 函数.
- cxcore - 数据结构与线性代数算法.
- highgui - GUI函数.
- 参考手册:
- <opencv-root>/docs/index.htm
- 网络资源:
- 官方网页: http://www.intel.com/technology/computing/opencv/
- 软件下载: http://sourceforge.net/projects/opencvlibrary/
- 书籍:
- Open Source Computer Vision Library by Gary R. Bradski, Vadim Pisarevsky, and Jean-Yves Bouguet, Springer, 1st ed. (June, 2006).
- 视频处理例程 (位于 <opencv-root>/samples/c/目录中):
- 色彩跟踪: camshiftdemo
- 点跟踪: lkdemo
- 动作分割: motempl
- 边缘检测: laplace
- 图像处理例程(位于<opencv-root>/samples/c/目录中):
- 边缘检测: edge
- 分割: pyramid_segmentation
- 形态: morphology
- 直方图: demhist
- 距离转换: distrans
- 椭圆拟合 fitellipse
- 函数命名:
cvActionTarget[Mod](...)
Action = 核心功能(例如 设定set, 创建create) Target = 操作目标 (例如 轮廓contour, 多边形polygon) [Mod] = 可选修饰词 (例如说明参数类型)
- 矩阵数据类型:
CV_<bit_depth>(S|U|F)C<number_of_channels>
S = 带符号整数 U = 无符号整数 F = 浮点数
例: CV_8UC1 表示一个8位无符号单通道矩阵, CV_32FC2 表示一个32位浮点双通道矩阵.
- 图像数据类型:
IPL_DEPTH_<bit_depth>(S|U|F)
例: IPL_DEPTH_8U 表示一个8位无符号图像. IPL_DEPTH_32F 表示一个32位浮点数图像.
- 头文件:
#include <cv.h> #include <cvaux.h> #include <highgui.h> #include <cxcore.h> // 不必要 - 该头文件已在 cv.h 文件中包含
//////////////////////////////////////////////////////////////////////// // // hello-world.cpp // // 一个简单的OpenCV程序 // 它从一个文件中读取图像,将色彩值颠倒,并显示结果. // //////////////////////////////////////////////////////////////////////// #include <stdlib.h> #include <stdio.h> #include <math.h> #include <cv.h> #include <highgui.h>
int main(int argc, char *argv[]) { IplImage* img = 0; int height,width,step,channels; uchar *data; int i,j,k;
if(argc<2){ printf("Usage: main <image-file-name>\n\7"); exit(0); }
// 载入图像 img=cvLoadImage(argv[1]); if(!img){ printf("Could not load image file: %s\n",argv[1]); exit(0); }
// 获取图像数据 height = img->height; width = img->width; step = img->widthStep; channels = img->nChannels; data = (uchar *)img->imageData; printf("Processing a %dx%d image with %d channels\n",height,width,channels);
// 创建窗口 cvNamedWindow("mainWin", CV_WINDOW_AUTOSIZE); cvMoveWindow("mainWin", 100, 100);
// 反色图像 for(i=0;i<height;i++) for(j=0;j<width;j++) for(k=0;k<channels;k++) data[i*step+j*channels+k]=255-data[i*step+j*channels+k];
// 显示图像 cvShowImage("mainWin", img );
// wait for a key cvWaitKey(0);
// release the image cvReleaseImage(&img ); return 0; }
- 创建并放置一个窗口:
cvNamedWindow("win1", CV_WINDOW_AUTOSIZE); cvMoveWindow("win1", 100, 100); // 以屏幕左上角为起点的偏移量
- 读入图像:
IplImage* img=0; img=cvLoadImage(fileName); if(!img) printf("Could not load image file: %s\n",fileName);
- 显示图像:
cvShowImage("win1",img);
可显示彩色或灰度的字节/浮点图像。 彩色图像数据认定为BGR顺序.
- 关闭窗口:
cvDestroyWindow("win1");
- 改变窗口尺寸:
cvResizeWindow("win1",100,100); // 新的宽/高值(象素点)
- 响应鼠标事件:
- 定义鼠标handler:
void mouseHandler(int event, int x, int y, int flags, void* param) { switch(event){ case CV_EVENT_LBUTTONDOWN: if(flags & CV_EVENT_FLAG_CTRLKEY) printf("Left button down with CTRL pressed\n"); break;
case CV_EVENT_LBUTTONUP: printf("Left button up\n"); break; } }
// x,y: 针对左上角的像点坐标
// event: CV_EVENT_LBUTTONDOWN, CV_EVENT_RBUTTONDOWN, CV_EVENT_MBUTTONDOWN, // CV_EVENT_LBUTTONUP, CV_EVENT_RBUTTONUP, CV_EVENT_MBUTTONUP, // CV_EVENT_LBUTTONDBLCLK, CV_EVENT_RBUTTONDBLCLK, CV_EVENT_MBUTTONDBLCLK, // CV_EVENT_MOUSEMOVE:
// flags: CV_EVENT_FLAG_CTRLKEY, CV_EVENT_FLAG_SHIFTKEY, CV_EVENT_FLAG_ALTKEY, // CV_EVENT_FLAG_LBUTTON, CV_EVENT_FLAG_RBUTTON, CV_EVENT_FLAG_MBUTTON
- 注册handler:
mouseParam=5; cvSetMouseCallback("win1",mouseHandler,&mouseParam);
- 响应键盘事件:
- 键盘没有事件handler.
- 直接获取键盘操作:
int key; key=cvWaitKey(10); // 输入等待10ms
- 等待按键并获取键盘操作:
int key; key=cvWaitKey(0); // 无限等待键盘输入
- 键盘输入循环:
while(1){ key=cvWaitKey(10); if(key==27) break;
switch(key){ case 'h': ... break; case 'i': ... break; } }
处理滚动条事件:
- 定义滚动条handler:
void trackbarHandler(int pos) { printf("Trackbar position: %d\n",pos); }
- 注册handler:
int trackbarVal=25; int maxVal=100; cvCreateTrackbar("bar1", "win1", &trackbarVal ,maxVal , trackbarHandler);
- 获取滚动条当前位置:
int pos = cvGetTrackbarPos("bar1","win1");
- 设定滚动条位置:
cvSetTrackbarPos("bar1", "win1", 25);
- IPL 图像:
IplImage |-- int nChannels; // 色彩通道数(1,2,3,4) |-- int depth; // 象素色深: | // IPL_DEPTH_8U, IPL_DEPTH_8S, | // IPL_DEPTH_16U,IPL_DEPTH_16S, | // IPL_DEPTH_32S,IPL_DEPTH_32F, | // IPL_DEPTH_64F |-- int width; // 图像宽度(象素点数) |-- int height; // 图像高度(象素点数)
|-- char* imageData; // 指针指向成一列排列的图像数据 | // 注意色彩顺序为BGR |-- int dataOrder; // 0 - 彩色通道交叉存取 BGRBGRBGR, | // 1 - 彩色通道分隔存取 BBBGGGRRR | // 函数cvCreateImage只能创建交叉存取的图像 |-- int origin; // 0 - 起点为左上角, | // 1 - 起点为右下角(Windows位图bitmap格式) |-- int widthStep; // 每行图像数据所占字节大小 |-- int imageSize; // 图像数据所占字节大小 = 高度*每行图像数据字节大小 |-- struct _IplROI *roi;// 图像ROI. 若不为NULL则表示需要处理的图像 | // 区域. |-- char *imageDataOrigin; // 指针指向图像数据原点 | // (用来校准图像存储单元的重新分配) | |-- int align; // 图像行校准: 4或8字节校准 | // OpenCV不采用它而使用widthStep |-- char colorModel[4]; // 图像色彩模型 - 被OpenCV忽略
- 矩阵:
CvMat // 2维数组 |-- int type; // 元素类型(uchar,short,int,float,double) |-- int step; // 一行所占字节长度 |-- int rows, cols; // 尺寸大小 |-- int height, width; // 备用尺寸参照 |-- union data; |-- uchar* ptr; // 针对unsigned char矩阵的数据指针 |-- short* s; // 针对short矩阵的数据指针 |-- int* i; // 针对integer矩阵的数据指针 |-- float* fl; // 针对float矩阵的数据指针 |-- double* db; // 针对double矩阵的数据指针
CvMatND // N-维数组 |-- int type; // 元素类型(uchar,short,int,float,double) |-- int dims; // 数组维数 |-- union data; | |-- uchar* ptr; // 针对unsigned char矩阵的数据指针 | |-- short* s; // 针对short矩阵的数据指针 | |-- int* i; // 针对integer矩阵的数据指针 | |-- float* fl; // 针对float矩阵的数据指针 | |-- double* db; // 针对double矩阵的数据指针 | |-- struct dim[]; // 每个维的信息 |-- size; // 该维内元素个数 |-- step; // 该维内元素之间偏移量
CvSparseMat // 稀疏N维数组
- 通用数组:
CvArr* // 仅作为函数参数,说明函数接受多种类型的数组,例如: // IplImage*, CvMat* 或者 CvSeq*. // 只需通过分析数组头部的前4字节便可确定数组类型
- 标量:
CvScalar |-- double val[4]; //4D向量
初始化函数: CvScalar s = cvScalar(double val0, double val1=0, double val2=0, double val3=0);
举例: CvScalar s = cvScalar(20.0); s.val[0]=10.0;
注意:初始化函数与数据结构同名,只是首字母小写. 它不是C++的构造函数.
- 点:
CvPoint p = cvPoint(int x, int y); CvPoint2D32f p = cvPoint2D32f(float x, float y); CvPoint3D32f p = cvPoint3D32f(float x, float y, float z); 例如: p.x=5.0; p.y=5.0;
- 长方形尺寸:
CvSize r = cvSize(int width, int height); CvSize2D32f r = cvSize2D32f(float width, float height);
- 带偏移量的长方形尺寸:
CvRect r = cvRect(int x, int y, int width, int height);
- 分配图像空间:
IplImage* cvCreateImage(CvSize size, int depth, int channels);
size: cvSize(width,height);
depth: IPL_DEPTH_8U, IPL_DEPTH_8S, IPL_DEPTH_16U, IPL_DEPTH_16S, IPL_DEPTH_32S, IPL_DEPTH_32F, IPL_DEPTH_64F
channels: 1, 2, 3 or 4. 注意数据为交叉存取.彩色图像的数据编排为b0 g0 r0 b1 g1 r1 ...
举例: // 分配一个单通道字节图像 IplImage* img1=cvCreateImage(cvSize(640,480),IPL_DEPTH_8U,1);
// 分配一个三通道浮点图像 IplImage* img2=cvCreateImage(cvSize(640,480),IPL_DEPTH_32F,3);
- 释放图像空间:
IplImage* img=cvCreateImage(cvSize(640,480),IPL_DEPTH_8U,1); cvReleaseImage(&img);
- 复制图像:
IplImage* img1=cvCreateImage(cvSize(640,480),IPL_DEPTH_8U,1); IplImage* img2; img2=cvCloneImage(img1);
- 设定/获取兴趣区域:
void cvSetImageROI(IplImage* image, CvRect rect); void cvResetImageROI(IplImage* image); vRect cvGetImageROI(const IplImage* image);
大部分OpenCV函数都支持ROI.
- 设定/获取兴趣通道:
void cvSetImageCOI(IplImage* image, int coi); // 0=all int cvGetImageCOI(const IplImage* image);
大部分OpenCV函数暂不支持COI.
- 从文件中载入图像:
IplImage* img=0; img=cvLoadImage(fileName); if(!img) printf("Could not load image file: %s\n",fileName);
Supported image formats: BMP, DIB, JPEG, JPG, JPE, PNG, PBM, PGM, PPM, SR, RAS, TIFF, TIF
载入图像默认转为3通道彩色图像. 如果不是,则需加flag: img=cvLoadImage(fileName,flag);
flag: >0 载入图像转为三通道彩色图像 =0 载入图像转为单通道灰度图像 <0 不转换载入图像(通道数与图像文件相同).
- 图像存储为图像文件:
if(!cvSaveImage(outFileName,img)) printf("Could not save: %s\n",outFileName);
输入文件格式由文件扩展名决定.
- 假设需要读取在i行j列像点的第k通道. 其中, 行数i的范围为[0, height-1], 列数j的范围为[0, width-1], 通道k的范围为[0, nchannels-1].
- 间接存取: (比较通用, 但效率低, 可读取任一类型图像数据)
- 对单通道字节图像:
IplImage* img=cvCreateImage(cvSize(640,480),IPL_DEPTH_8U,1); CvScalar s; s=cvGet2D(img,i,j); // get the (i,j) pixel value printf("intensity=%f\n",s.val[0]); s.val[0]=111; cvSet2D(img,i,j,s); // set the (i,j) pixel value
- 对多通道浮点或字节图像:
IplImage* img=cvCreateImage(cvSize(640,480),IPL_DEPTH_32F,3); CvScalar s; s=cvGet2D(img,i,j); // get the (i,j) pixel value printf("B=%f, G=%f, R=%f\n",s.val[0],s.val[1],s.val[2]); s.val[0]=111; s.val[1]=111; s.val[2]=111; cvSet2D(img,i,j,s); // set the (i,j) pixel value
- 直接存取: (效率高, 但容易出错)
- 对单通道字节图像:
IplImage* img=cvCreateImage(cvSize(640,480),IPL_DEPTH_8U,1); ((uchar *)(img->imageData + i*img->widthStep))[j]=111;
- 对多通道字节图像:
IplImage* img=cvCreateImage(cvSize(640,480),IPL_DEPTH_8U,3); ((uchar *)(img->imageData + i*img->widthStep))[j*img->nChannels + 0]=111; // B ((uchar *)(img->imageData + i*img->widthStep))[j*img->nChannels + 1]=112; // G ((uchar *)(img->imageData + i*img->widthStep))[j*img->nChannels + 2]=113; // R
- 对多通道浮点图像:
IplImage* img=cvCreateImage(cvSize(640,480),IPL_DEPTH_32F,3); ((float *)(img->imageData + i*img->widthStep))[j*img->nChannels + 0]=111; // B ((float *)(img->imageData + i*img->widthStep))[j*img->nChannels + 1]=112; // G ((float *)(img->imageData + i*img->widthStep))[j*img->nChannels + 2]=113; // R
用指针直接存取 : (在某些情况下简单高效)
- 对单通道字节图像:
IplImage* img = cvCreateImage(cvSize(640,480),IPL_DEPTH_8U,1); int height = img->height; int width = img->width; int step = img->widthStep/sizeof(uchar); uchar* data = (uchar *)img->imageData; data[i*step+j] = 111;
- 对多通道字节图像:
IplImage* img = cvCreateImage(cvSize(640,480),IPL_DEPTH_8U,3); int height = img->height; int width = img->width; int step = img->widthStep/sizeof(uchar); int channels = img->nChannels; uchar* data = (uchar *)img->imageData; data[i*step+j*channels+k] = 111;
- 对单通道浮点图像(假设用4字节调整):
IplImage* img = cvCreateImage(cvSize(640,480),IPL_DEPTH_32F,3); int height = img->height; int width = img->width; int step = img->widthStep/sizeof(float); int channels = img->nChannels; float * data = (float *)img->imageData; data[i*step+j*channels+k] = 111;
使用 c++ wrapper 进行直接存取: (简单高效)
- 对单/多通道字节图像,多通道浮点图像定义一个 c++ wrapper:
template<class T> class Image { private: IplImage* imgp; public: Image(IplImage* img=0) {imgp=img;} ~Image(){imgp=0;} void operator=(IplImage* img) {imgp=img;} inline T* operator[](const int rowIndx) { return ((T *)(imgp->imageData + rowIndx*imgp->widthStep));} };
typedef struct{ unsigned char b,g,r; } RgbPixel;
typedef struct{ float b,g,r; } RgbPixelFloat;
typedef Image<RgbPixel> RgbImage; typedef Image<RgbPixelFloat> RgbImageFloat; typedef Image<unsigned char> BwImage; typedef Image<float> BwImageFloat;
- 单通道字节图像:
IplImage* img=cvCreateImage(cvSize(640,480),IPL_DEPTH_8U,1); BwImage imgA(img); imgA[i][j] = 111;
- 多通道字节图像:
IplImage* img=cvCreateImage(cvSize(640,480),IPL_DEPTH_8U,3); RgbImage imgA(img); imgA[i][j].b = 111; imgA[i][j].g = 111; imgA[i][j].r = 111;
- 多通道浮点图像:
IplImage* img=cvCreateImage(cvSize(640,480),IPL_DEPTH_32F,3); RgbImageFloat imgA(img); imgA[i][j].b = 111; imgA[i][j].g = 111; imgA[i][j].r = 111;
- 转为灰度或彩色字节图像:
cvConvertImage(src, dst, flags=0);
src = float/byte grayscale/color image dst = byte grayscale/color image flags = CV_CVTIMG_FLIP (flip vertically) CV_CVTIMG_SWAP_RB (swap the R and B channels)
- 转换彩色图像为灰度图像:
使用OpenCV转换函数:
cvCvtColor(cimg,gimg,CV_BGR2GRAY); // cimg -> gimg
直接转换:
for(i=0;i<cimg->height;i++) for(j=0;j<cimg->width;j++) gimgA[i][j]= (uchar)(cimgA[i][j].b*0.114 + cimgA[i][j].g*0.587 + cimgA[i][j].r*0.299);
- 颜色空间转换:
cvCvtColor(src,dst,code); // src -> dst
code = CV_<X>2<Y> <X>/<Y> = RGB, BGR, GRAY, HSV, YCrCb, XYZ, Lab, Luv, HLS
e.g.: CV_BGR2GRAY, CV_BGR2HSV, CV_BGR2Lab
- 画长方体:
// 用宽度为1的红线在(100,100)与(200,200)之间画一长方体 cvRectangle(img, cvPoint(100,100), cvPoint(200,200), cvScalar(255,0,0), 1);
- 画圆:
// 在(100,100)处画一半径为20的圆,使用宽度为1的绿线 cvCircle(img, cvPoint(100,100), 20, cvScalar(0,255,0), 1);
- 画线段:
// 在(100,100)与(200,200)之间画绿色线段,宽度为1 cvLine(img, cvPoint(100,100), cvPoint(200,200), cvScalar(0,255,0), 1);
- 画一组线段:
CvPoint curve1[]={10,10, 10,100, 100,100, 100,10}; CvPoint curve2[]={30,30, 30,130, 130,130, 130,30, 150,10}; CvPoint* curveArr[2]={curve1, curve2}; int nCurvePts[2]={4,5}; int nCurves=2; int isCurveClosed=1; int lineWidth=1;
cvPolyLine(img,curveArr,nCurvePts,nCurves,isCurveClosed,cvScalar(0,255,255),lineWidth);
- 画内填充色的多边形:
cvFillPoly(img,curveArr,nCurvePts,nCurves,cvScalar(0,255,255));
- 添加文本:
CvFont font; double hScale=1.0; double vScale=1.0; int lineWidth=1; cvInitFont(&font,CV_FONT_HERSHEY_SIMPLEX|CV_FONT_ITALIC, hScale,vScale,0,lineWidth);
cvPutText (img,"My comment",cvPoint(200,400), &font, cvScalar(255,255,0));
Other possible fonts: CV_FONT_HERSHEY_SIMPLEX, CV_FONT_HERSHEY_PLAIN, CV_FONT_HERSHEY_DUPLEX, CV_FONT_HERSHEY_COMPLEX, CV_FONT_HERSHEY_TRIPLEX, CV_FONT_HERSHEY_COMPLEX_SMALL, CV_FONT_HERSHEY_SCRIPT_SIMPLEX, CV_FONT_HERSHEY_SCRIPT_COMPLEX,
- 综述:
- OpenCV有针对矩阵操作的C语言函数. 许多其他方法提供了更加方便的C++接口,其效率与OpenCV一样.
- OpenCV将向量作为1维矩阵处理.
- 矩阵按行存储,每行有4字节的校整.
- 分配矩阵空间:
CvMat* cvCreateMat(int rows, int cols, int type);
type: 矩阵元素类型. 格式为CV_<bit_depth>(S|U|F)C<number_of_channels>. 例如: CV_8UC1 表示8位无符号单通道矩阵, CV_32SC2表示32位有符号双通道矩阵.
例程: CvMat* M = cvCreateMat(4,4,CV_32FC1);
- 释放矩阵空间:
CvMat* M = cvCreateMat(4,4,CV_32FC1); cvReleaseMat(&M);
- 复制矩阵:
CvMat* M1 = cvCreateMat(4,4,CV_32FC1); CvMat* M2; M2=cvCloneMat(M1);
- 初始化矩阵:
double a[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12 };
CvMat Ma=cvMat(3, 4, CV_64FC1, a);
另一种方法: CvMat Ma; cvInitMatHeader(&Ma, 3, 4, CV_64FC1, a);
- 初始化矩阵为单位阵:
CvMat* M = cvCreateMat(4,4,CV_32FC1); cvSetIdentity(M); // 这里似乎有问题,不成功
- 假设需要存取一个2维浮点矩阵的第(i,j)个元素.
- 间接存取矩阵元素:
cvmSet(M,i,j,2.0); // Set M(i,j) t = cvmGet(M,i,j); // Get M(i,j)
- 直接存取,假设使用4-字节校正:
CvMat* M = cvCreateMat(4,4,CV_32FC1); int n = M->cols; float *data = M->data.fl;
data[i*n+j] = 3.0;
- 直接存取,校正字节任意:
CvMat* M = cvCreateMat(4,4,CV_32FC1); int step = M->step/sizeof(float); float *data = M->data.fl;
(data+i*step)[j] = 3.0;
- 直接存取一个初始化的矩阵元素:
double a[16]; CvMat Ma = cvMat(3, 4, CV_64FC1, a); a[i*4+j] = 2.0; // Ma(i,j)=2.0;
- 矩阵-矩阵操作:
CvMat *Ma, *Mb, *Mc; cvAdd(Ma, Mb, Mc); // Ma+Mb -> Mc cvSub(Ma, Mb, Mc); // Ma-Mb -> Mc cvMatMul(Ma, Mb, Mc); // Ma*Mb -> Mc
- 按元素的矩阵操作:
CvMat *Ma, *Mb, *Mc; cvMul(Ma, Mb, Mc); // Ma.*Mb -> Mc cvDiv(Ma, Mb, Mc); // Ma./Mb -> Mc cvAddS(Ma, cvScalar(-10.0), Mc); // Ma.-10 -> Mc
- 向量乘积:
double va[] = {1, 2, 3}; double vb[] = {0, 0, 1}; double vc[3];
CvMat Va=cvMat(3, 1, CV_64FC1, va); CvMat Vb=cvMat(3, 1, CV_64FC1, vb); CvMat Vc=cvMat(3, 1, CV_64FC1, vc);
double res=cvDotProduct(&Va,&Vb); // 点乘: Va . Vb -> res cvCrossProduct(&Va, &Vb, &Vc); // 向量积: Va x Vb -> Vc end{verbatim}
注意 Va, Vb, Vc 在向量积中向量元素个数须相同.
- 单矩阵操作:
CvMat *Ma, *Mb; cvTranspose(Ma, Mb); // transpose(Ma) -> Mb (不能对自身进行转置) CvScalar t = cvTrace(Ma); // trace(Ma) -> t.val[0] double d = cvDet(Ma); // det(Ma) -> d cvInvert(Ma, Mb); // inv(Ma) -> Mb
- 非齐次线性系统求解:
CvMat* A = cvCreateMat(3,3,CV_32FC1); CvMat* x = cvCreateMat(3,1,CV_32FC1); CvMat* b = cvCreateMat(3,1,CV_32FC1); cvSolve(&A, &b, &x); // solve (Ax=b) for x
- 特征值分析(针对对称矩阵):
CvMat* A = cvCreateMat(3,3,CV_32FC1); CvMat* E = cvCreateMat(3,3,CV_32FC1); CvMat* l = cvCreateMat(3,1,CV_32FC1); cvEigenVV(&A, &E, &l); // l = A的特征值 (降序排列) // E = 对应的特征向量 (每行)
- 奇异值分解SVD:
CvMat* A = cvCreateMat(3,3,CV_32FC1); CvMat* U = cvCreateMat(3,3,CV_32FC1); CvMat* D = cvCreateMat(3,3,CV_32FC1); CvMat* V = cvCreateMat(3,3,CV_32FC1); cvSVD(A, D, U, V, CV_SVD_U_T|CV_SVD_V_T); // A = U D V^T
标号使得 U 和 V 返回时被转置(若没有转置标号,则有问题不成功!!!).
- OpenCV支持从摄像头或视频文件(AVI)中抓取图像.
- 从摄像头获取初始化:
CvCapture* capture = cvCaptureFromCAM(0); // capture from video device #0
- 从视频文件获取初始化:
CvCapture* capture = cvCaptureFromAVI("infile.avi");
- 抓取帧:
IplImage* img = 0; if(!cvGrabFrame(capture)){ // 抓取一帧 printf("Could not grab a frame\n\7"); exit(0); } img=cvRetrieveFrame(capture); // 恢复获取的帧图像
要从多个摄像头同时获取图像, 首先从每个摄像头抓取一帧. 在抓取动作都结束后再恢复帧图像.
- 释放抓取源:
cvReleaseCapture(&capture);
注意由设备抓取的图像是由capture函数自动分配和释放的. 不要试图自己释放它.
- 获取设备特性:
cvQueryFrame(capture); // this call is necessary to get correct // capture properties int frameH = (int) cvGetCaptureProperty(capture, CV_CAP_PROP_FRAME_HEIGHT); int frameW = (int) cvGetCaptureProperty(capture, CV_CAP_PROP_FRAME_WIDTH); int fps = (int) cvGetCaptureProperty(capture, CV_CAP_PROP_FPS); int numFrames = (int) cvGetCaptureProperty(capture, CV_CAP_PROP_FRAME_COUNT);
所有帧数似乎只与视频文件有关. 用摄像头时不对,奇怪!!!.
- 获取帧信息:
float posMsec = cvGetCaptureProperty(capture, CV_CAP_PROP_POS_MSEC); int posFrames = (int) cvGetCaptureProperty(capture, CV_CAP_PROP_POS_FRAMES); float posRatio = cvGetCaptureProperty(capture, CV_CAP_PROP_POS_AVI_RATIO);
获取所抓取帧在视频序列中的位置, 从首帧开始按[毫秒]算. 或者从首帧开始从0标号, 获取所抓取帧的标号. 或者取相对位置,首帧为0,末帧为1, 只对视频文件有效.
- 设定所抓取的第一帧标号:
// 从视频文件相对位置0.9处开始抓取 cvSetCaptureProperty(capture, CV_CAP_PROP_POS_AVI_RATIO, (double)0.9);
只对从视频文件抓取有效. 不过似乎也不成功!!!
- 初始化视频存储器:
CvVideoWriter *writer = 0; int isColor = 1; int fps = 25; // or 30 int frameW = 640; // 744 for firewire cameras int frameH = 480; // 480 for firewire cameras writer=cvCreateVideoWriter("out.avi",CV_FOURCC('P','I','M','1'), fps,cvSize(frameW,frameH),isColor);
其他有效编码: CV_FOURCC('P','I','M','1') = MPEG-1 codec CV_FOURCC('M','J','P','G') = motion-jpeg codec (does not work well) CV_FOURCC('M', 'P', '4', '2') = MPEG-4.2 codec CV_FOURCC('D', 'I', 'V', '3') = MPEG-4.3 codec CV_FOURCC('D', 'I', 'V', 'X') = MPEG-4 codec CV_FOURCC('U', '2', '6', '3') = H263 codec CV_FOURCC('I', '2', '6', '3') = H263I codec CV_FOURCC('F', 'L', 'V', '1') = FLV1 codec
若把视频编码设为-1则将打开一个编码选择窗口(windows系统下).
- 存储视频文件:
IplImage* img = 0; int nFrames = 50; for(i=0;i<nFrames;i++){ cvGrabFrame(capture); // 抓取帧 img=cvRetrieveFrame(capture); // 恢复图像 cvWriteFrame(writer,img); // 将帧添加入视频文件 }
若想在抓取中查看抓取图像, 可在循环中加入下列代码: cvShowImage("mainWin", img); key=cvWaitKey(20); // wait 20 ms
若没有20[毫秒]延迟,将无法正确显示视频序列.
- 释放视频存储器:
cvReleaseVideoWriter(&writer);
May 05
图象处理 — 作者 hillohillo @ 20:50
本文将围绕一个实例,主要就测量物体长度的算法加以阐述。 现在假设我们要在图像中测量物体的长度。如图1所示,虚线内为图像范围,图中背景为白色,被测物呈黑色。
图1 测物体情况
在相机拍照后,将图像视频信号传至视觉卡,由视觉卡把波状视频信号翻译成数字信号,存到电脑的内存中去。储存信息如图2所示,图像中的虚线格子为像素单元。下面将具体说明基于临界灰度值和亚像素的边缘寻找算法。
图2 内存中的存储信息
1、系统的自学习接下来第一步,我们要先选取一个临界灰度值(threshold,有关这个名词的解释,请参阅主题文章“视觉系统速成”)。大家已经知道,当图像转换成数字信号存到内存中去之后,我们便可以轻易地读取任何像素的灰度值。比如,我们现在从图像中得到行3的全部像素灰度值(如图3所示)。为了方便,这里假定此系统的灰度值分辨率是256级,0为最黑,255为最白。
图3 图像中第三行的像素灰度值情况[/center] 从图中,我们可以看出被测体的范围(X轴方向)是从列D至列H。在行3的灰度值中,从列D到列H的灰度值分别为:50,40,40,35,80。由此可知,被测物体在成像中灰度值最高(即颜色最白)的像素的灰度值是像素(3,H)的灰度值,即80。
那么我们便可以认为,系统的临界灰度值就是80,当然在实际测量中为留一定余地,我们不妨设为100。当然,若成像中被测物为白色,则应当选颜色最黑的地方的像素值为临界灰度值(有关临界灰度值设定的具体方法,以后另题讨论)。设定临界灰度值后,系统便完成了测量的第一步:自学习。假如此时已经完成了系统的标定工作(包括相机标定、系统标定),那么现在就可以正式开始测量了。
2、测量中的临界灰度值算法我们把一个待测的被测物放到相机下拍照。在内存中所得图像如图4所示。这里图4与图2略有不同。这只是为了说明在实际操作中,每次拍照所得到的图像,必定是有所不同的。
图4 得到图像后,我们便可以让软件对图像进行分析。仍是以行3为例,假设系统是从行3开始进行逐点扫描的。扫描的过程如下:先读取像素(3,A)的灰度值来与刚才所设定的临界灰度值作比较。如果像素(3,A)大过临界灰度值,也就是说像素(3,A)的颜色比临界灰度值白。那么这个像素就不是被测物上的一个点。然后就继续进行下一步的运算,读取像素(3,B)的灰度值重复上述运算,如此循环直至图像尽头列L。基本程序可描述如下:
for (I=A I<=L I ++) { if(pixel[3,I] <= 100) { flag = TRUE break } } 程序中的100就是刚才系统所设定的临界灰度值。Flag是一个标志,当系统找到被测物的第一个边缘时,flag = TRUE,于是系统便开始寻找第二个边缘。在本例中,第一个边缘是由白到黑,第二个边缘是由黑到白。 假设在新的图像中,行3的灰度值如图5如示。那么系统扫描到像素(3,D)时,程序便会中断,flag = TRUE, 并开始寻找第二个由黑到白的边缘。
图5 新的图像灰度值情况
第二次寻找基本程序如下:
for (J=I J<=L J ++) { if(pixel[3,J] >= 100) { flag = FALSE break } } 按图5所示,第二边缘的寻找,进行到像素(3,H)时,便自动停止。现在我们根据程序运行中第一个变量I所记录的数值,知道第一个边缘为D。由变量J知道第二个边缘是H-1=G。由此,可以知道整个被测物X轴方向的大小=G-D=4个像素。4×像素值(由系统标定得到),我们就最终得到被测物体的左右长度了。
但事情并没有这么简单,现在真正的问题出现了。实际上,不难发现在图4中,被测物实际上从列C开始的。只不过在列C中,被测物只有一部分,而另一部分是白色的背景。下面,我们就要设计新的算法,即“亚像素算法”来计算这种“一半一半”的部分。
3、亚像素算法亚像素算法的基本思路就是将一个像素再分为更小的单位。在我们上面的讨论中,一直以8bit的系统作例子,也就是说1个像素的灰度值分为256级。所以,以这类系统为例,进行亚像素计算就要把像素分为255个小单位。 或许,可以这样来理解“亚像素算法”。一个像素的灰度值从0到255,0是纯黑,255是纯白。不妨把像素想像成是一个由255个小像素所组成的集合。而每个小像素都是一个独立的小镜子,那就是说一个像素里面有255个小镜子。
灰度值则可以看作反光的小镜子数量:0表示255个小镜子全都没有反光;255表示255个镜子一起反光。上面讲到的所设定的临界灰度值100,则可表示255个镜子中有100个在反光,另外155个镜子没有反光。 现在,回到上面的测量例子中来。
从图4中可以看到,被测物在列C中只有一半,而正是由于这个原因所以列C的灰度值是高于临界灰度值的。只要我们把这部分也算到最终测量数据中去,所得到的结果必定更为准确。由此大家可以知道,真正的计算被测物的长度公式,并不是(像素数量×像素值)这么简单,而应该是((像素数量+第一边缘亚像素值+第二边缘亚像素值)×像素值),具体到本例,被测物左右真实长度=((4+像素(3,C)亚像素值+像素(3,H)亚像素值)×像素值)。
如何算亚像素值呢?非常简单,亚像素值(白色部分)=该像素灰度值/256;亚像素值(黑色部分)=1-亚像素值(白色部分);仍以图4为例,像素(3,C)的亚像素值=1-(120 / 256)=0.53; 像素(3,H)的亚像素值=1-(180/256)=0.3。而整个被测物左右实际长度为4.83个像素。其实就是在算有几个镜子在反光,有几个没反光罢了。
另外,除了这种计算方法,还有其他几种计算亚像素值的方法:
(1)亚像素值(白色部分)=(该像素灰度值×(临界灰度值/256))/256 亚像素值(黑色部分)=1-亚像素值(白色部分)
(2)亚像素值(白色部分)=后像素值/ (前像素值 +后像素值)亚像素值(黑色部分)=1-亚像素值(白色部分)
(3)亚像素值(白色部分)=(像素值-前像素值)/ (后像素值-前像素值) 亚像素值(黑色部分)=1-亚像素值(白色部分) 以上就是亚像素算法的基本原理。
在结束这个算法讨论之前,有两点必须注意:一是在实际情况下,大家不可能看到图4中所显示的情况,即像素的一半是黑色另一半是白色,这只是为了方便大家理解所画出来的,而真实的情况是一个像素就只是一小块灰色,没有明暗的分别。明暗的区别只能在像素与像素间显现出来;二是在描述亚像素的基本算法时,所说“小镜子”的概念完全是为了方便大家理解,比纯数学语言表达更为易懂。
图象处理 — 作者 hillohillo @ 20:53
很多算法的每一个计算步骤都是固定的,而在下面我们要讨论的概率算法,允许算法在执行的过程中随机选择下一个计算步骤。许多情况下,当算法在执行过程中面临一个选择时,随机性选择常比最优选择省时。因此概率算法可在很大程度上降低算法的复杂度。 概率算法的一个基本特征是对所求解问题的同一实例用同一概率算法求解两次可能得到完全不同的效果。这两次求解问题所需的时间甚至所得到的结果可能会有相当大的差别。一般情况下,可将概率算法大致分为四类:数值概率算法,蒙特卡罗(Monte Carlo)算法,拉斯维加斯(Las Vegas)算法和舍伍德(Sherwood)算法。 数值概率算法常用于数值问题的求解。这类算法所得到的往往是近似解。而且近似解的精度随计算时间的增加不断提高。在许多情况下,要计算出问题的精确解是不可能或没有必要的,因此用数值概率算法可得到相当满意的解。 蒙特卡罗算法用于求问题的准确解。对于许多问题来说,近似解毫无意义。例如,一个判定问题其解为“是”或“否”,二者必居其一,不存在任何近似解答。又如,我们要求一个整数的因子时所给出的解答必须是准确的,一个整数的近似因子没有任何意义。用蒙特卡罗算法能求得问题的一个解,但这个解未必是正确的。求得正确解的概率依赖于算法所用的时间。算法所用的时间越多,得到正确解的概率就越高。蒙特卡罗算法的主要缺点就在于此。一般情况下,无法有效判断得到的解是否肯定正确。 拉斯维加斯算法不会得到不正确的解,一旦用拉斯维加斯算法找到一个解,那么这个解肯定是正确的。但是有时候用拉斯维加斯算法可能找不到解。与蒙特卡罗算法类似。拉斯维加斯算法得到正确解的概率随着它用的计算时间的增加而提高。对于所求解问题的任一实例,用同一拉斯维加斯算法反复对该实例求解足够多次,可使求解失效的概率任意小。 舍伍德算法总能求得问题的一个解,且所求得的解总是正确的。当一个确定性算法在最坏情况下的计算复杂性与其在平均情况下的计算复杂性有较大差别时,可以在这个确定算法中引入随机性将它改造成一个舍伍德算法,消除或减少问题的好坏实例间的这种差别。舍伍德算法精髓不是避免算法的最坏情况行为,而是设法消除这种最坏行为与特定实例之间的关联性。 本文简要的介绍一下数值概率算法和舍伍德算法。 首先来谈谈随机数。随机数在概率算法设计中扮演着十分重要的角色。在现实计算机上无法产生真正的随机数,因此在概率算法中使用的随机数都是一定程度上随机的,即伪随机数。 产生随机数最常用的方法是线性同余法。由线性同余法产生的随机序列a1,a2,...,an满足 a0=d an=(ban-1+c)mod m n=1,2....... 其中,b>=0, c>=0, d>=m。d称为该随机序列的种子。 下面我们建立一个随机数类RadomNumber,该类包含一个由用户初始化的种子randSeed。给定种子之后,既可产生与之相应的随机数序列。randseed是一个无符号长整型数,既可由用户指定也可由系统时间自动产生。 const unsigned long maxshort=65536L; const unsigned long multiplier=1194211693L; const unsigned long adder=12345L; class RandomNumber { private: //当前种子 unsigned long randseed; public: //构造函数,缺省值0表示由系统自动产生种子 RandomNumber(unsigned long s=0); //产生0-n-1之间的随机整数 unsigned short Random(unsigned long n); //产生[0,1)之间的随机实数 double fRandom(void); }; RandomNumber::RandomNumber(unsigned long s) { if(s==0) randseed=time(0); else randseed=s; } unsigned short RandomNumber::Random(unsigned long n) { randseed=multiplier*randseed+adder; return (unsigned short)((randseed>>16)%n); } double RandomNumber::fRandom(void) { return Random(maxshort)/double(maxshort); } 函数Random在每次计算时,用线性同余式计算新的种子。它的高16位的随机性较好,将randseed右移16位得到一个0-65535之间的随机整数然后再将此随机整数映射到0-n-1范围内。 对于函数fRandom,先用Random(maxshort)产生一个0-(maxshort-1之间的整型随机序列),将每个整型随机数除以maxshort,就得到[0,1)区间中的随机实数。 下面来看看数值概率算法的两个例子: 1.用随机投点法计算π 设有一半径为r的圆及其外切四边形,如图所示。向该正方形随机投掷n个点。设落入圆内的点在正方形上均匀分布,因而所投入点落入圆内的概率为πr^2/4r^2,所以当n足够大时,k与n之比就逼近这一概率,即π/4。由此可得使用随机投点法计算π值的数值概率算法。具体实现时,只需要在第一次象限计算即可。
double Darts(int n) { static RandomNumber dart; int k=0; for(int i=1;i<=n;i++){ double x=dart.fRandom(); double y=dart.fRandom(); if((x*x+y*y)<1) k++; } return 4*k/double(n); } 再简单举个舍伍德算法的例子。 我们在分析一个算法在平均情况下的计算复杂性时,通常假定算法的输入数据服从某一特定的概率分布。例如,在输入数据是均匀分布时,快速排序算法所需的平均时间是O(n logn)。但是如果其输入已经基本上排好序时,所用时间就大大增加了。此时,可采用舍伍德算法消除算法所需计算时间与输入实例间的这种联系。 在这里,我们用舍伍德型选择算法随机的选择一个数组元素作为划分标准。这样既能保证算法的线性时间平均性能又避免了计算拟中位数的麻烦。非递归的舍伍德型算法可描述如下: template<class Type> Type select(Type a[], int l, int r, int k) { static RandomNumber rnd; while(true){ if(l>=r) return a[l]; int i=l, j=l=rnd.Random(r-l+1); Swap(a[i], a[j]); j=r+1; Type pivot=a[l]; while(true) { while(a[++i]<pivot); while(a[--j]>pivot); if(i>=j) break; Swap(a[i], a[j]); } if(j-l+1==k) return pivot; a[l]=a[j]; a[j]=pivot; if(j-l+1<k) { k=k-j+l-1; l=j+1; } else r=j-1; } } template <class Type> Type Select(Type a[], int n, int k) { if(k<1||k>n) throw OutOfBounds(); return select(a, 0, n-1, k); } 平时我们一般开始考虑的是一个有着很好平均性能的选择算法,但在最坏情况下对某些实例算法效率较低。这时候我们用概率算法,将上述算法改造成一个舍伍德型算法,使得该算法对任何实例均有效。 不过在有些情况下,所给的确定性算法无法直接改造成舍伍德型算法。这时候就可以借助随机预处理技术,不改变原有的确定性算法,仅对其输入进行随机洗牌,同样可以得到舍伍德算法的效果。还是刚才的例子,换一种方法实现: template<class Type> void Shuffle(Type a[], int n) { static RandomNumber rnd; for(int i=1;i<n;i++){ int j=rnd.Random(n-i)+i; Swap(a[i], a[j]); } } 在上文里,我们对概率算法中的数值概率算法以及舍伍德算法举例作了简要的介绍,希望能使大家对概率算法有一个初步的认识,并且将这种思想运用到自己平时的编程中。 April 26
Kalman Filter
1.什么是卡尔曼滤波器 (What is the Kalman Filter?)
在学习卡尔曼滤波器之前,首先看看为什么叫“卡尔曼”。跟其他著名的理论(例如傅立叶变换,泰勒级数等等)一样,卡尔曼也是一个人的名字,而跟他们不同的是,他是个现代人!
卡尔曼全名Rudolf Emil Kalman,匈牙利数学家,1930年出生于匈牙利首都布达佩斯。1953,1954年于麻省理工学院分别获得电机工程学士及硕士学位。1957年于哥伦比亚大学获得博士学位。我们现在要学习的卡尔曼滤波器,正是源于他的博士论文和1960年发表的论文《A New Approach to Linear Filtering and Prediction Problems》(线性滤波与预测问题的新方法)。
简单来说,卡尔曼滤波器是一个“optimal recursive data processing algorithm(最优化自回归数据处理算法)”。对于解决很大部分的问题,他是最优,效率最高甚至是最有用的。他的广泛应用已经超过30年,包括机器人导航,控制,传感器数据融合甚至在军事方面的雷达系统以及导弹追踪等等。近年来更被应用于计算机图像处理,例如头脸识别,图像分割,图像边缘检测等等。
2.卡尔曼滤波器的介绍 (Introduction to the Kalman Filter)
为了可以更加容易的理解卡尔曼滤波器,这里会应用形象的描述方法来讲解,而不是像大多数参考书那样罗列一大堆的数学公式和数学符号。但是,他的5条公式是其核心内容。结合现代的计算机,其实卡尔曼的程序相当的简单,只要你理解了他的那5条公式。
在介绍他的5条公式之前,先让我们来根据下面的例子一步一步的探索。
假设我们要研究的对象是一个房间的温度。根据你的经验判断,这个房间的温度是恒定的,也就是下一分钟的温度等于现在这一分钟的温度(假设我们用一分钟来做时间单位)。假设你对你的经验不是100%的相信,可能会有上下偏差几度。我们把这些偏差看成是高斯白噪声(White Gaussian Noise),也就是这些偏差跟前后时间是没有关系的而且符合高斯分配(Gaussian Distribution)。另外,我们在房间里放一个温度计,但是这个温度计也不准确的,测量值会比实际值偏差。我们也把这些偏差看成是高斯白噪声。
好了,现在对于某一分钟我们有两个有关于该房间的温度值:你根据经验的预测值(系统的预测值)和温度计的值(测量值)。下面我们要用这两个值结合他们各自的噪声来估算出房间的实际温度值。
假如我们要估算k时刻的实际温度值。首先你要根据k-1时刻的温度值,来预测k时刻的温度。
(1)因为你相信温度是恒定的,所以你会得到k时刻的温度预测值是跟k-1时刻一样的,假设是23度,同时该值的高斯噪声的偏差是5度。(5是这样得到的:如果k-1时刻估算出的最优温度值的偏差是3,你对自己预测的不确定度是4度,他们平方相加再开方,就是5)
(2)然后,你从温度计那里得到了k时刻的温度值,假设是25度,同时该值的偏差是4度。
由于我们用于估算k时刻的实际温度有两个温度值,分别是23度和25度。究竟实际温度是多少呢?相信自己还是相信温度计呢?究竟相信谁多一点,我们可以用他们的covariance来判断。因为Kg^2=5^2/(5^2+4^2),所以Kg=0.78,我们可以估算出k时刻的实际温度值是:23+0.78*(25-23)=24.56度。可以看出,因为温度计的covariance比较小(比较相信温度计),所以估算出的最优温度值偏向温度计的值。
现在我们已经得到k时刻的最优温度值了,下一步就是要进入k+1时刻,进行新的最优估算。到现在为止,好像还没看到什么自回归的东西出现。对了,在进入k+1时刻之前,我们还要算出k时刻那个最优值(24.56度)的偏差。算法如下:((1-Kg)*5^2)^0.5=2.35。这里的5就是上面的k时刻你预测的那个23度温度值的偏差,得出的2.35就是进入k+1时刻以后k时刻估算出的最优温度值的偏差(对应于上面的3)。
就是这样,卡尔曼滤波器就不断的把covariance递归,从而估算出最优的温度值。他运行的很快,而且它只保留了上一时刻的covariance。上面的Kg,就是卡尔曼增益(Kalman Gain)。他可以随不同的时刻而改变他自己的值,是不是很神奇!
下面就要言归正传,讨论真正工程系统上的卡尔曼。
X(k)=A X(k-1)+B U(k)+W(k)
Z(k)=H X(k)+V(k)
3.卡尔曼滤波器算法
(The Kalman Filter Algorithm)
X(k|k-1)=A X(k-1|k-1)+B U(k) ……………………… (1)
P(k|k-1)=A P(k-1|k-1) A’+Q ………………………… (2)
X(k|k)= X(k|k-1)+Kg(k) (Z(k)-H X(k|k-1)) ……… (3)
Kg(k)= P(k|k-1) H’ / (H P(k|k-1) H’ + R) ……… (4)
P(k|k)=(I-Kg(k) H)P(k|k-1) ………………………… (5)
在这一部分,我们就来描述源于Dr Kalman的卡尔曼滤波器。下面的描述,会涉及一些基本的概念知识,包括概率(Probability),随机变量(Random Variable),高斯或正态分配(Gaussian Distribution)还有State-space Model等等。但对于卡尔曼滤波器的详细证明,这里不能一一描述。
首先,我们先要引入一个离散控制过程的系统。该系统可用一个线性随机微分方程来描述:
X(k)=A X(k-1)+B U(k)+W(k)
再加上系统的测量值:
Z(k)=H X(k)+V(k)
上两式子中,X(k)是k时刻的系统状态,U(k)是k时刻对系统的控制量。A和B是系统参数,对于多模型系统,他们为矩阵。Z(k)是k时刻的测量值,H是测量系统的参数,对于多测量系统,H为矩阵。W(k)和V(k)分别表示过程和测量的噪声。他们被假设成高斯白噪声(White Gaussian Noise),他们的covariance分别是Q,R(这里我们假设他们不随系统状态变化而变化)。
对于满足上面的条件(线性随机微分系统,过程和测量都是高斯白噪声),卡尔曼滤波器是最优的信息处理器。
下面我们来用他们结合他们的covariances来估算系统的最优化输出(类似上一节那个温度的例子)。
首先我们要利用系统的过程模型,来预测下一状态的系统。假设现在的系统状态是k,根据系统的模型,可以基于系统的上一状态而预测出现在状态:
X(k|k-1)=A X(k-1|k-1)+B U(k) ……… (1)
式(1)中,X(k|k-1)是利用上一状态预测的结果,X(k-1|k-1)是上一状态最优的结果,U(k)为现在状态的控制量,如果没有控制量,它可以为0。
到现在为止,我们的系统结果已经更新了,可是,对应于X(k|k-1)的covariance还没更新。我们用P表示covariance:
P(k|k-1)=A P(k-1|k-1) A’+Q ……… (2)
式(2)中,P(k|k-1)是X(k|k-1)对应的covariance,P(k-1|k-1)是X(k-1|k-1)对应的covariance,A’表示A的转置矩阵,Q是系统过程的covariance。式子1,2就是卡尔曼滤波器5个公式当中的前两个,也就是对系统的预测。
现在我们有了现在状态的预测结果,然后我们再收集现在状态的测量值。结合预测值和测量值,我们可以得到现在状态(k)的最优化估算值X(k|k):
X(k|k)= X(k|k-1)+Kg(k) (Z(k)-H X(k|k-1)) ……… (3)
其中Kg为卡尔曼增益(Kalman Gain):
Kg(k)= P(k|k-1) H’ / (H P(k|k-1) H’ + R) ……… (4)
到现在为止,我们已经得到了k状态下最优的估算值X(k|k)。但是为了要另卡尔曼滤波器不断的运行下去直到系统过程结束,我们还要更新k状态下X(k|k)的covariance:
P(k|k)=(I-Kg(k) H)P(k|k-1) ……… (5)
其中I为1的矩阵,对于单模型单测量,I=1。当系统进入k+1状态时,P(k|k)就是式子(2)的P(k-1|k-1)。这样,算法就可以自回归的运算下去。
卡尔曼滤波器的原理基本描述了,式子1,2,3,4和5就是他的5个基本公式。根据这5个公式,可以很容易的实现计算机的程序。
下面,我会用程序举一个实际运行的例子。
4.简单例子 (A Simple Example)
这里我们结合第二第三节,举一个非常简单的例子来说明卡尔曼滤波器的工作过程。所举的例子是进一步描述第二节的例子,而且还会配以程序模拟结果。
根据第二节的描述,把房间看成一个系统,然后对这个系统建模。当然,我们见的模型不需要非常地精确。我们所知道的这个房间的温度是跟前一时刻的温度相同的,所以A=1。没有控制量,所以U(k)=0。因此得出:
X(k|k-1)=X(k-1|k-1) ……….. (6)
式子(2)可以改成:
P(k|k-1)=P(k-1|k-1) +Q ……… (7)
因为测量的值是温度计的,跟温度直接对应,所以H=1。式子3,4,5可以改成以下:
X(k|k)= X(k|k-1)+Kg(k) (Z(k)-X(k|k-1)) ……… (8)
Kg(k)= P(k|k-1) / (P(k|k-1) + R) ……… (9)
P(k|k)=(1-Kg(k))P(k|k-1) ……… (10)
现在我们模拟一组测量值作为输入。假设房间的真实温度为25度,我模拟了50个测量值,这些测量值的平均值为25度,但是加入了标准偏差为几度的高斯白噪声(在图中为蓝线)。
为了令卡尔曼滤波器开始工作,我们需要告诉卡尔曼两个零时刻的初始值,是X(0|0)和P(0|0)。他们的值不用太在意,随便给一个就可以了,因为随着卡尔曼的工作,X会逐渐的收敛。但是对于P,一般不要取0,因为这样可能会令卡尔曼完全相信你给定的X(0|0)是系统最优的,从而使算法不能收敛。我选了X(0|0)=0度,P(0|0)=2。
附matlab下面的kalman滤波程序:
clear clc; N=50; CON = 25;%房间温度,假定温度是恒定的 % 系统方程 % x(k+1)=x(k)+w; % 状态方程 % y(k)=x(k)+v; % 观测方程 %%%%%%%%%%%%%%%kalman filter%%%%%%%%%%%%%%%%%%%%%% x = zeros(1,N);
y = randn(1,N) + CON;%温度计的输出 % 初始化 x(1) = 0; p = 2;
Q = cov(randn(1,N)); %过程噪声协方差 R = cov(randn(1,N)); %观测噪声协方差
%T = cov(randn(1,N)); for k = 2 : N x(k) = x(k - 1);%预估计k时刻状态变量的值 (1) p = p + Q;%对应于预估值的协方差 (2) kg = p / (p + R);%kalman gain (3) x(k) = x(k) + kg * (y(k) - x(k));% (4) p = (1 - kg) * p;% (5) end
t=1:N; figure(1); expValue = zeros(1,N); for i = 1: N expValue(i) = CON; end plot(t,expValue,'r',t,x,'g-o',t,y,'b-+'); legend('expected','estimate','measure'); %axis([0 N 20 30]) xlabel('Sample time'); ylabel('Room Temperature'); title('Smooth filter VS kalman filter'); stdx=std(x-25); stdy=std(y-25); fprintf('stdx=%i,stdy=%i',stdx,stdy);
MATLAB仿真效果:
EKF
控制系统的鲁棒性研究是现代控制理论研究中一个非常活跃的领域,鲁棒控制问题最早出现在上个世纪人们对于微分方程的研究中。Black首先在他的1927年的一项专利上应用了鲁棒控制。但是什么叫做鲁棒性呢?其实这个名字是一个音译,其英文拼写为Robust。也就是健壮和强壮的意思。控制专家用这个名字来表示当一个控制系统中的参数发生摄动时系统能否保持正常工作的一种特性或属性。人在受到外界病菌的感染后,是否能够通过自身的免疫系统恢复健康一样。 20世纪六七十年代,状态空间的结构理论的形成是现代控制理论的一个重要突破。状态空间的结构理论包括能控性、能观性、反馈镇定和输入输出模型的状态空间实现理论,它连同最优控制理论和卡尔曼滤波理论一起,使现代控制理论形成了严谨完整的理论体系,并且在宇航和机器人控制等应用领域取得了惊人的成就。但是这些理论要求系统的模型必须是已知的,而大多实际的工程系统都运行在变化的环境中,要获得精确的数学模型是不可能的。因此很多理论在实际的应用中并没有得到很好的效果。到了1972年,鲁棒控制这个术语在文献中首先被提出,但是对于它的精确定义至今还没有一致的说法。其主要分歧就在于对于摄动的定义上面,摄动分很多种,是否每种摄动都要包括在鲁棒性研究中呢?尽管存在分歧,但是鲁棒性的研究没有受到阻碍,其发展的势头有增无减。
鲁棒控制理论发展到今天,已经形成了很多引人注目的理论。其中控制理论是目前解决鲁棒性问题最为成功且较完善的理论体系。Zames在1981年首次提出了这一著名理论,他考虑了对于一个单输入单输出系统的控制系统,设计一个控制器,使系统对于扰动的反映最小。在他提出这一理论之后的20年里,许多学者发展了这一理论,使其有了更加广泛的应用。当前这一理论的研究热点是在非线形系统中控制问题。另外还有一些关于鲁棒控制的理论如结构异值理论和区间理论等。
鲁棒控制理论的应用不仅仅用在工业控制中,它被广泛运用在经济控制、社会管理等很多领域。随着人们对于控制效果要求的不断提高,系统的鲁棒性会越来越多地被人们所重视,从而使这一理论得到更快的发展。
当今的自动控制技术都是基于反馈的概念。反馈理论的要素包括三个部分:测量、比较和执行。测量关心的变量,与期望值相比较,用这个误差纠正调节控制系统的响应。
这个理论和应用自动控制的关键是,做出正确的测量和比较后,如何才能更好地纠正系统。
鲁棒控制(Robust Control)方面的研究始于20世纪50年代。在过去的20年中,鲁棒控制一直是国际自控界的研究热点。所谓“鲁棒性”,是指控制系统在一定(结构,大小)的参数摄动下,维持某些性能的特性。根据对性能的不同定义,可分为稳定鲁棒性和性能鲁棒性。以闭环系统的鲁棒性作为目标设计得到的固定控制器称为鲁棒控制器。
由于工作状况变动、外部干扰以及建模误差的缘故,实际工业过程的精确模型很难得到,而系统的各种故障也将导致模型的不确定性,因此可以说模型的不确定性在控制系统中广泛存在。如何设计一个固定的控制器,使具有不确定性的对象满足控制品质,也就是鲁棒控制,成为国内外科研人员的研究课题。
鲁棒控制的早期研究,主要针对单变量系统(SISO)的在微小摄动下的不确定性,具有代表性的是Zames提出的微分灵敏度分析。然而,实际工业过程中故障导致系统中参数的变化,这种变化是有界摄动而不是无穷小摄动。因此产生了以讨论参数在有界摄动下系统性能保持和控制为内容的现代鲁棒控制。
现代鲁棒控制是一个着重控制算法可靠性研究的控制器设计方法。其设计目标是找到在实际环境中为保证安全要求控制系统最小必须满足的要求。一旦设计好这个控制器,它的参数不能改变而且控制性能能够保证。
鲁棒控制方法,是对时间域或频率域来说,一般要假设过程动态特性的信息和它的变化范围。一些算法不需要精确的过程模型,但需要一些离线辨识。
一般鲁棒控制系统的设计是以一些最差的情况为基础,因此一般系统并不工作在最优状态。常用的设计方法有:INA方法,同时镇定,完整性控制器设计,鲁棒控制,鲁棒PID控制以及鲁棒极点配置,鲁棒观测器等。
鲁棒控制方法适用于稳定性和可靠性作为首要目标的应用,同时过程的动态特性已知且不确定因素的变化范围可以预估。飞机和空间飞行器的控制是这类系统的例子。
过程控制应用中,某些控制系统也可以用鲁棒控制方法设计,特别是对那些比较关键且(1)不确定因素变化范围大;(2)稳定裕度小的对象。
但是,鲁棒控制系统的设计要由高级专家完成。一旦设计成功,就不需太多的人工干预。另一方面,如果要升级或作重大调整,系统就要重新设计
写英文科技论文的几点心得
http://emuch.net/bbs/viewthread.php?tid=603903&fpage=1
在国外呆了几年,总结一下发论文的心得体会,给兄弟们提个醒,衷心的希望大家加强交流,共同进步!总体的思路就是科研思路: 1,如何找论文。每个科研人员都是要搜索文献的,而且需要有方法的去找。
首先是如何确定你要读的文献。一般的原则是搜寻重要刊物,重要人物的文章。重要刊物也是相对而言的,对于不同的领域,自然标准也不一样。有个窍门,我们可以通过搜寻期刊会议的接受率(acceptance rate),判断个八九不离十。小于20%的是好会议或顶级会议,20/30%的是好会议,40%就是一般的了。其他的依次类推。我个人比较喜欢的是IEEE的transaction 或是Jounal,一般不会差到哪去。而且论文中的文献有很多也是很有参考价值的。 重要人物,借鉴别人的经验,看作者在什么单位或学校,年纪多大,发表了什么文章,等等。 文献不求多,要精。一般30篇左右差不多让你可以摸底了。
2,如何读的问题。
在你不知道一篇文献对你有没有用的时候,千万不要随便的投入你的宝贵时间。我的浏览顺序是:标题〉摘要〉总结〉介绍〉图表〉全文浏览。通过这个程序,我们可以很方便的把我们需要的东西搞到手里面。对于不合我们环节要求的文章,要像天文学家把冥王星开除出太阳系一样坚决,不能马虎。浪费自己的时间,是对自己儿子的不负责任!嗬嗬,扯远了。
文章到手了,并没有进入我们的脑子,还是没用的。怎么样才能完成内化的过程呢? 多笔记,多复习。没有什么其它的好方法!多记背景知识,多记好的英文句型和表示方法。好句型最好不少于250句,至于为什么刚好是250句,大家自己想,呵呵。
3,如何管理文献。 我向大家推荐endnoteweb版。web版相对于单机版来说,就是比较方便。它的信息都是在网上的,不用局限于单机操作,特别对于自己没有装软件权利的人,特别适用(比如我)。它的存储上限是10000篇文献摘要,反正我是用不完的。这样你就可以在网上操作文献,写notes,分类管理。
4,如何投文献。 一般在投之前需要到网上寻找自己的领域都有哪些会议和期刊。IEEE上可以搜索,也有一些学校的院系自己联接了相关的会议。呵呵,还是根据接收率决定头还是不投吧!会议每年基本上是固定的时间召开,而且一般提前4个多月call for papers。这个要一定注意。
5,修改自己的文章。 精工出细活。我的原则是不把文章搞个5—6篇,我是不会发出去的。在Final version中一般看不出First version的影子。有点像炼葵花宝典,玩自宫一样!!瀑布汉! 几个原则: 多用被动语句,尽量少用主动语句。如果你是大牛,就当我没说。我见过的大牛文章经常用"We found","we first proposed" etc. 反正我是没有试过这样写的后果,有兴趣的小虫可以玩玩! 词类句型多样化。简单的举个例子,导致〉cause, result in, pose, lead to, bring...; 使得:enable, propose, provide, delieve... 避免口语化的句子。 举个例子。口语化的句子: The guy who teachs english is a gradute from XXX University. 科技文:The guy teaching english is a gradute from XXX University. 还有一个例子。The film is not developed enough 不如 The film not developed enough 更不如 the under-developed film
6, 建议有兴趣的同学可以学学LaTex. 个人感觉在美国和欧洲,很多的科技工作者喜欢用它来代替Word发文章。Word就像是女人,你永远搞不清楚她在干什么,也永远别想搞清楚。LaTex排版很专业的,看起来舒服多了。
好了,希望自己的这些经验能够对朋友们有用,有时间的话,我一定多写一点,写的更详细一点,更系统一点,只要大家不嫌烦就行。
A Robot in Every Home
The leader of the PC revolution predicts that the next hot field will be robotics
from 《Scientific American》, by Bill Gates
Imagine being present at the birth of a new industry. It is an industry based on groundbreaking new technologies, wherein a handful of well-established corporations sell highly specialized devices for business use and a fast-growing number of start-up companies produce innovative toys, gadgets for hobbyists and other interesting niche products. But it is also a highly fragmented industry with few common standards or platforms. Projects are complex, progress is slow, and practical applications are relatively rare. In fact, for all the excitement and promise, no one can say with any certainty when--or even if--this industry will achieve critical mass. If it does, though, it may well change the world. Of course, the paragraph above could be a description of the computer industry during the mid-1970s, around the time that Paul Allen and I launched Microsoft. Back then, big, expensive mainframe. computers ran the back-office operations for major companies, governmental departments and other institutions. Researchers at leading universities and industrial laboratories were creating the basic building blocks that would make the information age possible. Intel had just introduced the 8080 microprocessor, and Atari was selling the popular electronic game Pong. At homegrown computer clubs, enthusiasts struggled to figure out exactly what this new technology was good for. But what I really have in mind is something much more contemporary: the emergence of the robotics industry, which is developing in much the same way that the computer business did 30 years ago. Think of the manufacturing robots currently used on automobile assembly lines as the equivalent of yesterday's mainframes. The industry's niche products include robotic arms that perform. surgery, surveillance robots deployed in Iraq and Afghanistan that dispose of roadside bombs, and domestic robots that vacuum the floor. Electronics companies have made robotic toys that can imitate people or dogs or dinosaurs, and hobbyists are anxious to get their hands on the latest version of the Lego robotics system. Meanwhile some of the world's best minds are trying to solve the toughest problems of robotics, such as visual recognition, navigation and machine learning. And they are succeeding. At the 2004 Defense Advanced Research Projects Agency (DARPA) Grand Challenge, a competition to produce the first robotic vehicle capable of navigating autonomously over a rugged 142-mile course through the Mojave Desert, the top competitor managed to travel just 7.4 miles before breaking down. In 2005, though, five vehicles covered the complete distance, and the race's winner did it at an average speed of 19.1 miles an hour. (In another intriguing parallel between the robotics and computer industries, DARPA also funded the work that led to the creation of Arpanet, the precursor to the Internet.) What is more, the challenges facing the robotics industry are similar to those we tackled in computing three decades ago. Robotics companies have no standard operating software that could allow popular application programs to run in a variety of devices. The standardization of robotic processors and other hardware is limited, and very little of the programming code used in one machine can be applied to another. Whenever somebody wants to build a new robot, they usually have to start from square one. Despite these difficulties, when I talk to people involved in robotics--from university researchers to entrepreneurs, hobbyists and high school students--the level of excitement and expectation reminds me so much of that time when Paul Allen and I looked at the convergence of new technologies and dreamed of the day when a computer would be on every desk and in every home. And as I look at the trends that are now starting to converge, I can envision a future in which robotic devices will become a nearly ubiquitous part of our day-to-day lives. I believe that technologies such as distributed computing, voice and visual recognition, and wireless broadband connectivity will open the door to a new generation of autonomous devices that enable computers to perform. tasks in the physical world on our behalf. We may be on the verge of a new era, when the PC will get up off the desktop and allow us to see, hear, touch and manipulate objects in places where we are not physically present. From Science Fiction to Reality The word "robot" was popularized in 1921 by Czech play瓀right Karel Capek, but people have envisioned creating robotlike devices for thousands of years. In Greek and Roman mythology, the gods of metalwork built mechanical servants made from gold. In the first century A.D., Heron of Alexandria--the great engineer credited with inventing the first steam engine--designed intriguing automatons, including one said to have the ability to talk. Leonardo da Vinci's 1495 sketch of a mechanical knight, which could sit up and move its arms and legs, is considered to be the first plan for a humanoid robot. Over the past century, anthropomorphic machines have become familiar figures in popular culture through books such as Isaac Asimov's I, Robot, movies such as Star Wars and television shows such as Star Trek. The popularity of robots in fiction indicates that people are receptive to the idea that these machines will one day walk among us as helpers and even as companions. Nevertheless, although robots play a vital role in industries such as automobile manufacturing--where there is about one robot for every 10 workers--the fact is that we have a long way to go before real robots catch up with their science-fiction counterparts. One reason for this gap is that it has been much harder than expected to enable computers and robots to sense their surrounding environment and to react quickly and accurately. It has proved extremely difficult to give robots the capabilities that humans take for granted--for example, the abilities to orient themselves with respect to the objects in a room, to respond to sounds and interpret speech, and to grasp objects of varying sizes, textures and fragility. Even something as simple as telling the difference between an open door and a window can be devilishly tricky for a robot. But researchers are starting to find the answers. One trend that has helped them is the increasing availability of tremendous amounts of computer power. One megahertz of processing power, which cost more than $7,000 in 1970, can now be purchased for just pennies. The price of a megabit of storage has seen a similar decline. The access to cheap computing power has permitted scientists to work on many of the hard problems that are fundamental to making robots practical. Today, for example, voice-recognition programs can identify words quite well, but a far greater challenge will be building machines that can understand what those words mean in context. As computing capacity continues to expand, robot designers will have the processing power they need to tackle issues of ever greater complexity. Another barrier to the development of robots has been the high cost of hardware, such as sensors that enable a robot to determine the distance to an object as well as motors and servos that allow the robot to manipulate an object with both strength and delicacy. But prices are dropping fast. Laser range finders that are used in robotics to measure distance with precision cost about $10,000 a few years ago; today they can be purchased for about $2,000. And new, more accurate sensors based on ultrawideband radar are available for even less. Now robot builders can also add Global Positioning System chips, video cameras, array microphones (which are better than conventional microphones at distinguishing a voice from background noise) and a host of additional sensors for a reasonable expense. The resulting enhancement of capabilities, combined with expanded processing power and storage, allows today's robots to do things such as vacuum a room or help to defuse a roadside bomb--tasks that would have been impossible for commercially produced machines just a few years ago. A BASIC Approach In february 2004 I visited a number of leading universities, including Carnegie Mellon University, the Massachusetts Institute of Technology, Harvard University, Cornell University and the University of Illinois, to talk about the powerful role that computers can play in solving some of society's most pressing problems. My goal was to help students understand how exciting and important computer science can be, and I hoped to encourage a few of them to think about careers in technology. At each university, after delivering my speech, I had the opportunity to get a firsthand look at some of the most interesting research projects in the school's computer science department. Almost without exception, I was shown at least one project that involved robotics. At that time, my colleagues at Microsoft were also hearing from people in academia and at commercial robotics firms who wondered if our company was doing any work in robotics that might help them with their own development efforts. We were not, so we decided to take a closer look. I asked Tandy Trower, a member of my strategic staff and a 25-year Microsoft veteran, to go on an extended fact-finding mission and to speak with people across the robotics community. What he found was universal enthusiasm for the potential of robotics, along with an industry-wide desire for tools that would make development easier. "Many see the robotics industry at a technological turning point where a move to PC architecture makes more and more sense," Tandy wrote in his report to me after his fact-finding mission. "As Red Whittaker, leader of [Carnegie Mellon's] entry in the DARPA Grand Challenge, recently indicated, the hardware capability is mostly there; now the issue is getting the software right." Back in the early days of the personal computer, we realized that we needed an ingredient that would allow all of the pioneering work to achieve critical mass, to coalesce into a real industry capable of producing truly useful products on a commercial scale. What was needed, it turned out, was Microsoft BASIC. When we created this programming language in the 1970s, we provided the common foundation that enabled programs developed for one set of hardware to run on another. BASIC also made computer programming much easier, which brought more and more people into the industry. Although a great many individuals made essential contributions to the development of the personal computer, Microsoft BASIC was one of the key catalysts for the software and hardware innovations that made the PC revolution possible. After reading Tandy's report, it seemed clear to me that before the robotics industry could make the same kind of quantum leap that the PC industry made 30 years ago, it, too, needed to find that missing ingredient. So I asked him to assemble a small team that would work with people in the robotics field to create a set of programming tools that would provide the essential plumbing so that anybody interested in robots with even the most basic understanding of computer programming could easily write robotic applications that would work with different kinds of hardware. The goal was to see if it was possible to provide the same kind of common, low-level foundation for integrating hardware and software into robot designs that Microsoft BASIC provided for computer programmers. Tandy's robotics group has been able to draw on a number of advanced technologies developed by a team working under the direction of Craig Mundie, Microsoft's chief research and strategy officer. One such technology will help solve one of the most difficult problems facing robot designers: how to simultaneously handle all the data coming in from multiple sensors and send the appropriate commands to the robot's motors, a challenge known as concurrency. A conventional approach is to write a traditional, single-threaded program--a long loop that first reads all the data from the sensors, then processes this input and finally delivers output that determines the robot's behavior, before starting the loop all over again. The shortcomings are obvious: if your robot has fresh sensor data indicating that the machine is at the edge of a precipice, but the program is still at the bottom of the loop calculating trajectory and telling the wheels to turn faster based on previous sensor input, there is a good chance the robot will fall down the stairs before it can process the new information. Concurrency is a challenge that extends beyond robotics. Today as more and more applications are written for distributed networks of computers, programmers have struggled to figure out how to efficiently orchestrate code running on many different servers at the same time. And as computers with a single processor are replaced by machines with multiple processors and "multicore" processors--integrated circuits with two or more processors joined together for enhanced performance--software designers will need a new way to program desktop applications and operating systems. To fully exploit the power of processors working in parallel, the new software must deal with the problem of concurrency. One approach to handling concurrency is to write multi-threaded programs that allow data to travel along many paths. But as any developer who has written multithreaded code can tell you, this is one of the hardest tasks in programming. The answer that Craig's team has devised to the concurrency problem is something called the concurrency and coordination runtime (CCR). The CCR is a library of functions--sequences of software code that perform. specific tasks--that makes it easy to write multithreaded applications that can coordinate a number of simultaneous activities. Designed to help programmers take advantage of the power of multicore and multiprocessor systems, the CCR turns out to be ideal for robotics as well. By drawing on this library to write their programs, robot designers can dramatically reduce the chances that one of their creations will run into a wall because its software is too busy sending output to its wheels to read input from its sensors. In addition to tackling the problem of concurrency, the work that Craig's team has done will also simplify the writing of distributed robotic applications through a technology called decentralized software services (DSS). DSS enables developers to create applications in which the services--the parts of the program that read a sensor, say, or control a motor-- operate as separate processes that can be orchestrated in much the same way that text, images and information from several servers are aggregated on a Web page. Because DSS allows software components to run in isolation from one another, if an individual component of a robot fails, it can be shut down and restarted--or even replaced--without having to reboot the machine. Combined with broadband wireless technology, this architecture makes it easy to monitor and adjust a robot from a remote location using a Web browser. What is more, a DSS application controlling a robotic device does not have to reside entirely on the robot itself but can be distributed across more than one computer. As a result, the robot can be a relatively inexpensive device that delegates complex processing tasks to the high-performance hardware found on today's home PCs. I believe this advance will pave the way for an entirely new class of robots that are essentially mobile, wireless peripheral devices that tap into the power of desktop PCs to handle processing-intensive tasks such as visual recognition and navigation. And because these devices can be networked together, we can expect to see the emergence of groups of robots that can work in concert to achieve goals such as mapping the seafloor or planting crops. These technologies are a key part of Microsoft Robotics Studio, a new software development kit built by Tandy's team. Microsoft Robotics Studio also includes tools that make it easier to create robotic applications using a wide range of programming languages. One example is a simulation tool that lets robot builders test their applications in a three-dimensional virtual environment before trying them out in the real world. Our goal for this release is to create an affordable, open platform. that allows robot developers to readily integrate hardware and software into their designs. Should We Call Them Robots? How soon will robots become part of our day-to-day lives? According to the International Federation of Robotics, about two million personal robots were in use around the world in 2004, and another seven million will be installed by 2008. In South Korea the Ministry of Information and Communication hopes to put a robot in every home there by 2013. The Japanese Robot Association predicts that by 2025, the personal robot industry will be worth more than $50 billion a year worldwide, compared with about $5 billion today. As with the PC industry in the 1970s, it is impossible to predict exactly what applications will drive this new industry. It seems quite likely, however, that robots will play an important role in providing physical assistance and even companionship for the elderly. Robotic devices will probably help people with disabilities get around and extend the strength and endurance of soldiers, construction workers and medical professionals. Robots will maintain dangerous industrial machines, handle hazardous materials and monitor remote oil pipelines. They will enable health care workers to diagnose and treat patients who may be thousands of miles away, and they will be a central feature of security systems and search-and-rescue operations. Although a few of the robots of tomorrow may resemble the anthropomorphic devices seen in Star Wars, most will look nothing like the humanoid C-3PO. In fact, as mobile peripheral devices become more and more common, it may be increasingly difficult to say exactly what a robot is. Because the new machines will be so specialized and ubiquitous--and look so little like the two-legged automatons of science fiction--we probably will not even call them robots. But as these devices become affordable to consumers, they could have just as profound an impact on the way we work, communicate, learn and entertain ourselves as the PC has had over the past 30 years. 【转载】哈佛图书馆自习室墙上的训言
1.此刻打盹,你将做梦;而此刻学习,你将圆梦。 2.我荒废的今日,正是昨日殒身之人祈求的明日。 3.觉得为时已晚的时候,恰恰是最早的时候。 4.勿将今日之事拖到明日。 5.学习时的苦痛是暂时的,未学到的痛苦是终生的。 6.学习这件事,不是缺乏时间,而是缺乏努力。 7.幸福或许不排名次,但成功必排名次。 8.学习并不是人生的全部。但,既然连人生的一部分——学习也无法征服,还能做什么? 9.请享受无法回避的痛苦。 10.只有比别人更早、更勤奋地努力,才能尝到成功的滋味。 11.谁也不能随随便便成功,它来自彻底的自我管理和毅力。 12.时间在流逝。 13.现在淌的哈喇子,将成为明天的眼泪。 14.狗一样地学,绅士一样地玩。 15.今天不走,明天要跑。 16.投资未来的人是忠于现实的人。 17.教育程度代表收入。 18.一天过完,不会再来。 19.即使现在,对手也不停地翻动书页。 20.没有艰辛,便无所获。
http://emuch.net/bbs/viewthread.php?tid=692171&fpage=1
http://www.china-vision.net/blog/user1/218/archives/2007/1016.html
SIFT 后来有两种扩展,都用到PCA的概念。
1 PCA-SIFT
PCA-SIFT与标准SIFT有相同的亚像素位置(sub-pixel ),尺度(scale)和主方向(dominant orientations),但在第4步计算描述子的时候,它用特征点周围的41×41的像斑计算它的主元,并用PCA-SIFT将原来的2×39×39维的向量降成20维,以达到更精确的表示方式。
▲创建PCA-SIFT描述子的步骤:
1) 计算或者载入投影矩阵
2)检测关键点
3) 通过与投影矩阵相乘投影关键点周围的像斑
▲ PCA-SIFT 投影矩阵的产生
△ 选择一系列有代表性的图像并且检测这些图像的所有关键点
△ 对每一个关键点:
1〉 在它的周围选择一个大小为41×41象素的像斑
2〉 计算垂直和水平的梯度,形成一个大小为39×39×2=3042的矢量
3〉 将这些矢量放入一个k×3042大小的矩阵A,k是所检测的关键点数目。
4〉 计算矩阵A的协方差: A=A-mean A cov A =ATA
5〉 计算cov A 的特征值和特征矢量
6〉 选择前n个特征向量,投影矩阵是一个由这些特征向量组成的n×3042的矩阵
7〉 n可以是一个根据经验设置的固定值,也可以基于特征值动态选择。
8〉 投影矩阵只计算一次,并且存储
▲ 建立描述子
△ 输入: 在尺度空间关键点的位置和方向
△ 在关键点周围提取一个41×41的像斑于给定的尺度,旋转到它的主方向
△ 计算39×39水平和垂直的梯度,形成一个大小为3042的矢量
△ 用预先计算好的投影矩阵n×3042与此矢量相乘
△ 这样生成一个大小为n的PCA-SIFT描述子
▲SIFT和PCA-SIFT的比较
△ SIFT:
维数:128
缺点:维数高、不完全的仿射不变
优点:需要较少的经验主义知识,易于开发
△ PCA-SIFT:
维数:可变,推荐20或者更少
缺点:不完全的仿射不变;投影矩阵需要一系列有代表性的图像;这个矩阵只对这类图像起作用
优点:保留不变性的同时低维,大大减少了计算时间
2 GLOH (Gradient location-orientation histogram)
把原来SIFT中4×4棋盘格的location bins 改成仿射状的同心圆的17 location bins 来表示,并计算其中的梯度方向直方图(梯度方向分为16种),因此共16×17=272维,之后再作PCA将其降成128维,因此保有跟SIFT一样精简的表示方法。
研究生能力自我培养手册
1如果平时几乎没看过英文原文,读不懂怎么办?
其实我以前也根本没读过原文,也看不懂。这儿有个好办法:找一本中文经典的书籍,仅看某一节你感兴趣或与你相关的内容,然后先找一两篇英文的综述(review)认真阅读一下,不会的单词可用金山词霸查一查,也许你读第一篇文章需要花两天,你过两天再读第2遍时,你也许只要一天;然后你再读第2篇时也许你只要半天!然后你一定会真正发现读英文文献的快感!人家的文章分析真的透彻,内容丰富!当你需要重点研究时,一般先通览一下近期研究的文献的摘要,有选择的读几篇好文。 如果平时读得多了,自然会有感觉,找更高级别杂志的文章读。国外著名的科学家一般都有一个习惯,即每周都认真读1-2篇Science, Nature, Cell等高级别文章。这个习惯希望每个人都能保持!而且Science对中国人是免费的!Nature中也有许多内容是免费的,即使没有密码之类,也能得到大量有用的信息呀。
2 一个研究生导师的肺腑之言
作为你们的老师,我现在每周工作60小时,踏踏实实的60小时。阅读,实践,思考,讨论和请教,周而复始。其实这还不够用,因为我既要独立做这边自己的课题,还要协助各位完成你们的课题。那么对你们的要求降低一些,每周50小时吧。希望是真实而有效率的50小时,思维和四肢都处于激活状态的50小时。 大家千万不要认为这有什么不得了的,跟国外就不用比了,单就国内而言,北大、清华、中科院研究生的工作状态,比50小时有过之而无不及。不能否认我们学生的天赋,但我们的天赋大约不会比北大、清华、中科院或者Stanford, Harvard, UC Berkeley的学生高很多。一周工作40小时或更少,我们拿什么去竞争?上面说的比较抽象,那再给各位提出一个具体的问题请大家考虑: 现在你阅读一篇自己研究方向的英文文献,在字典帮助下,能否在3小时(研究生)或6小时(本科生)内完全读懂和理解? 现在你阅读一篇本领域的文献时,能否自然地联想起3篇以上相关的文献?如果您还做不到,那就还没有跨入研究的门槛,还需加油。
3 博士,30岁前的男人,需要完成的事
1,事业永远第一 虽然金钱不是万能的,但没有钱是万万不能的,虽然这句话很俗,但绝对有道理,所以30岁之前,请把你大部分精力放在你的事业上. 2,别把钱看得太重 不要抱怨自己现在工资低,银行存款4位数以下,看不到前途,现在要做的就是努力学习,即使你文凭再高,怎么把理论运用到实践还是需要一个很长的锻炼过程,社会永远是一所最博大的大学,它让你学到的知识远比你在学校学到的重要得多,所以同样,你也别太介意学历低.30岁之前靠自己能力买车买房的人还是极少. 3,学会体谅父母 别嫌他们唠叨,等你为人父了你就知道可怜天下父母心,在他们眼里你还是个孩子,但他们真的老了,现在得你哄他们开心了,也许只要你的一个电话,一点小礼物,就可以让他们安心,很容易做到. 4,交上好朋友 朋友对你一生都影响重大,不要去结识太多酒肉朋友,至少得有一个能在关键时刻帮助你的朋友,如果遇到这么一个人,就好好把握,日后必定有用,不管他现在是富还是穷. 5,别太相信爱情 心中要有爱,但请别说也别相信那些琼瑶阿姨小说里面的山盟海誓,世上本无永恒,重要的是责任,但女人心海底针,心变了,一切都成枉然,你要做的就是该出手时就出手,该放手时别犹豫.30岁之前的爱情不是假的,但只是大多数人都没有能真正把握好的能力,所以学会量力而行. 6,别担心至今还保留初吻 爱情不在多而在精,别以为自己20多岁还没碰过女孩子就害怕自己永远找不到老婆.以后你会有很多机会认识女孩子,要知道这个社会虽然男人多于女人,但现实是女人其实比男人更担心这个问题.男人30一枝花,你在升值而不是贬值,成熟的爱情往往更美丽更长久,所以不要像疯狗一样看到女孩就想追,学会品味寂寞. 7,不要沉迷于任何东西 所谓玩物而丧志,网络游戏是你在出校门之前玩的,你现在没有多余的时间和精力花费到这上面,否则你透支的东西以后都得偿还.一个人要有兴趣,爱好,但请分清楚轻重. 8,年轻没有失败 不要遇到挫折就灰心,年轻人要时刻保持积极向上的态度.失败了,重来过;失去了,再争取别的。错过了,要分析,下次来,要把握;幼稚了,下次,成熟点。不要紧,会好的,哪怕到了极点,也不要放弃,相信一定可以挺过去。不要消极,会好的。曾经的错,过去了,总不能回味在过去。现在的,很好,累完了,很舒服。不要伤,总会有人在支撑你。 9,不要轻易崇拜或者鄙视一个人 人都有偶像,但请拥有你自己的个性.不要刻意去模仿一个人,因为你就是你,是唯一的,独一无二的,要有自信.也不要全盘否定一个人,每个人是有价值的,如果你不能理解他,也请学会接受. 10,要有责任心. 不管你曾经怎样,但请从现在开始做一个正直的人.男人要有责任心,无论是工作还是生活上,一个有责任心的人才能让别人有安全感,才能让别人觉得你是一个值得信赖的人.我们不要懦弱,但请不要伤害爱你的人和你爱的人,尤其是善良的女孩,因为这个世界善良的女孩不多了,即使不想拥有,但也请让她保持她美丽的心. 11,男人的外貌并不重要. 不要为自己的长相身高而过分担心,一个心地善良,为人正直的男人远比那些空有英俊相貌,挺拔身材但内心龌龊的男人要帅得多.如果有人以貌取人,请不要太在意,因为你不用去为一个低级趣味的人而难过. 12,学会保护身体 不要以为现在抽烟喝酒,熬夜通宵也没什么事.那是因为你的身体正处于你一生的黄金时段.30岁以后你就能明白力不从心这个词的意义了,身体是革命的本钱,没有好的身体什么也做不了,所以要尽量让自己过有规律的健康生活. 13,别觉得一事无成. 你现在还没有资格谈成功,当然如果你有千万资产的除外.一开始太固定的职业并不一定是好事,或许在不断的改行当中,你会学到更丰富的知识,而且可以挖掘出自己的潜能,找到最适合你的工作. 14,请认真工作 即使你现在的工作再怎么无聊再怎么低级,也请你认真去对待,要知道任何成功人士都是从最小的事做起,或许你现在学不到多么了不起的知识,但起码你要学会良好的工作态度和工作方法,这对以后很重要. 15,请认真对待感情. 不要羡慕那些换女人像换鞋一样的花花公子,逢场作戏的爱情只是让你浪费时间浪费精力,一个人最痛苦的不是找不到爱人,而是心中没有了爱,当你把我爱你3个字变成你最容易说的一句话时,那么你在爱情的世界里已经很难找到真正的幸福了.爱情没有公平,总有一个人比对方付出得多,即使没有结果,也别觉得不值,因为你的付出不光是为了她,也是为了你自己的爱,为爱付出是很可贵的,赞自己一下. 16.请留一点童心 在内心深处,哪怕只是一个很小的角落里,请保持一份童心,不是幼稚,但有的时候单纯一点会让你很快乐.所以不要太计较得失,生活本无完美. 最后说一点,学会尊重别人,这样别人才会尊重你,所以上论坛看帖子请回个贴,这是美德,花不了你多少时间,哈哈,谢谢各位!
4 每天睡觉前坚持做三件事
1. 今天都干了些什么,那些与课题实验有关,用科学而简练的语言描述出来,记录下来,自认为失败的实验也要认真对待,并找出原因。
2. 想好并安排好明天要做的实验,千万不要到了明天再准备。
3. 前两件事做不好,不要睡觉。
就这样,坚持做,一定会进步很快的。
5 博士答辩过后的反思 我虽博士论文盲审和答辩均以全优通过,文章也发了不少(IF总和约20),但回头看,还是有很多不尽如意的地方,在此将个人经验与各位XDJM交流,望批评、鼓励和讨论。 1、要脚踏实地,但目标不能太低。“欲得其中,必求其上;欲得其上,必求上上”,口里可以说只求达到学校规定的最低标准就可以了,但心里一定不能限于此。 2、学会做人,做一个大家欢迎的人。这对于研究生来说非常重要,直接影响你是否有人愿与你合作,是否有人帮助你(包括提意见和建议,哪怕所提意见和建议不正确)。 3、寻求老板的支持很重要,毕业时的每一步都要老板签字和鉴定。多与老板沟通,尤其是老板心情不错时与他多沟通!如果他对你帮助不大,你也得多与他沟通,至少让他少从反方向对你施加作用力。 4、研究生与导师或许天生就是一对矛盾体。有时很难说谁对谁错,要多思考,自己判断导师的为人为学,或许师兄师姐告诉你的“悄悄话”带有他们自己的感情色彩。 5、如果有机会,一定争取在研究生期间出去参加一次学术会议;对于博士研究生,最好可以作一次会议的口头报告。也许参加会议不能提高你很多(或学不到任何学术知识),但对你多方面的能力都有很好的锻炼,你也可以结识一些相关领域的同行(前辈)。 6、要豁达。不要只愿意听好话,听恭维的话!研究生多听一些对你工作的批评意见有利于你后面的工作,虽然逆耳。 7、有的人是想从老板那里弄两条鱼走人,有的人是想用老板那里的网捕两条鱼走人,你最好借用老板的条件,学着织合适的网捕鱼。这很痛苦,但你毕业时的前途不一样。 8、如果你的老板很适合你,不要辜负他!如果你碰到的老板不如意,尽量不要抱怨,这无助于问题的解决。多沟通,多争取支持,争取多的支持,让老板对你有信心,看到你工作的意义。 9、如果你做的是新课题,迅速在你的具体研究方向(课题)崛起,尽快在该方向超越老板,这有利于你后面跟老板交流。如果你是博士生,毕业时在你的具体研究方向还不如你的老板,有点失败! 10、通过提高实力确立地位,不要学别人将心思花在请客、送礼、溜须拍马、打小报告上
再谈研究生的学习与研究 竹鼓励我“能详细一点就更加好了!”在此,我就本人攻读硕士、博士期间的想法及答辩感受再次尽量详细一点与诸位交流,请批评指正或讨论! 我个人觉得,研究生期间为人、为学确实要注意方式方法。 1、作为低年级研究生,你的师兄师姐(尤其是马上毕业,即将离开课题组的师兄师姐)是你不容错过的资源!无论他们的工作做得是不是特别出色,最好真诚地与他们交流、沟通,向他们请教,将他们掌握或领悟到的核心技术和关键步骤学到手,这非常重要!一般来说,由于毕业有诸如发表文章等硬性要求,实验室内部也存在隐形竞争,有的师兄师姐不大可能在平时将所掌握的东西(尤其是自己花很大精力摸索总结的东西)全部告诉你,也不可能毫无保留地向老板汇报,而这些恰好是你需要的。也许他们教你,只需一句话,指点一个实验步骤,但对你来说可以节约几个月的摸索时间。放下你的架子,不要以为你师兄师姐掌握的东西你很早就完全学会了,很可能他们留了一手!但实事求是的讲,师兄师姐本身没有教你的义务,他不是你的导师!如何学到手,看你的表现了!记住:这可能节省你大量的时间和精力。 2、对于研究来说,文献是你的生命之一!注意多看文献,多看高档次杂志的最新文献;即使你的学校或研究所没有某种资源,你也可以通过网络交流,文献传递等来获取你要的资料。文献是用来看(学习)的,不是用来收藏或向他人炫耀的,不要仅仅成为文献收藏家。而且要学会看文献,只有少数文献才需要精读或反复读,反复领会。 3、一口吃不成大胖子!将你要解决的难题分步骤逐渐解决。虽然全局很重要,但你可以将一个大问题分成多个小问题,各个击破。不要急于三下两下就解决而弄得自己焦躁不安,这无助于问题的解决,否则,研究生就不必几年才能毕业了。 4、每个人考虑问题的角度不同,留意同领域人员的意见(虽然他们的意见未必正确),他们(包括导师)“不经意”的一句话,综合你的思考,很可能对你解决问题很有帮助!留意你的导师对课题组其他成员的指导(包括“训斥”),在你的工作中加以利用或避免。 5、对于有一定基础(高年级)的研究生来说,文献在你看来不可能十全十美,带着审视的眼光去读文献,从中寻找你的方向和突破口,你可能做出比你说看文献更好的东西。 6、向你感兴趣的文献作者请教,或与他们交流!你注意到他们的成果本身就是对他们的尊重,不要担心自己是小字辈别人不理你。我曾给国外一大师级人物发电子邮件索要一篇较早的论文,他告诉我他也没有电子版,可以寄给我纸板论文,让我告诉他地址,最后真的很快就将论文寄给我了。 7、研究生第一年上课,第三年找工作、写毕业论文、答辩,很快就过去了,因此,做事一定要有计划,头脑要清楚,要主动!确定导师以后就该主动多与导师联系,多与课题组的师兄师姐联系,早着手准备,哪怕随便在网上浏览相关领域的新闻也好。不要总是等导师催你做什么,你才做什么,尤其是博士研究生! 8、当你很忙时,静下来想一想,究竟你是忙,还是“茫”或“盲”!无论如何,都要留时间思考和总结,投入很重要,但不要一味的埋头做实验! 9、做完实验,尽早处理结果,这对你后续实验设计非常重要!很多东西不是你想象的结果,要分析,调整实验方案,不要等到毕业再来处理,到时候有问题已经来不及了。 10、若有可能,在研究生期间尽早投一篇文章给好一点的杂志,即使不能发表,也会很有收获,因为好杂志往往会请相关领域的专家为你评审,会给出很详细的评审意见,这对你来说,是非常重要的指导! 11、当你的工作做得比较扎实以后,答辩就只是你展示的舞台了。因为所有在场的人中,你才是对论文中的工作最熟悉的“专家”。剩下的就是做好ppt了。 12、每个人都有一本难念的经!不要抱怨!无论遇到什么问题,导师、课题组成员、经费......正确处理,努力工作,与人为善,开心生活!
也谈研究生的学习与研究 我刚刚博士论文答辩不久,盲审专家和答辩委员会的评委们全都给出了“优秀”的成绩。在读期间SCI源刊上第一作者文章IF总和约20。自我认为仍需十分努力的学习他人经验,提高自己。在这里,作为即将毕业的研究生,谈谈个人体会: 1、高年级研究生(师兄师姐)是你的资源,看你如何挖!最好在他们离开前学到尽量多的核心技术,以及他们在相关领域的经验。师兄师姐本身没有义务教你,看你的表现了!这可能节省你大量的时间和经历。 2、注意多看文献,多看高档次杂志的最新文献;且要学会看文献! 3、将一个核心问题或较难的问题分部逐渐解决,不要急于三下两下就解决而弄得自己焦躁不安,这无助于问题的解决; 4、留意同行(包括导师)“不经意”的谈话,很可能对你有很好的启发! 5、从文献中寻找你的方向和突破口; 6、与你感兴趣的文献作者交流,向他们请教!不要担心别人不理你,其实这是对他们的尊重! 7、做事要有计划,头脑要清楚,要主动! 8、当你很忙时,静下来想一想,究竟你是忙,还是“茫”或“盲”! 6 研究生阶段必须明白的和必须做到的...
大家读研阶段就会发现,导师一般都很忙,尤其牛导师就更不用说了,但是千万别因为导师忙而耽误了学业,反而这是一个锻练的好机会,找到了自己独立的学习方法,在自己在科研的道路上早点独立,不要总是认为自己是研究生,大的科研问题不用考虑或者不敢去考虑,而应该把自己当成一个研究者来做科研.我认为研究生不需要导师过多的象以前上学一样事事都指导,即使指导,也只能是在一些方面提点见议,俗话说的好“师傅引入门,休行靠个人”,导师只要给你指一个大的方向,也就是他所做的课题的哪一部分让你做,其它的就全靠我们自己了。老师是必要的拐杖,但迟早要丢开的,丢开得越早越好! 我们作为研究生要明白几件事: 大 学 生 老师命题 老师知道答案 研 究 生 老师出题 老师不知道答案 博 士 后 老师不出题 老师不知道答案 ( 自己找方向 找方法找结果 ) 所以在研究生阶段(硕士或博士研究生),你的一种想法可能就是一种新的学术思想,要主动去倡导学术自由,百家争鸣,百花齐放,尽量发挥自己的潜能,而不是导师教你去做,如果一个导师总是什么事都给学生安排的井井有条,甚至在学术思想上都让学生按他的意志或想法来搞,那么他不是一个称职的导师。而这样的学生以后离开导师后能不能独立搞科研是很值得怀疑的。 所以我们在研究生阶段要做到: 1.不单纯是接受知识,而且要进行科研工作 2.要有明确的学习目的和追求目标 3.学术规范 4.青出于蓝而胜于蓝 更加具体的说就是:我们要理解培养单位关于研究生培养的一些规定,才能顺利毕业,拿到学位; 除了发表论文,要明白通过研究生阶段在做学问上提高了多少,学到了哪些知识和能力;对本学科、本领域的研究进展掌握得如何;是否真正掌握了从事科学研究的基本技能,包括开题、实验设计、分析方法和实验技能、写作方法和理论水平等;给研究组带来了什么,又留下了什么。 我们要明白并且有意识的去培养“四动”技能: 1.动脑;点子与idea 2.动手:掌握和熟练本领域的技术 3.动笔:科学性vs艺术性;多读书、多学习好的写作方法、;多注意好文章的文风 4.动口 :提问;口才好;讲演能力:风度,掌握要领、控制时间、深入浅出,多一些在学术会议上作报告的机会 通过以上的分析,我觉得无论你的导师忙不忙,牛不牛,我们都应该自己去把握,如果把自己没做好科研的责任全推到导师的头上,那是悲哀.下面我引用一位科学家的名言与各位虫友们共勉: “ 科学本身是人类的一种实践。科学研究是一个思考过程。科学行动则是推行某种思考过程的活动,其目的是为了检验这些思考过程的有效性,进而修正和改善这些思考过程,以期达到最高的认识。像一切科学实践一样,科学的判断力取决于个人的经验、信仰和情绪。我们中间的许多人,或者说我们全体,在我们的专业经历中,都犯过这样或那样的错误。科学工作者应当有虚怀若谷的精神,敢于摒弃先入之见,敢于摆脱对错误思想感情上的依附.” 7 如果让我重做一次研究生 在所里碰到刚从美国读完博士回来的同事,因为他们刚离开博士生的阶段,比较有一些自己较独特的想法,我就问他:「如果你讲这个问题,准备要贡献什么?」结合了他们的意见,共同酝酿了今天的演讲内容,因此这里面不全是我一个人的观点。虽然我的硕士论文和博士论文都出版了,但不表示我就是一个成功的研究生,因为我也总还有其它方面仍是懵懵懂懂。我的硕士论文是二十年前时报出版公司出版的,我的博士论文是英国剑桥大学出版的。你说有特别好吗?我不敢乱说。我今天只是综合一些经验,提供大家参考。 一、研究生与大学生的区别 首先跟大家说明一下研究生和大学生的区别。大学生基本上是来接受学问、接受知识的,然而不管是对于硕士时期或是博士时期的研究而言,都应该准备要开始制造新的知识,我们在美国得到博士学位时都会领到看不懂的毕业证书,在一个偶然的机会下,我问了一位懂拉丁文的人,上面的内容为何?他告诉我:「里头写的是恭喜你对人类的知识有所创新,因此授予你这个学位。」在中国原本并没有博硕士的学历,但是在西方他们原来的用意是,恭贺你已经对人类普遍的知识有所创新,这个创新或大或小,都是对于普遍的知识有所贡献。这个创新不会因为你做本土与否而有所不同,所以第一个我们必须要很用心、很深刻的思考,大学生和研究生是不同的。 (一)选择自己的问题取向,学会创新 你一旦是研究生,你就已经进入另一个阶段,不只是要完全乐在其中,更要从而接受各种有趣的知识,进入制造知识的阶段,也就是说你的论文应该有所创新。由接受知识到创造知识,是身为一个研究生最大的特色,不仅如此,还要体认自己不再是个容器,等着老师把某些东西倒在茶杯里,而是要开始逐步发展和开发自己。做为研究生不再是对于各种新奇的课照单全收,而是要重视问题取向的安排,就是在硕士或博士的阶段里面,所有的精力、所有修课以及读的书里面都应该要有一个关注的焦点,而不能像大学那般漫无目标。大学生时代是因为你要尽量开创自己接受任何东西,但是到了硕士生和博士生,有一个最终的目的,就是要完成论文,那篇论文是你个人所有武功的总集合,所以这时候必须要有个问题取向的学习。 (二)尝试跨领域研究,主动学习 提出一个重要的问题,跨越一个重要的领域,将决定你未来的成败。我也在台大和清华教了十几年的课,我常常跟学生讲,选对一个领域和选对一个问题是成败的关键,而你自己本身必须是带着问题来探究无限的学问世界,因为你不再像大学时代一样泛滥无所归。所以这段时间内,必须选定一个有兴趣与关注的主题为出发点,来探究这些知识,产生有机的循环。由于你是自发性的对这个问题产生好奇和兴趣,所以你的态度和大学部的学生是截然不同的,你慢慢从被动的接受者变成是一个主动的探索者,并学会悠游在这学术的领域。 我举一个例子,我们的中央研究院院长李远哲先生,得了诺贝尔奖。他曾经在中研院的周报写过几篇文章,在他的言论集里面,或许各位也可以看到,他反复提到他的故事。他是因为读了一个叫做马亨教授的教科书而去美国柏克莱大学念书,去了以后才发现,这个老师只给他一张支票,跟他说你要花钱你尽量用,但是从来不教他任何东西。可是隔壁那个教授,老师教很多,而且每天学生都是跟着老师学习。他有一次就跟那个老师抱怨:「那你为什么不教我点东西呢?」那个老师就说:「如果我知道结果,那我要你来这边念书做什么?我就是因为不知道,所以要我们共同探索一个问题、一个未知领域。」他说其实这两种教法都有用处,但是他自己从这个什么都不教他,永远碰到他只问他「有没有什么新发现」的老师身上,得到很大的成长。所以这两方面都各自蕴含深层的道理,没有所谓的好坏,但是最好的方式就是将这两个方式结合起来。我为什么讲这个故事呢?就是强调在这个阶段,学习是一种「 self-help 」,并且是在老师的引导下学习「 self-help 」,而不能再像大学时代般,都是纯粹用听的,这个阶段的学 习要基于对研究问题的好奇和兴趣,要带着一颗热忱的心来探索这个领域。 然而研究生另外一个重要的阶段就是 Learn how to learn ,不只是学习而已,而是学习如何学习,不再是要去买一件很漂亮的衣服,而是要学习拿起那一根针,学会绣出一件漂亮的衣服,慢慢学习把目标放在一个标准上,而这一个标准就是你将来要完成硕士或博士论文。如果你到西方一流的大学去读书,你会觉得我这一篇论文可能要和全世界做同一件问题的人相比较。我想即使在台湾也应该要有这样的心情,你的标准不能单单只是放在旁边几个人而已,而应该是要放在领域的普遍人里面。你这篇文章要有新的东西,才算达到的标准,也才符合到我们刚刚讲到那张拉丁文的博士证书上面所讲的,有所贡献与创新。 二、一个老师怎么训练研究生 第二个,身为老师你要怎么训练研究生。我认为人文科学和社会科学的训练,哪怕是自然科学的训练,到研究生阶段应该更像师徒制,所以来自个人和老师、个人和同侪间密切的互动和学习是非常重要的,跟大学部坐在那边单纯听课,听完就走人是不一样的,相较之下你的生活应该要和你所追求的知识与解答相结合,并且你往后的生活应该或多或少都和这个探索有相关。 (一)善用与老师的伙伴关系,不断 Research 我常说英文 research 这个字非常有意义, search 是寻找,而 research 是再寻找,所以每个人都要 research ,不断的一遍一遍再寻找,并进而使你的生活和学习成为一体。中国近代兵学大师蒋百里在他的兵学书中曾说:「生活条件要跟战斗条件一致,近代欧洲凡生活与战斗条件一致者强,凡生活与战斗条件不一致者弱。」我就是藉由这个来说明研究生的生活,你的生活条件与你的战斗条件要一致,你的生活是跟着老师与同学共同成长的,当中你所听到的每一句话,都可能带给你无限的启发。 回想当时我在美国念书的研究生生活,只要随便在楼梯口碰到任何一个人,他都有办法帮忙解答你语言上的困难,不管是英文、拉丁文、德文、希腊文等。所以能帮助解决问题的不单只是你的老师,还包括所有同学以及学习团体。你的学习是跟生活合在一起的。当我看到有学生呈现被动或是懈怠的时候,我就会用毛泽东的「革命不是请客吃饭!」来跟他讲:「作研究生不是请客吃饭。」
二)藉由大量阅读和老师提点,进入研究领域 怎样进入一个领域最好,我个人觉得只有两条路,其中一条就是让他不停的念书、不停的报告,这是进入一个陌生的领域最快,又最方便的方法,到最后不知不觉学生就会知道这个领域有些什么,我们在不停念书的时候常常可能会沉溺在细节里不能自拔,进而失去全景,导致见树不见林,或是被那几句英文困住,而忘记全局在讲什么。藉由学生的报告,老师可以讲述或是厘清其中的精华内容,经由老师几句提点,就会慢慢打通任督二脉,逐渐发展一种自发学习的能力,同时也知道碰到问题可以看哪些东西。就像是我在美国念书的时候,我修过一些我完全没有背景知识的国家的历史,所以我就不停的念书、不停的逼着自己吸收,而老师也只是不停的开书目,运用这样的方式慢慢训练,有一天我不再研究它时,我发现自己仍然有自我生产及蓄发的能力,因为我知道这个学问大概是什么样的轮廓,碰到问题也有能力可以去查询相关的资料。所以努力让自己的学习产生自发的延展性是很重要的。 (三)循序渐进地练习论文写作
到了硕士或博士最重要的一件事,是完成一篇学位论文,而不管是硕士或博士论文,其规模都远比你从小学以来所受的教育、所要写的东西都还要长得多,虽然我不知道教育方面的论文情况是如何,但是史学的论文都要写二、三十万字,不然就是十几二十万字。写这么大的一个篇幅,如何才能有条不紊、条理清楚,并把整体架构组织得通畅可读?首先,必须要从一千字、五千字、一万字循序渐进的训练,先从少的慢慢写成多的,而且要在很短的时间内训练到可以从一万字写到十万字。这么大规模的论文谁都写得出来,问题是写得好不好,因为这么大规模的写作,有这么许多的脚注,还要注意首尾相映,使论述一体成型,而不是散落一地的铜钱;是一间大礼堂,而不是一间小小分割的阁楼。为了完成一个大的、完整的、有机的架构模型,必须要从小规模的篇幅慢慢练习,这是一个最有效的办法。 因为受计算机的影响,我发现很多学生写文章能力都大幅下降。写论文时很重要的一点是,文笔一定要清楚,不要花俏、不必漂亮,「清楚」是最高指导原则,经过慢慢练习会使你的文笔跟思考产生一致的连贯性。我常跟学生讲不必写的花俏,不必展现你散文的才能,因为这是学术论文,所以关键在于要写得非常清楚,如果有好的文笔当然更棒,但那是可遇不可求的,文彩像个人的生命一样,英文叫 style. , style. 本身就像个人一样带有一点点天生。因此最重要的还是把内容陈述清楚,从一万字到最后十万字的东西,都要架构井然、论述清楚、文笔清晰。 我在念书的时候,有一位欧洲史、英国史的大师 Lawrence Stone ,他目前已经过世了,曾经有一本书访问十位最了不起的史学家,我记得他在访问中说了一句非常吸引人注意的话,他说他英文文笔相当好,所以他一辈子没有被退过稿。因此文笔清楚或是文笔好,对于将来文章可被接受的程度有举足轻重的地位。内容非常重要,有好的表达工具更是具有加分的作用,但是这里不是讲究漂亮的 style. ,而是论述清楚。
(一)尝试接受挑战,勇于克服 研究生如何训练自己?就是每天、每周或每个月给自己一个挑战,要每隔一段时间就给自己一个挑战,挑战一个你做不到的东西,你不一定要求自己每次都能顺利克服那个挑战,但是要努力去尝试。我在我求学的生涯中,碰到太多聪明但却一无所成的人,因为他们很容易困在自己的障碍里面,举例来说,我在普林斯顿大学碰到一个很聪明的人,他就是没办法克服他给自己的挑战,他就总是东看西看,虽然我也有这个毛病,可是我会定期给我自己一个挑战,例如:我会告诉自己,在某一个期限内,无论如何一定要把这三行字改掉,或是这个礼拜一定要把这篇草稿写完,虽然我仍然常常写不完,但是有这个挑战跟没这个挑战是不一样的,因为我挑战三次总会完成一次,完成一次就够了,就足以表示克服了自己,如果觉得每一个礼拜的挑战,可行性太低,可以把时间延长为一个月的挑战,去挑战原来的你,不一定能做到的事情。不过也要切记,硕士生是刚开始进入这一个领域的新手,如果一开始问题太小,或是问题大到不能控制,都会造成以后研究的困难。 (二)论文的写作是个训练过程,不能苛求完成精典之作 各位要记得我以前的老师所说的一句话:「硕士跟博士是一个训练的过程,硕士跟博士不是写经典之作的过程。」我看过很多人,包括我的亲戚朋友们,他之所以没有办法好好的完成硕士论文,或是博士论文,就是因为他把它当成在写经典之作的过程,虽然事实上,很多人一生最好的作品就是硕士论文或博士论文,因为之后的时间很难再有三年或六年的时间,沉浸在一个主题里反复的耕耘,当你做教授的时候,像我今天被行政缠身,你不再有充裕的时间好好探究一个问题,尤其做教授还要指导学生、上课,因此非常的忙碌,所以他一生最集中又精华的时间,当然就是他写博士、或是硕士论文的时候,而那一本成为他一生中最重要的著作也就一点都不奇怪了。 不一定要刻意强求,要有这是一个训练过程的信念,应该清楚知道从哪里开始,也要知道从哪里放手,不要无限的追下去。当然我不是否认这个过程的重要性,只是要调整自己的心态,把论文的完成当成一个目标,不要成为是一种的心理障碍或是心理负担。这方面有太多的例子了,我在普林斯顿大学念书的时候,那边旧书摊有一位非常博学多文的旧书店老板,我常常赞叹的对他说:「你为什么不要在大学做教授。」他说:「因为那篇博士论文没有写完。」原因在于他把那个博士论文当成要写一本经典,那当然永远写不完。如果真能写成经典那是最好,就像美丽新境界那部电影的男主角 John Nash 一样,一生最大的贡献就是博士那二十几页的论文,不过切记不要把那个当作是目标,因为那是自然而然形成的,应该要坚定的告诉自己,所要完成的是一份结构严谨、论述清楚与言之有物的论文,不要一开始就期待它是经典之作。如果你期待它是经典之作,你可能会变成我所看到的那位旧书摊的老板,至于我为什么知道他有那么多学问,是因为那时候我在找一本书,但它并没有在旧书店里面,不过他告诉我:「还有很多本都跟他不相上下。」后来我对那个领域稍稍懂了之后,证明确实如他所建议的那般。一个旧书店的老板精熟每一本书,可是他就是永远无法完成,他梦幻般的学位论文,因为他不知道要在哪里放手,这一切都只成为空谈。 (三)论文的正式写作 1. 学习有所取舍 到了写论文的时候,要能取也要能舍,因为现在信息爆炸,可以看的书太多,所以一定要建构一个属于自己的知识树,首先,要有一棵自己的知识树,才能在那棵树挂相关的东西,但千万不要不断的挂不相关的东西,而且要慢慢的舍掉一些挂不上去的东西,再随着你的问题跟关心的领域,让这棵知识树有主干和枝叶。然而这棵知识树要如何形成?第一步你必须对所关心的领域中,有用的书籍或是数据非常熟悉。 2. 形成你的知识树 我昨天还请教林毓生院士,他今年已经七十几岁了,我告诉他我今天要来作演讲,就问他:「你如果讲这个题目你要怎么讲?」他说:「只有一点,就是那重要的五、六本书要读好几遍。」因为林毓生先生是海耶克,还有几位近代思想大师在芝加哥大学的学生,他们受的训练中很重要的一部份是精读原典。这句话很有道理,虽然你不可能只读那几本重要的书,但是那五、六本书将逐渐形成你知识树的主干,此后的东西要挂在上面,都可以参照这一个架构,然后把不相干的东西暂放一边。生也有涯,知也无涯,你不可能读遍天下所有的好书,所以要学习取舍,了解自己无法看遍所有有兴趣的书,而且一但看遍所有有兴趣的书,很可能就会落得普林斯顿街上的那位旧书店的老板一般,因为阅读太多不是自己所关心的领域的知识,它对于你来说只是一地的散钱。
3. 掌握工具 在这个阶段一定要掌握语文与合适的工具。要有一个外语可以非常流畅的阅读,要有另外一个语文至少可以看得懂文章的标题,能学更多当然更好,但是至少要有一个语文,不管是英文、日文、法文 …… 等,一定要有一个语文能够非常流畅的阅读相关书籍,这是起码的前提。一旦这个工具没有了,你的视野就会因此大受限制,因为语文就如同是一扇天窗,没有这个天窗你这房间就封闭住了。为什么你要看得懂标题?因为这样才不会有重要的文章而你不知道,如果你连标题都看不懂,你就不知道如何找人来帮你或是自己查相关的数据。其它的工具,不管是统计或是其它的任何工具,你也一定要多掌握,因为你将来没有时间再把这样的工具学会。 4. 突破学科间的界线 应该要把跨学科的学习当作是一件很重要的事,但是跨学科涉及到的东西必须要对你这棵知识树有帮助,要学会到别的领域稍微偷打几枪,到别的领域去摄取一些概念,对于本身关心的问题产生另一种不同的启发,可是不要泛滥无所归。为什么要去偷打那几枪?近几十年来,人们发现不管是科学或人文,最有创新的部份是发生在学科交会的地方。为什么会如此?因为我们现在的所有学科大部分都在西方十九世纪形成的,而中国再把它转借过来。十九世纪形成这些知识学科的划分的时候,很多都带有那个时代的思想跟学术背景,比如说,中研院的李院长的专长就是物理化学,他之所以得诺贝尔奖就是他在物理和化学的交界处做工作。像诺贝尔经济奖,这二十年来所颁的奖,如果在传统的经济学奖来看就是旁门走道,古典经济学岂会有这些东西,甚至心理学家也得诺贝尔经济奖,连John Nash 这位数学家也得诺贝尔经济奖,为什么?因为他们都在学科的交界上,学科跟学科、平台跟平台的交界之处有所突破。在平台本身、在学科原本最核心的地方已经 search 太多次了,因此不一定能有很大的创新,所以为什么跨领域学习是一件很重要的事情。 常常一篇硕士论文或博士论文最重要、最关键的,是那一个统摄性的重要概念,而通常你在本学科里面抓不到,是因为你已经泡在这个学科里面太久了,你已经拿着手电筒在这个小仓库里面照来照去照太久了,而忘了还有别的东西可以更好解释你这些材料的现象,不过这些东西可遇而不可求。 John Nash 这一位数学家为什么会得诺贝尔数学奖?为什么他在赛局理论的博士论文,会在数十年之后得诺贝尔经济奖?因为他在大学时代上经济学导论的课,所以他认为数学可以用在经济方面来思考,而这个东西在一开始,他也没有想到会有这么大的用处。他是在数学和经济学的知识交界之处做突破。有时候在经济学这一个部分没有大关系,在数学的这一个部分也没有大关系,不过两个加在一起,火花就会蹦出来。
5. 论文题目要有延展性 对一个硕士生或博士生来说,如果选错了题目,就是失败,题目选对了,还有百分之七十胜利的机会。这个问题值得研一、博一的学生好好思考。你的第一年其实就是要花在这上面,你要不断的跟老师商量寻找一个有意义、有延展性的问题,而且不要太难。我在国科会当过人文处长,当我离开的时候,每次就有七千件申请案,就有一万四千个袋子,就要送给一万四千个教授审查。我当然不可能看那么多,可是我有个重要的任务,就是要看申诉。有些申诉者认为:「我的研究计划很好,我的著作很好,所以我来申诉。」申诉通过的大概只有百分之十,那么我的责任就是在百分之九十未通过的案子正式判决前,再拿来看一看。有几个印象最深常常被拿出来讨论的,就是这个题目不必再做了、这个题目本身没有发展性,所以使我更加确认选对一个有意义、有延展性、可控制、可以经营的题目是非常重要的。 我的学生常常选非常难的题目,我说你千万不要这样,因为没有人会仔细去看你研究的困难度,对于难的题目你要花更多的时间阅读史料,才能得到一点点东西;要挤很多东西,才能筛选出一点点内容,所以你最好选择一个难易适中的题目。 我写过好几本书,我认为我对每一本书的花的心力都是一样,虽然我写任何东西我都不满意,但是在过程中我都绞尽脑汁希望把他写好。目前为止很多人认为我最好的书,是我二十几岁刚到史语所那一年所写的那本书。我在那本书花的时间并不长,那本书的大部分的稿子,是我和许添明老师同时在当兵的军营里面写的,而且还是用我以前旧的笔记写的。大陆这些年有许多出版社,反复要求出版我以前的书,尤其是这一本,我说:「不行。」因为我用的是我以前的读书笔记,我怕引文有错字,因为在军队营区里面随时都要出操、随时就要集合,手边又没有书,怎么可能好好的去核对呢?而如果要我重新校正一遍,又因为引用太多书,实在没有力气校正。 为什么举这个例子呢?我后来想一想,那本书之所以比较好,可能是因为那个题目可延展性大,那个题目波澜起伏的可能性大。很多人都认为,我最好的书应该是剑桥大学出的那一本,不过我认为我最好的书一定是用中文写的,因为这个语文我能掌握,英文我没办法掌握得出神入化。读、写任何语文一定要练习到你能带着三分随意,那时候你才可以说对于这一个语文完全理解与精熟,如果你还无法达到三分的随意,就表示你还在摸索。 回到我刚刚讲的,其实每一本书、每一篇论文我都很想把它写好。但是有些东西没办法写好,为什么?因为一开始选择的题目不够好。因此唯有选定题目以后,你的所有训练跟努力才有价值。我在这里建议大家,选题的工作要尽早做,所选的题目所要处理的材料最好要集中,不要太分散,因为硕士生可能只有三年、博士生可能只有五年,如果你的材料太不集中,读书或看数据可能就要花掉你大部分的时间,让你没有余力思考。而且这个题目要适合你的性向,如果你不会统计学或讨厌数字,但却选了一个全都要靠统计的论文,那是不可能做得好。 6. 养成遵照学术格式的写作习惯 另一个最基本的训练,就是平时不管你写一万字、三万字、五万字都要养成遵照学术规范的习惯,要让他自然天成,就是说你论文的脚注、格式,在一开始进入研究生的阶段就要培养成为你生命中的一个部份,如果这个习惯没有养成,人家就会觉得这个论文不严谨,之后修改也要花很多时间,因为你的论文规模很大,可能几百页,如果一开始弄错了,后来再重头改到尾,一定很耗时费力,因此要在一开始就养成习惯,因为我们是在写论文而不是在写散文,哪一个逗点应该在哪里、哪一个书名号该在哪里、哪一个地方要用引号、哪一个要什么标点符号,都有一定的规定,用中文写还好,用英文有一大堆简称。在 1960 年代台湾知识还很封闭的时候,有一个人从美国回来就说:「美国有个不得了的情形,因为有一个人非常不得了。」有人问他为什么不得了,他说:「因为这个人的作品到处被引用。」他的名字就叫 ibid 。所谓 ibid 就是同前作者,这个字是从拉丁文发展出来的,拉丁文有一大堆简称,像 et. al. 就是两人共同编的。英文有一本 The Chicago Manual of Style. 就是专门说明这一些写作规范。各位要尽早学会中英文的写作规范,慢慢练习,最后随性下笔,就能写出符合规范的文章。 7. 善用图书馆 图书馆应该是研究生阶段最重要的地方,不必读每一本书,可是要知道有哪些书。我记得我做学生时,新进的书都会放在图书馆的墙上,而身为学生最重要的事情,就是要把书名看一看。在某些程度上知道书皮就够了,但是这仍和打计算机是不一样的,你要实际上熟悉一下那本书,摸一下,看一眼目录。我知道现在从计算机就可以查到书名,可是我还是非常珍惜这种定期去 browse 新到的书的感觉,或去看看相关领域的书长成什么样子。中研院有一位院士是哈佛大学信息教授,他告诉我他在创造力最高峰的时候,每个礼拜都到他们信息系图书室里,翻阅重要的信息期刊。所以图书馆应该是身为研究生的人们,最熟悉的地方。不过切记不重要的不要花时间去看,你们生活在信息泛滥的时代,跟我生长在信息贫乏的时代是不同的,所以生长在这一个时代的你,要能有所取舍。我常常看我的学生引用一些三流的论文,却引得津津有味,我都替他感到难过,因为我强调要读有用、有价值的东西。 8. 留下时间,精致思考 还要记得给自己保留一些思考的时间。一篇论文能不能出神入化、能不能引人入胜,很重要的是在现象之上作概念性的思考,但我不是说一定要走理论的路线,而是提醒大家要在一般的层次再提升两三步, conceptualize 你所看到的东西。真切去了解,你所看到的东西是什么?整体意义是什么?整体的轮廓是什么?千万不要被枝节淹没,虽然枝节是你最重要的开始,但是你一天总也要留一些时间好好思考、慢慢沉淀。 conceptualize 是一种非常难教的东西,我记得我念书时,有位老师信誓旦旦说要开一门课,教学生如何 conceptualize ,可是从来都没开成,因为这非常难教。我要提醒的是,在被很多材料和枝节淹没的时候,要适时跳出来想一想,所看到的东西有哪些意义?这个意义有没有广泛连结到更大层面的知识价值。 傅斯年先生来到台湾以后,同时担任中央研究院历史语言研究所的所长及台大的校长。台大有个傅钟每小时钟声有二十一响、敲二十一次。以前有一个人,写了一本书叫《钟声二十一响》,当时很轰动。他当时对这二十一响解释是说:因为台大的学生都很好,所以二十一响是欢迎国家元首二十一响的礼炮。不久前我发现台大在每一个重要的古迹下面竖一个铜牌,我仔细看看傅钟下的解释,才知道原来是因为傅斯年当台大校长的时候,曾经说过一句话:「人一天只有二十一个小时,另外三小时是要思考的。」所以才叫二十一响。我觉得这句话大有道理,可是我觉得三小时可能太多,因为研究生是非常忙的,但至少每天要留个三十分钟、一小时思考,想一想你看到了什么?学习跳到比你所看到的东西更高一点的层次去思考。 9. 找到学习的楷模 我刚到美国念书的时候,每次写报告头皮就重的不得了,因为我们的英文报告三、四十页,一个学期有四门课的话就有一百六十页,可是你连脚注都要从头学习。后来我找到一个好办法,就是我每次要写的时候,把一篇我最喜欢的论文放在旁边,虽然他写的题目跟我写的都没关系,不过我每次都看他如何写,看看他的注脚、读几行,然后我就开始写。就像最有名的男高音 Pavarotti 唱歌剧的时候都会捏着一条手帕,因为他说:「上舞台就像下地狱,太紧张了。」他为了克服紧张,他有习惯性的动作,就是捏着白手帕。我想当年那一篇论文抽印本就像是我的白手帕一样,能让我开始好好写这篇报告,我学习它里面如何思考、如何构思、如何照顾全体、如何用英文作脚注。好好的把一位大师的作品读完,开始模仿和学习他,是入门最好的方法,逐步的,你也开始写出自己的东西。我也常常鼓励我的学生,出国半年或是一年到国外看看。像现在国科会有各式各样的机会,可以增长眼界,可以知道现在的餐馆正在卖些什么菜,回来后自己要作菜也才知道要如何着手。
最后还有一点很重要的,就是我们的人生是两只脚,我们不是靠一只脚走路。做研究生的时代,固然应该把所有的心思都放在学业上,探索你所要探索的那些问题,可是那只是你的一只脚,另外还有一只脚是要学习培养一、两种兴趣。很多人后来会发现他的右脚特别肥重(包括我自己在内),也就是因为忘了培养左脚。很多很有名的大学者最后都陷入极度的精神困扰之中,就是因为他只是培养他的右脚,他忘了培养他的左脚,他忘了人生用两只脚走路,他少了一个小小的兴趣或嗜好,用来好好的调解或是排遣自己。 去年夏天,香港《亚洲周刊》要访问我,我说:「我不想接受访问,我不是重要的人。」可是后来他们还是把一个简单的对话刊出来了,里面我只记得讲了一段话:做一个研究生或一个学者,有两个感觉最重要 -- 责任感与罪恶感。你一定要有很大的责任感,去写出好的东西,如果责任感还不够强,还要有一个罪恶感,你会觉得如果今天没有好好做几个小时的工作的话,会有很大的罪恶感。除非是了不得的天才,不然即使爱因斯坦也是需要很努力的。很多很了不得的人,他只是把所有的努力集中在一百页里面,他花了一千小时和另外一个人只花了十个小时,相对于来说,当然是那花一千个小时所写出来的文章较好。所以为什么说要赶快选定题目?因为如果太晚选定一个题目,只有一年的时间可以好好耕耘那个题目,早点选定可以有二、三年耕耘那个题目,是三年做出的东西好,还是一年的东西好?如果我们的才智都一样的话,将三年的努力与思考都灌在上面,当然比一年还要好。 五、营造卓越的大学,分享学术的氛围 现在很多人都在讨论,何谓卓越的大学?我认为一个好的大学,学校生活的一大部份,以及校园的许多活动,直接或间接都与学问有关,同学在咖啡厅里面谈论的,直接或间接也都会是学术相关的议题。教授们在餐厅里面吃饭,谈的是「有没有新的发现」?或是哪个人那天演讲到底讲了什么重要的想法?一定是沉浸在这种氛围中的大学,才有可能成为卓越大学。那种交换思想学识、那种互相教育的气氛不是花钱就有办法获得的。我知道钱固然重要,但不是唯一的东西。一个卓越的大学、一个好的大学、一个好的学习环境,表示里面有一个共同关心的焦点,如果没有的话,这个学校就不可能成为好的大学。
自:http://my.emuch.net/space-267249-do-blog-id-41942.html
OpenCV 图像处理常用函数
怎么访问图像元素 (坐标起点相对于图像原点 image origin 从 0 开始,或者是左上角 (img->origin=IPL_ORIGIN_TL) 或者是左下角 (img->origin=IPL_ORIGIN_BL)
假设有 8-bit 1-通道的图像 I (IplImage* img): I(x,y) ~ ((uchar*)(img->imageData + img->widthStep*y))[x]
假设有 8-bit 3-通道的图像 I (IplImage* img): I(x,y)blue ~ ((uchar*)(img->imageData + img->widthStep*y))[x*3] I(x,y)green ~ ((uchar*)(img->imageData + img->widthStep*y))[x*3+1] I(x,y)red ~ ((uchar*)(img->imageData + img->widthStep*y))[x*3+2]
如果增加点 (100,100) 的亮度 30 ,那么可以: CvPoint pt = {100,100}; ((uchar*)(img->imageData + img->widthStep*pt.y))[pt.x*3] += 30; ((uchar*)(img->imageData + img->widthStep*pt.y))[pt.x*3+1] += 30; ((uchar*)(img->imageData + img->widthStep*pt.y))[pt.x*3+2] += 30;
或者更有效的 CvPoint pt = {100,100}; uchar* temp_ptr = &((uchar*)(img->imageData + img->widthStep*pt.y))[x*3]; temp_ptr[0] += 30; temp_ptr[1] += 30; temp_ptr[2] += 30;
假设有 32-bit 浮点数, 1-通道 图像 I (IplImage* img): I(x,y) ~ ((float*)(img->imageData + img->widthStep*y))[x]
现在,通用方法:假设有 N-通道,类型为 T 的图像: I(x,y)c ~ ((T*)(img->imageData + img->widthStep*y))[x*N + c] 或者你可使用宏 CV_IMAGE_ELEM( image_header, elemtype, y, x_Nc ) I(x,y)c ~ CV_IMAGE_ELEM( img, T, y, x*N + c )
也有针对各种图像(包括 4-通道)和矩阵的函数(cvGet2D, cvSet2D), 但是它们都很慢. --------------------------------------------------------------------------------
如何访问矩阵元素? 方法是类似的 (都是针对 0 起点的列和行)
设有 32-bit 浮点数的实数矩阵 M (CvMat* mat): M(i,j) ~ ((float*)(mat->data.ptr + mat->step*i))[j]
设有 64-bit 浮点数的复数矩阵 M (CvMat* mat): Re M(i,j) ~ ((double*)(mat->data.ptr + mat->step*i))[j*2] Im M(i,j) ~ ((double*)(mat->data.ptr + mat->step*i))[j*2+1]
设有单通道矩阵,有宏 CV_MAT_ELEM( matrix, elemtype, row, col ), 例如对 32-bit 浮点数的实数矩阵 M(i,j) ~ CV_MAT_ELEM( mat, float, i, j ), 假如初始化 3x3 单位阵: CV_MAT_ELEM( mat, float, 0, 0 ) = 1.f; CV_MAT_ELEM( mat, float, 0, 1 ) = 0.f; CV_MAT_ELEM( mat, float, 0, 2 ) = 0.f; CV_MAT_ELEM( mat, float, 1, 0 ) = 0.f; CV_MAT_ELEM( mat, float, 1, 1 ) = 1.f; CV_MAT_ELEM( mat, float, 1, 2 ) = 0.f; CV_MAT_ELEM( mat, float, 2, 0 ) = 0.f; CV_MAT_ELEM( mat, float, 2, 1 ) = 0.f; CV_MAT_ELEM( mat, float, 2, 2 ) = 1.f;
--------------------------------------------------------------------------------
如何在 OpenCV 中处理我自己的数据 设你有 300x200 32-bit 浮点数 image/array, 也就是对一个有 60000 个元素的数组.
int cols = 300, rows = 200; float* myarr = new float[rows*cols];
// step 1) initializing CvMat header CvMat mat = cvMat( rows, cols, CV_32FC1, // 32-bit floating-point, single channel type myarr // user data pointer (no data is copied) ); // step 2) using cv functions, e.g. calculating l2 (Frobenius) norm double norm = cvNorm( &mat, 0, CV_L2 );
... delete myarr;
其它情况在参考手册中有描述.见 cvCreateMatHeader, cvInitMatHeader, cvCreateImageHeader, cvSetData etc. --------------------------------------------------------------------------------
如何加载和显示图像 /* usage: prog <image_name> */ #include "cv.h" #include "highgui.h"
int main( int argc, char** argv ) { IplImage* img; if( argc == 2 && (img = cvLoadImage( argv[1], 1)) != 0 ) { cvNamedWindow( "Image view", 1 ); cvShowImage( "Image view", img ); cvWaitKey(0); // very important, contains event processing loop inside cvDestroyWindow( "Image view" ); cvReleaseImage( &img ); return 0; } return -1; }
void cvLaplace (IplImage* src, IplImage* dst, int apertureSize=3); void cvSobel (IplImage* src, IplImage* dst, int dx, int dy, int apertureSize=3); void cvCanny (IplImage* img, IplImage* edges, double lowThresh, double highThresh, int apertureSize=3);
void cvPreCornerDetect (IplImage* img, IplImage* corners, Int apertureSize); void cvCornerEigenValsAndVecs (IplImage* img, IplImage* eigenvv, int blockSize, int apertureSize=3); void cvCornerMinEigenVal (IplImage* img, IplImage* eigenvv, int blockSize, int apertureSize=3); voidcvGoodFeaturesToTrack(IplImage* image, IplImage* eigImage, IplImage* tempImage, CvPoint2D32f* corners, int* cornerCount, double qualityLevel,double minDistance); //对已经粗检测出的角点进行亚像素精准定位 void cvFindCornerSubPix (IplImage* img, CvPoint2D32f* corners, int count,CvSize win, CvSize zeroZone, CvTermCriteria criteria);
//金字塔分解与重构 void cvPyrDown (IplImage* src, IplImage* dst, IplFilter filter=IPL_GAUSSIAN_5x5); void cvPyrUp (IplImage* src, IplImage* dst, IplFilter filter=IPL_GAUSSIAN_5x5);
void cvThreshold (IplImage* src, IplImage* dst, float thresh, float maxvalue,CvThreshType type);
void cvProject3D ( CvPoint3D32f* points3D, int count, CvPoint2D32f* points2D,int xindx, int yindx);
void cvFindFundamentalMatrix (int* points1, int* points2, int numpoints, int method, CvMatrix3* matrix);
//很好用的平滑函数 void cvSmooth( const CvArr* src, CvArr* dst,int smoothtype=CV_GAUSSIAN,int param1=3, int param2=0, double param3=0 ); CV_BLUR_NO_SCALE CV_BLUR CV_GAUSSIAN CV_MEDIAN CV_BILATERAL
其他辅助函数: void cvPutText( CvArr* img, const char* text, CvPoint org, const CvFont* font, CvScalar color );
cvCvtColor(image, gray, CV_BGR2GRAY);//彩色图像灰度化
cvCvtPlaneToPix( planes[0], planes[1], planes[2], 0, currentimage); cvSplit(colorimage,plane[0],plane[1],plane[2],0); | |
http://www.xici.net/b3213/d51234728.htm
一 目录
1计算机应用研究
2现代通信
3火力与指挥控制
4系统仿真学报
5宇航学报
6导弹与航天运载技术
7小型微型计算机系统
8计算机仿真
9自动化学报
10微计算机信息
11继电器
12电网技术
13传感器技术
14西北农林科技大学学报
15现代雷达
16中国雷达
17电子质量
18机械科学与技术
19核电子与探测技术
20数据采集与处理
21系统工程与电子技术
22电波科学学报
23通信学报
24中国电机工程学报
25高校化工学报
26传感技术学报
27计算机工程与应用
28农机化研究
29湖南大学学报(自然科学版)
30计算机应用
31哈尔滨工业大学学报
32数学年刊
33计算机工程
34现代法学
35微型机与应用
36计算机科学
37计算机安全
38计算机与现代化
39微机发展或《计算机技术与发展》
40系统工程的理论与实践
41网络安全技术与应用
42计算机工程与设计
43情报理论与实践
44海南大学学报
45计算机应用系统
46电脑信息与技术
47电子与信息学报
48华北电力大学学报
49华北电力技术
50电力建设
二详细情况
1【杂志名称】计算机应用研究 成都
【杂志文章包含专业】建模,仿真,网络,人工智能,比较杂。
【投稿联系方式】http://www.arocmag.com/
【投稿费用】250元/页
【杂志级别】国家一级期刊,全国中文核心期刊
【稿酬回报】无
【投稿感受】录用率始终保持在60%以上,如果有牛基金支持的话几乎不审稿,半个月内有消息。整体感觉就是太贵,不包括增刊,想上增刊,交钱就行(250元/页)。无审稿费,2~3月就知道结果了!编辑态度差!
【其他】可以网上投稿
2【杂志名称】现代通信
【杂志级别】非核心
【投稿费用】无须审稿费,也无须版面费
【稿酬回报】有稿费,一般150-200元左右
【投稿感受】想赚点小钱的话可以发发啊!呵呵
3【杂志名称】火力与指挥控制
【杂志文章包含专业】武器装备方面建模,仿真,评估等。主要针对军工方面文章。
【投稿联系方式】hlyz@chinajournal.net.cn
【投稿费用】版面费600元,审稿费50元。如果稿件质量高,免版面费。
【杂志级别】中文核心期刊,科技论文统计源期刊。
【稿酬回报】有,但不多,百十来元吧。
【投稿感受】录用率较高,70%左右,审稿周期2个月,发表周期1年左右。编辑态度较好。
【其他】如果忙着毕业,或评职称,可以投。
4【杂志名称】系统仿真学报
【杂志文章包含专业】建模,仿真,计算机技术,网络,评估等。内容较杂。
【投稿联系方式】www.china-simulation.com
【投稿费用】版面费1200元左右,审稿费150元(中文)。
【杂志级别】中文核心期刊,EI统计源期刊。
【稿酬回报】有,但不多,百十来元吧。
【投稿感受】录用率不高,20%左右,审稿周期2个月,发表周期1.3年左右。编辑态度较好。论文要求有仿真结果。
【其他】2005年,论文被EI检索率90%以上。
5【杂志名称】宇航学报
【杂志文章包含专业】飞行理论、航天飞行器系统、导弹系统、空气动力学、测量与信息传输、制导与控制、飞行器能源、遥感飞行器设计与制造、惯性技术、推进技术、计算机应用、材料与工艺、发射工程、结构强度、目标与环境、计量与测试、质量与可靠性等。
【投稿联系方式】yhxbbjb@263.net
【投稿费用】审稿费80元,版面费1100左右
【杂志级别】核心期刊,06年为EI检索期刊
【稿酬回报】较少
【投稿感受】要求电子稿和打印稿投送,审稿2~3个月,录用率为10%左右、感觉投稿有难度。
6【杂志名称】导弹与航天运载技术
【杂志文章包含专业】主要报道中国导弹与火箭系统及分系统技术及与其相关的学术研究论文与报告,并适当报道国际航天领域的热点、最新成果及新动态。设有综述与述评、专家论坛、运载器总体及分系统技术、论文与报告、研究简报、高科技窗口、国外进展、热点漫谈、简讯等栏目。
【投稿联系方式】edit@calt.com
【投稿费用】无审稿费80元,版面费500左右,优秀的文章免收版面费。
【杂志级别】核心期刊
【稿酬回报】有,约150
【投稿感受】可电子投稿,审稿2个月,录用率为50%左右。总的感觉难度不大。
【其他】编辑部态度不错。
7【杂志名称】小型微型计算机系统
【杂志文章包含专业】发表我国计算机领域的科学研究、工程设计及应用、高等教育等方面的学术论文,并介绍国外先进计算机理论和技术。主要栏目有计算机硬件、软件、网络、多媒体等技术的研究、开发、应用。
【投稿联系方式】xwjxt@sict.ac.cn
【投稿费用】审稿费100元,版面费1000左右
【杂志级别】核心期刊,EI检索。
【稿酬回报】有
【投稿感受】先投打印稿投送,初审通过再投电子稿。审稿2~3个月,录用率为20%左右,难度中。
【其他】编辑部态度不错。
8【杂志名称】计算机仿真
【杂志文章包含专业】仿真理论,仿真工程应用,计算机技术,建模技术等。内容较杂。
【投稿联系方式】kwcoltd@public.bta.net.cn
【投稿费用】审稿费100元,版面费250/页。
【杂志级别】中国核心期刊。
【稿酬回报】有,但不多。
【投稿感受】电子投稿。审稿1~2个月,录用率为70%左右。较容易,基本上有仿真结果就能发表。
【其他】编辑部态度不错。计算机仿真,好像交钱就能发,最好要求加速审稿,交200
9【杂志名称】自动化学报
【杂志文章包含专业】自动化技术,计算机技术等。
【投稿联系方式】
【投稿费用】审稿费150元
【杂志级别】国家一级期刊,中文核心期刊。
【稿酬回报】有
【投稿感受】网上投稿。审稿2~4个月,录用率为20%左右。
【其他】编辑部态度不错。
10【杂志名称】微计算机信息
【杂志文章包含专业】自动化为主,计算机其余方向少量。
【投稿联系方式】http://www.autocontrol.com.cn//magazine
【投稿费用】$850(有基金支持),+$300(不确定,无基金支持)
【杂志级别】北大2004核心,少部分单位不承认。
【稿酬回报】无
【投稿感受】投稿极容易接受,录用通知时间短、发表大概10个月,最好写自动化和计算机结合的。
【其他】我连续投过四年,开始还不错,后来感觉乱来。现在要评正高,再也不投了。
11【杂志名称】继电器
【杂志文章包含专业】电力系统及相关专业
【投稿联系方式】网址:http://www.dlwg.net/repress/
邮箱:relay@powerkingdom.com
【投稿费用】无审稿费。原无版面费,2006年开始收取,每页400元
【杂志级别】中文核心
【稿酬回报】200-300元
【投稿感受】审稿时间一般在2个月内。发稿周期6-9个月。
【其他】可电子投稿
12【杂志名称】电网技术
【杂志文章包含专业】电网调度与运行、特高压输电、电力系统、电力自动化电力市场、输配电技术、高电压技术、电网建设、电力通信与电力信息化、电能质量(谐波治理)、新能源与分布式发电、节能(节能新技术)、经验交流、重大项目
【投稿联系方式】网址:http://www.dwjs.com.cn
dwjs@epri.ac.cn
【投稿费用】无审稿费。好论文原无版面费,
【杂志级别】全国中文核心期刊、Ei收录核心期刊
【稿酬回报】
【投稿感受】审稿时间一般在3个月内。发稿周期6-9个月。
【其他】一般电子投稿,基金项目好发表,
13【杂志名称】传感器技术
【杂志文章包含专业】主要是关于传感器原理和应用方面
【投稿联系方式】sensor@mail.sensor-tech.com.cn
【投稿费用】无审稿费。论文原版面费200-300元/页,
【杂志级别】全国中文核心期刊
【稿酬回报】200元
【投稿感受】审稿时间一般在6个月内。发稿周期9-12个月。主要方向对路就好发表
【其他】可以电子投稿
14【杂志名称】西北农林科技大学学报
【杂志文章包含专业】农学,林学,动物医学,水利等
【投稿联系方式】http://www.nwsuaf.edu.cn/
【投稿费用】800-1000
【杂志级别】中文核心期刊,中国科技论文统计源期刊
【稿酬回报】有
【投稿感受】一审,审稿速度模糊,你得自己打电话问,问急问缓不好掌握,有时编辑就一句话----你那个退稿了,花100元连审稿意见都看不了.
【其他】网上投稿,审稿费100元,版面费
15【杂志名称】现代雷达
【杂志文章包含专业】雷达系统;通信工程;导航定位;水中探测技术及设备;各种光电系统;与雷达配套的信息接收、传输技术及设备;工业军用计算机;信号处理;天线;传感器;各种电源以及其它各种与雷达相关的元器件、检测设备及材料等等。
【投稿联系方式】modernradar@263.net
【投稿费用】1200元(2006开始)
【杂志级别】中文核心期刊
【稿酬回报】200~300元左右
【投稿感受】3月内回复
16【杂志名称】中国雷达
【杂志文章包含专业】军事电子系统工程、民用电子系统工程、军事电子系统装备、民用电子系统装备、电子战、通信、导航、计算机、电子元部件等领域
【投稿联系方式】http://www.cra.org.cn
【投稿费用】无
【杂志级别】非核心
【稿酬回报】200左右
【投稿感受】投稿容易,只要有一些工作量,就很容易录用,审稿周期1~2个月,发表出来只需要半年左右
【其他】如果需要文章的数量,或是初投稿需要练手的话,<中国雷达>是不错的选择
17【杂志名称】电子质量
【杂志文章包含专业】可靠性、质量,计算机方向有:软件可靠性、系统可靠性、软件测评等。
【投稿联系方式】http://www.gsiic.com.cn/index/Article_Print.asp?ArticleID=11497
【投稿费用】无
【杂志级别】非核心,号称电子学会可靠性分会权威刊物。
【稿酬回报】约200元
【投稿感受】一定要和其杂志方向对上号。我写工业软件方向的两次退稿。
【其他】虽不是核心,但倒给钱,这可不多见,感觉比很多核心杂志还实在。
18【杂志名称】机械科学与技术
【杂志文章包含专业】理论研究设计计算机构分析工艺.设备.材料实验研究 CAD/CAM/CAE
【投稿联系方式】mst@nwpu.edu.cn
【投稿费用】审稿费100,版面费每页约200-250,图片另收费(好像是10/张)
【杂志级别】中文核心期刊中国科技论文统计源期刊 EI源
【稿酬回报】按字数不同,大约每页不到50
【投稿感受】只要有新意,比较容易投中,本人投了几篇,保持全中。只是发表周期有些长(从投到发1-1.5年),
【其他】以前该刊在机械行业比较牛,但这两年有点下滑。不知是太牛了没和EI搞好关系,还是咋得,近两年一直没被收录,在唯EI是瞻的今天大大影响了吸引力。但在许多老教授心中其魅力依旧,所以可以投。 此外,该刊态度可以。
19【杂志名称】核电子与探测技术
【杂志文章包含专业】主要包括核技术、电子类等
【投稿联系方式】北京8800信箱,100020
【投稿费用】每页140元,要想提前发表需每页再多交几十元,不收审稿费
【杂志级别】核心(EI收录)
【稿酬回报】200元左右
【投稿感受】投稿录用率很高,一般一两个月就可以知道是否录用,很少作修改,EI收录的概率很高,如果为了发表EI收录的,可以向该刊物投稿。
20【杂志名称】数据采集与处理
【杂志文章包含专业】主要涉及信号处理、通信、数据采集等内容
【投稿联系方式】南京御道街29号,210016
【投稿费用】每页160元,审稿费100元
【杂志级别】核心,EI收录
【稿酬回报】200元左右
【投稿感受】投稿时可以在寄两份打印费时同时寄出审稿费100元,以加快审稿速度,审稿很认真,不管是否录用都回寄审稿意见,只要文章有些创新就可以录用,审稿周期在三个月左右。
【其他】很多重点大学都很认可该刊物,在它还不是核心期刊时,就得到西安交大等学校的公认,是核心类期刊中比较正规、稿件质量较高的刊物之一。
21【杂志名称】系统工程与电子技术
【杂志文章包含专业】计算机应用、电路设计、电子、信息、信号处理、模型仿真等
【投稿联系方式】edcam@fudan.edu.cn北京142信箱32分箱,100854
【投稿费用】版面费600元,审稿费100元
【杂志级别】核心,EI page-one检索
【稿酬回报】100-200元
【投稿感受】1投稿录用率较高,是电子信息类投稿较容易的期刊之一,发表周期在6-10个月。2催缴审稿费很快,交钱后8个月了没有动静,总说审稿意见还没有返回
【其他】编辑部态度不错,就是不干实事。
22【杂志名称】电波科学学报
【杂志文章包含专业】电磁场、电波传播、电子信息类等
【投稿联系方式】河南省新乡138信箱3分箱,453003,
电子信箱:xuebao@public.xxptt.ha.cn
【投稿费用】审稿费200元,版面费我还没交,不能确定
【杂志级别】核心,EI核心收录
【稿酬回报】
【投稿感受】直接投电子稿到投稿信箱,对论文的格式要求较严格,在格式不符合要求时,编辑部会给你一份稿件要求的格式及所需材料说明等,审稿周期在三个月左右。
【其他】编辑部态度很好。
23【杂志名称】通信学报
【杂志文章包含专业】主要在通信领域,信号处理和网络均可
【投稿联系方式】http://www.telecomsci.com.cn/txxb/default.asp
【投稿费用】
【杂志级别】国家一级期刊,全国中文核心期刊,据说与EI闹翻,故未被EI索引
【稿酬回报】
【投稿感受】审稿时间超长,严格3审,大约搞了8个月
【其他】
24【杂志名称】中国电机工程学报
【杂志文章包含专业】主要报道电机工程领域的新理论、新方法、新技术、新成果。
【投稿联系方式】http://www.dwjs.com.cn
【投稿费用】500元/页
【杂志级别】国家一级期刊,全国中文核心期刊
【稿酬回报】有
【投稿感受】据说录用率始终保持在18%以下。但是投稿审稿很快,2~3月就知道结果了!编辑态度很好!
【其他】可以网上投稿
25【杂志名称】高校化工学报
【杂志文章包含专业】化工、环境等。
【投稿联系方式】http://www.arocmag.com/
【投稿费用】版面费不知
【杂志级别】国家一级期刊,EI核心
【稿酬回报】不知
【投稿感受】录用率低,编辑部工作效率低下,态度差
【其他】可以网上投稿
26【杂志名称】传感技术学报
【杂志文章包含专业】传感器、自动检测、电子学等
【投稿联系方式】可Email投稿:dzcg-bjb(AT)seu.edu.cn
【投稿费用】无审稿费,版面费500
【杂志级别】EI Compendex
【稿酬回报】80
【投稿感受】我投过几次,都中了,编辑态度很好。录用快(1个月左右),发表快(6~8个月)。在EI收录的期刊中,无论是收费和态度来说,我认为都是相当好的。
【其他】Email投稿的同时要寄一份有全部作者签名和单位公章的打印稿。
27【杂志名称】计算机工程与应用
【杂志文章包含专业】主要栏目:博士论坛学术探讨产品、研发、测试网络、通信与安全数据库与信息处理工程与应用。
【投稿联系方式】http://www.ceaj.org/可在线投
【投稿费用】先交审稿费70元,审稿费70,版面费1000-1200,贵
【杂志级别】核心期刊
【稿酬回报】有稿费,不到100
【投稿感受】审稿速度慢,一般3个月,快的有2个月的,慢的到了4个月。可在线投稿,比较好中。想投的时候是月刊,等我有idea的时候是半月刊,等我完稿后居然是旬刊了。谁知道过2个月会不会变成周报。见刊周期半年-一年半。
【其他】可以网上投稿,编辑部态度不错
28【杂志名称】农机化研究
【杂志文章包含专业】主要栏目:农业发展新视点、农机化工程、农业机械理论与设计制造农业机械试验研究计算机与信息技术在农业机械中的应用。
【投稿联系方式】njhyj@vip.sohu.com;njhyj(AT)vip.0451.com
【投稿费用】无审稿费,版面费280/页
【杂志级别】核心期刊
【稿酬回报】无
【投稿感受】审稿周期比较短,一般一个月以内,投稿容易,一般一投即中.
【其他】编辑部态度不错
29【杂志名称】湖南大学学报(自然科学版)
【杂志文章包含专业】生物技术、化学化工、材料科学与工程、机械工程、电气工程、土木工程、数理科学、计算机科学和管理。
【投稿联系方式】邮寄投稿,打印稿一式两份
【投稿费用】审稿费50,版面费200/页
【杂志级别】核心,EI Compendex来源期刊
【稿酬回报】100
【投稿感受】审稿周期较长,EI收录率高,主要收本校文章,但外校也接受,感觉还好发.
【其他】编辑部态度一般
30【杂志名称】计算机应用
【杂志文章包含专业】计算机应用技术
【投稿联系方式】可在线投,www.computerapplications.com.cn
【投稿费用】审稿费是¥50。约200元/页(投稿6个版面,版面费1257元,不知道怎么算的)
【杂志级别】中文核心期刊,中国科技论文统计源期刊
【稿酬回报】有
【投稿感受】三审,审稿速度较快,二~三个月就有结果,半年可发表,编辑态度不错,回复也很及时.中的情况类似于楼上计算机工程,文章质量老实说,还可以,感觉编辑比较严谨
【其他】网上投稿,审稿费50元,版面费不便宜(无基金)
31【杂志名称】哈尔滨工业大学学报
【杂志文章包含专业】综合性自然科学学术类期刊:机械、能源、动力、材料、电气、电子、信息与控制、计算机、化工、生物工程、建筑、交通、管理、数学、物理、工程力学及有关交叉性学科
【投稿联系方式】邮寄投稿,打印稿一式3份
【投稿费用】审稿费(100元)待论文录用后与发表费一同收取.版面费150/页
【杂志级别】核心,EI Compendex来源期刊
【稿酬回报】100
【投稿感受】审稿周期3个月,EI收录率高,主要收本校文章,选择地发表校外及海外作者省部级以上基金课题的优秀论文.
【其他】编辑部态度好
32【杂志名称】数学年刊
【杂志文章包含专业】基础数学方面
【投稿联系方式】edcam@fudan.edu.cn
【投稿费用】无
【杂志级别】核心期刊
【稿酬回报】无
【投稿感受】有一定难度,审稿周期不超过半年,发表一年左右(从投稿起算)
【其他】编辑部态度非常好,很负责
33【杂志名称】计算机工程
【杂志文章包含专业】人工智能及模式识别、软件技术与数据库、多媒体技术与应用、网络与通信、安全技术等
【投稿联系方式】hdsce@china.com,http://www.ecice06.com/
【投稿费用】审稿费70元
【杂志级别】中文核心EI page-one检索
【稿酬回报】不清楚
【投稿感受】2个月就有审稿结果,发表一年左右(可以加急发表)最大的有点就是审稿快,一般一个半月就能收到消息,两个月内肯定能收到消息。版面费一般800-900,稿费100。有基金号或者项目编号等的文章录用机率较高。
【其他】编辑部态度不错。
34【杂志名称】现代法学
【杂志文章包含专业】法学
【投稿联系方式】edcam@fudan.edu.cn
【投稿费用】无
【杂志级别】核心期刊
【稿酬回报】30元/1000字
【投稿感受】3月内回复
【其他】编辑部态度不错。
35【杂志名称】微型机与应用
【杂志文章包含专业】编辑部于2006年1月起对《微型机与应用》的办刊模式及刊载内容进行较大调整,不再单纯刊登技术研究论文。
【投稿联系方式】稿件需到www.aetnet.com.cn《电子技术应用》月刊参加审稿。可在线投
【投稿费用】不要审稿费不要版面费
【杂志级别】
【稿酬回报】
【投稿感受】审稿速度一般,2个月,不好中。每期收录文章非常有限(据说发稿费200左右,现在可能变了),中不中要看运气,当然特别牛的文章除外。
【其他】
36【杂志名称】计算机科学
【杂志级别】中文核心
【投稿联系方式】邮寄打印稿2份和电子版软盘一张;
【投稿费用】无审稿费
【投稿感受】文章质量还可以。。部分学校曾经把它当权威?
37【杂志名称】计算机安全
【杂志级别】非核心
【投稿联系方式】投稿信箱nsc-editor(AT)163.com
【投稿费用】无审稿费,版面费800元(牛的不要钱)。
【投稿感受】好中,两周给消息。
38【杂志名称】计算机与现代化
【杂志级别】非核心
【投稿联系方式】Email投稿(牛的不要钱)。投稿信箱:jgsdd@163.com,两周给消息
【投稿费用】无审稿费
【投稿感受】好中。
39【杂志名称】微机发展改成了《计算机技术与发展》。
【投稿联系方式】wjfz@sninfo.gov.cn或wjfz@163.com
【杂志级别】非核心
【投稿费用】600-700
【投稿感受】比较好中,2-3周给消息,一般能中,不过也有拒的。
40【杂志名称】系统工程的理论与实践
【投稿联系方式】网上投稿附加打印稿http://www.sysengi.com/
【杂志级别】一级学报 EI page one
【投稿费用】审稿80,每页150
【稿酬回报】
【投稿感受】审稿慢,编辑态度一般
41【杂志名称】网络安全技术与应用
【投稿联系方式】email投稿cpsp(AT)nstap.com.cn;www.nstap.com.cn
【杂志级别】非核心
【投稿费用】无审稿费,版面费800-1200元左右;
【投稿感受】无稿费;给钱就发
42【杂志名称】计算机工程与设计
【杂志级别】中文核心期刊中国科技论文统计源期刊
【投稿联系方式】在线网站http://www.china-ced.com/default.aspx投稿,较为正规
【投稿费用】审稿费:100元
【投稿感受】服务态度:一般,有同学投中过,审稿时间较长。比较青睐有基金号或者项目编号等的文章。审稿周期:三个月发表周期:一年左右(可以加急发表)
43【杂志名称】情报理论与实践
【杂志级别】情报学核心期刊
【投稿联系方式】邮寄打印稿或电子投稿。
【投稿费用】无需审稿费
【投稿感受】审稿周期:一个月,发表周期:6个月到一年不等。服务态度:一般(e-mail反馈很快),录用稿件的比率比较高,一般都是通过书面通知告之。
44【杂志名称】海南大学学报
【杂志级别】
【投稿联系方式】邮寄打印稿或电子投稿
【投稿费用】无需审稿费
【投稿感受】审稿周期:两个月发表周期:不定服务态度:较好学报的质量都还可以,本校学生中稿的几率大一点。
47【杂志名称】电子与信息学报 机器人和自动化领域国际权威杂志 IEEE机器人与自动化(IEEE Transactions on Robotics and Automation) Machine Learning Journal of Machine learning research Data Mining and Knowledge Discovery IEEE-KDE IEEE-PAMI Pattern Recognition Artificial Intelligence Journal of Artificial Intelligence Research Computational Intelligence Neural Computation IEEE-NN 机器人学相关网站
Department of Automatic Control and Systems Engineering at the University of Sheffield http://www2.shef.ac.uk/uni/academic/A-C/acse/ 谢非而德大学自动控制与系统工程系网站,主要研究方向包括:机器视觉与信号处理,空间仪器,并行处理,机器人与工业自动化,生物医学系统。 The major research themes within the Department of Automatic Control and Systems Engineering at the University of Sheffield are: Machine Vision and Signal Processing, Space Instrumentation, Parallel Processing, Robotics and Industrial Automation, and Biomedical Systems. The site contains a short description of the department and information about staff, and available courses. There are descriptions of research groups and also lists of publications. Robotics Internet Resources Page http://www-robotics.cs.umass.edu/robotics.html 机器人学INTERNET资源网站,由麻省大学感知机器人实验室主办包括机器人相关的各种资源网站的链接。 The Robotics Internet Resources Page is maintained by the laboratory for perceptual robotics at the University of Massachusetts, Amherst. The page contains pointers to robotics-related information from various sources on the Internet and includes a listing of resources based on geographical location, robotic software, and a list of over 40 robot demos (MPEG), showing robots in action. Robot Simulators on the Net http://cswww.essex.ac.uk/Research/tuuv/simulators.html 机器人模拟网站,由埃塞克斯大学计算机科学系主办,提供机器人模拟相关网页的连接及相关出版物与会议网站的连接。 Robot Simulations on the Net is maintained by the Computer Science Department at Essex University. The site includes descriptions of robot simulation web pages and links to them. Related publications and conference sites are also described. Some of the links are independent sites. Robotics and Automation Group at the University of Newcastle http://www.ncl.ac.uk/robotics.automation/ 英国纽卡斯尔大学机器人与自动化研究组,他属于电气与电子工程系,研究方向为:工业自动化,建筑自动化与虚拟现实。该网站提供其研究项目。 Newcastle University Robotics and Automation Group is based in the UK. It is part of the University's Department of Electrical and Electronic Engineering. It specialises in industrial automation, building and construction automation and virtual reality. The site includes descriptions of research projects. Laboratory for Molecular Robotics at the University of Southern California http://lipari.usc.edu/~lmr/ 南加州大学分子机器人实验室网站,该实验室帮助生产新型毫微米材料与设备,网站提供相关出版物及一些论文的全文,实验室当前的研究项目等。 The Laboratory for Molecular Robotics is based in California, USA. It aims to produce new materials and devices at a nanometer scale, by direct interaction with atomic structures, by precisely positioning atoms and molecules. The site includes a list of publications with links to some full text papers. There is a brief description of research which is currently being undertaken. Links to related sites are provided. Robosoft http://www.robosoft.fr/ 法国服务机器人网站,提供产品描述与说明书目录。 Robosoft is based in France. It specialises in service robotics. The site includes an on-line catalogue with descriptions and specifications of products. There are descriptions of used products which are available for sale. Service robots, such as automated vacuum cleaners and surveillance robots are described and specifications are given. A technical support section allows questions on a variety of topics to be submitted. A recruitment section is provided. Computer Vision Homepage at Carnegie Mellon University http://www.cs.cmu.edu/afs/cs/project/cil/www/txtvision.html 卡内基梅龙大学计算机视觉主页:提供有关计算机视觉和图象处理的 网络资源链接 The computer vision homepage at the Carnegie Mellon School of Computer Science is a collection of links to resources relevant to computer vision and image processing. It includes sections on research groups, test images (with pointers to a number of databases containing a total of over 5000 images), on-line publications (with links to searchable bibliographies), conference information, pointers to archives and related links. Journal of Artificial Intelligence Research http://www.cs.washington.edu/research/jair/home.html 人工智能研究杂志:可得到HTML文摘和POSTSCRIPT全文 The Journal of Artificial Intelligence Research is a refereed journal for scientific papers covering all areas of Artificial Intelligence, including automated reasoning, cognitive modelling, knowledge representation, learning, natural language, perception and robotics. In addition to the web version, each complete volume of JAIR is published in print by Morgan Kaufmann. The Abstracts are made available in html, and the full text of articles in PostScript. Abstracts of papers are posted to the Usenet newsgroup comp.ai.jair.announce and PostScript. articles are posted to comp.ai.jair.papers. Explanations are given in the 'JAIR: Some Frequently Asked Questions' file on how to how to receive copies of papers by email. Computer Vision Conferences http://iris.usc.edu/Information/Iris-Conferences.html 计算机视觉会议:南加利福尼亚大学计算机视觉组会议列表 A listing of vision conferences produced by the Computer Vision Group at the University of Southern California. The list includes on-line calls for papers, programmes, and registration information. The summary table for each year has a list of many conferences, but many more are listed in the full schedules, especially the workshops associated with larger conferences. Meeting information is moved to the Archive almost monthly. JPL Robotics http://robotics.jpl.nasa.gov/ JPL机器人:由美国国家宇航局支持,提供流浪者和远程机器人计划概况以及当前的研究信息。 JPL Robotics researchers perform. development, integration, and demonstration of innovative robotics and automation technologies, supporting National Aeronautics and Space Administration (NASA) missions and addressing other problems. This site gives an overview of the Rover and Telerobotics Program, plus information about current research (MFEX: Microrover Flight Experiment, Long Range Science Rover, Aerobot Planetary Balloon, RAMS: Robot Assisted Micro Surgery, Dshell/DARTS: Spacecraft Dynamics Simulator, Ranger Dexterous Arm Control, UGV: Unmanned Ground Vehicle, RSI: Remote Surface Inspection). Also included are NASA Tech Briefs, and details on completed research tasks in robotics. Berkeley Robotics and Intelligent Machines Lab at the University of California, Berkeley http://robotics.eecs.berkeley.edu/ 加利福尼亚大学伯克利机器人与只能机械实验室:提供详细的实验室研究信息,包括实验室人员的论文全文。 The objective of the Intelligent Machines and Robotics Lab is to give machines the ability to interact intelligently with the external physical world. As well as information about the Laboratory and detailed information about its research areas, this web site has the full text of many articles and papers written by the Lab's staff, plus software and other executables developed and used at the UC Berkeley Robotics Laboratory. Areas of current research include Medical Robotics, Control of Hybrid Systems, Motion Planning With Nonholonomic Velocity Constraints, etc. Demos and movies are available. Mobile Robotics (etc.) Bibliography http://www.cim.mcgill.ca/~dudek/mobile/mobilebib.html 运动机器人目录:由McGill大学移动机器人实验室主办,提供与移动机器人相关的数据库和书目链接。 This site represents the gateway to the Mobile Robotics bibliography at the McGill University Autonomous Mobile Robotics Laboratory. The search engine accesses a database which includes a bibliography on mobile robotics as well as an associated set of bibliographies. The database includes references to papers on mobile robotics in addition to some relevant aspects of computer vision and neural networks, such as computational stereo and range data analysis. Robotics Research Laboratory at the University of Southern California http://www-robotics.usc.edu/ 南加利福尼亚大学机器人研究实验室网站。 The University of Southern California Robotics Research Laboratory site contains details of the Lab's current and former projects, the personnel involved, and information on the robots involved. In addition, lists of full-text publications are included, divided into the following areas: theses; distributed robotics (multi-robot control); autonomous robotics (single-robot control); robot/agent learning; neural networks; dynamic manipulation and trajectory formation; and design for assembly (DFA). Contact information and links to sites of related interests are given. Robotics Institute at Carnegie Mellon University http://www.ri.cmu.edu/ 卡内基梅龙大学机器人学院,提供学院的研究信息包括:高级制造,机器人 学习,为电子机械系统,移动机器人,快速制造,机器人教育,机器人传感器等。 The CMU Robotics Institute site provides details on the Institute, its research laboratories (including advanced mechatronics, robot learning, manipulation, microelectromechanical systems (MEMS), mobile robots, rapid manufacturing, robotics education, robotics sensor-based planning, and shape deposition) and centres (Center for Integrated Manufacturing Decision Systems; Field Robotics Center; Medical Robotics and Computer Assisted Surgery; Vision and Autonomous Systems Center; and Robotics Engineering Consortium). In addition, the site offers over 50 postscript. files of technical reports, PhDs and Annual Reports, together with details of projects and personnel. Mobile Robot Laboratory at the College of Computing at Georgia Institute of Technology http://www.cc.gatech.edu/aimosaic/robot-lab/ 桥治亚技术学院运动机器人实验室网站。提供30多种全文出版物和实验室研制的机器人软件MissionLab。 The Mobile Robot Laboratory server provides information on the faculty and students and laboratory facilities, together with research projects, which include multi-agent robotic systems, ecological robotics, mobile manipulation, and learning and adaptation in autonomous robotic systems. In addition, the Laboratory produces the MissionLab software, which takes high-level military-style. plans and executes them with teams of real or simulated robotic vehicles. It supports the execution of multiple robots in simulation and includes device drivers for controlling multiple Denning and Nomadics Technologies robots. MissionLab 2.0 is an unsupported source code release of MisionLab and may be freely downloaded. There are also over 30 full-text publications, including a PhD Thesis on A Design Methodology for the Configuration of Behaviour-Based Robots. Artificial Intelligence Laboratory at Massachusetts Institute of Technology http://www.ai.mit.edu/ 麻省技术学院人工智能实验室,提供详细的实验室研究项目包括:计算机视觉;运动机器人;微机器人;有腿机器人;人造肌肉;触接口;视觉和触觉指导操作;机器手;可训练组件视觉系统,人知系统。提供部分全文。 This site gives information about the laboratory and details of the research projects : computer vision; mobile robotics; microrobotics; humanoid robotics (The Cog Shop); legged robots; artificial muscle; haptic interfaces; vision and touch guided manipulation; robot hands; trainable modular vision system, and cognitive robotics. Some full-text papers are available. In addition, these papers are included in the AI Lab's publication database, a searchable database of all the Lab's publications. A subset of on-line only papers is also searchable
RANSAC方法是一种鲁棒性的参数估计方法。它的基本思想是,首先根据具体问题设计出某种目标函数,然后通过反复提取最小点集估计该函数中参数的初始值,利用这些初始参数值把所有的数据分为所谓的“内点”(Inliers,即满足估计参数的点)和“外点”(Outliers,即不满足估计参数的点),最后反过来用所有的“内点”重新计算和估计函数的参数。
RANSAC方法和传统的优化方法的区别在于:传统的方法先把全部的数据点作为内点而计算出初始参数值,然后重新计算并统计内点和外点;而RANSAC最开始是利用部分数据作为内点得到初始值,然后寻找数据集中所有别的内点。由于RANSAC方法在图像匹配中获得了成功应用...
|