3月 202013
 

Your ads will be inserted here by

Easy AdSense.

Please go to the plugin admin page to
Paste your ad code OR
Suppress this ad slot.

相关资源:

1、人脸识别的各种算法:http://www.face-rec.org/algorithms/

例:

Image-Based Face Recognition Algorithms

PCA|ICA|LDA|EP|EBGM|Kernel Methods|Trace Transform

AAM|3-D Morphable Model|3-D Face Recognition

Bayesian Framework|SVM|HMM|Boosting & Ensemble

Algorithms Comparisons

Your ads will be inserted here by

Easy AdSense.

Please go to the plugin admin page to
Paste your ad code OR
Suppress this ad slot.

2、特征脸

Eigenfaces Group – Algorithmics

http://www.clear.rice.edu/elec301/Projects99/faces/algo.html

wiki

http://zh.wikipedia.org/wiki/%E7%89%B9%E5%BE%81%E8%84%B8

Seeing With OpenCV, Part 4: Face Recognition With Eigenface

http://www.cognotics.com/opencv/servo_2007_series/part_4/index.html

Seeing With OpenCV, Part 5: Implementing Eigenface

http://www.cognotics.com/opencv/servo_2007_series/part_5/index.html

3月 202013
 

Your ads will be inserted here by

Easy AdSense.

Please go to the plugin admin page to
Paste your ad code OR
Suppress this ad slot.

先上代码

参考

http://www.opencv.org.cn/index.php/%E8%AF%BB%E8%A7%86%E9%A2%91%E6%96%87%E4%BB%B6%E5%92%8C%E8%BF%90%E5%8A%A8%E7%89%A9%E4%BD%93%E6%A3%80%E6%B5%8B

运动检测的原理就是,首先获取一张背景图,然后不断的读入每一帧动画,然后和背景图进行相减,得到的图即为可以检测运动的图像,然后还需要不断的更新背景图。

public class test {        
    public static void main(String args[]) throws Exception{ 
//声明IplImage指针
IplImage pFrame = null; 
IplImage pFrImg = null;
IplImage pBkImg = null;

CvMat pFrameMat = null;
CvMat pFrMat = null;
CvMat pBkMat = null;

CvCapture pCapture = null;

int nFrmNum = 0;

//创建窗口
cvNamedWindow("video", 1);
cvNamedWindow("background",1);
cvNamedWindow("foreground",1);
//使窗口有序排列
cvMoveWindow("video", 30, 0);
cvMoveWindow("background", 360, 0);
cvMoveWindow("foreground", 690, 0);
//打开视频文件
FrameGrabber grabber = FrameGrabber.createDefault(0);
	grabber.start();
	pFrame = grabber.grab();

//逐帧读取视频
while(pFrame!=null)
{
    nFrmNum++;

    //如果是第一帧,需要申请内存,并初始化
    if(nFrmNum == 1)
	{
	  pBkImg = cvCreateImage(cvSize(pFrame.width(), pFrame.height()),  IPL_DEPTH_8U,1);
	  pFrImg = cvCreateImage(cvSize(pFrame.width(), pFrame.height()),  IPL_DEPTH_8U,1);

	  pBkMat = cvCreateMat(pFrame.height(), pFrame.width(), CV_32FC1);
	  pFrMat = cvCreateMat(pFrame.height(), pFrame.width(), CV_32FC1);
	  pFrameMat = cvCreateMat(pFrame.height(), pFrame.width(), CV_32FC1);

	  //转化成单通道图像再处理
	  cvCvtColor(pFrame, pBkImg, CV_BGR2GRAY);
	  cvCvtColor(pFrame, pFrImg, CV_BGR2GRAY);

	  cvConvert(pFrImg, pFrameMat);
	  cvConvert(pFrImg, pFrMat);
	  cvConvert(pFrImg, pBkMat);
	}
    else
	{
	  cvCvtColor(pFrame, pFrImg, CV_BGR2GRAY);
	  cvConvert(pFrImg, pFrameMat);
	  //高斯滤波先,以平滑图像
	  //cvSmooth(pFrameMat, pFrameMat, CV_GAUSSIAN, 3, 0, 0);

	  //当前帧跟背景图相减
	  cvAbsDiff(pFrameMat, pBkMat, pFrMat);

	  //二值化前景图
	  cvThreshold(pFrMat, pFrImg, 60, 255.0, CV_THRESH_BINARY);

	  //进行形态学滤波,去掉噪音  
	  //cvErode(pFrImg, pFrImg, 0, 1);
	  //cvDilate(pFrImg, pFrImg, 0, 1);

	  //更新背景
	  cvRunningAvg(pFrameMat, pBkMat, 0.003, null);
	  //将背景转化为图像格式,用以显示
	  cvConvert(pBkMat, pBkImg);

	  //显示图像
	  cvShowImage("video", pFrame);
	  cvShowImage("background", pBkImg);
	  cvShowImage("foreground", pFrImg);

	  //如果有按键事件,则跳出循环
	  //此等待也为cvShowImage函数提供时间完成显示
	  //等待时间可以根据CPU速度调整
	  if( cvWaitKey(2) >= 0 )
	    break;

	}
    try {
		pFrame = grabber.grab();
	} catch (Exception e) {
		// TODO Auto-generated catch block
		e.printStackTrace();
	}
    }
		//销毁窗口
		cvDestroyWindow("video");
		cvDestroyWindow("background");
		cvDestroyWindow("foreground");

		//释放图像和矩阵
		cvReleaseImage(pFrImg);
		cvReleaseImage(pBkImg);

		cvReleaseMat(pFrameMat);
		cvReleaseMat(pFrMat);
		cvReleaseMat(pBkMat);

		cvReleaseCapture(pCapture);

    }
 }
3月 192013
 
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

typedef int Datatype;
int random(int i, int j)
{
    return i + rand() % (j-i+1);
}

int randomPartition(Datatype A[], int low, int high)
{
    int i = random(low,high);
    int temp;
    temp = A[high];
    A[high] = A[i];
    A[i] = temp;
    return  partition(A, low, high);
}
int partition(Datatype A[], int low, int high)
{
    int i=low,
        j=high;
    Datatype pivot = A[low];
    while(i < j)
    {
        while(i<j&&A[j] >= pivot) j--;
        if(i<j) A[i++] = A[j];
        while(i<j&&A[i] <= pivot) i++;
        if(i<j) A[j--] = A[i];
    }
    A[i] = pivot;
    return i;
}

void quicksort(Datatype A[], int low, int high)
{
    int divide;
    if(low<high)
    {
        divide = randomPartition(A,low,high);
        //divide = partition(A,low,high);
        quicksort(A, low, divide);
        quicksort(A, divide+1, high);
    }
}

int main()
{
    int i;
    Datatype A[10] ={2,4,6,1,7,3,9,1,90,23};
    quicksort(A, 0, sizeof(A)/sizeof(Datatype));
    for(i=0;i<(sizeof(A)/sizeof(Datatype));i++)
    {
        printf("%d ",A[i]);
    }
    printf("\n");
    return 0;
}

3月 162013
 

人脸识别,读入一张图片,检测人脸,当然也可以通过更换xml文件来检测眼睛,嘴巴等。
其中可以把检测图片这段代码注释,把中间的opencvframegrabber的注释去了,可以实时检测视频中的人脸,我的电脑貌似有点慢。
当然也可以用摄像头实时检测
参考
http://opencvlover.blogspot.com/2012/11/face-detection-in-javacv-using-haar.html

好吧这篇文章被墙了。

可能会提示CV_HAAR_DO_CANNY_PRUNING找不到
import这个即可。
import static com.googlecode.javacv.cpp.opencv_objdetect.*;
cvHaarDetectObjects参数调整:
调节程序中的缺省参数(scale_factor=1.1, min_neighbors=3, flags=0)用于对目标进行更精确同时也是耗时较长的进一步检测。为了能对视频图像进行更快的实时检测,参数设置通常是:scale_factor=1.2, min_neighbors=2, flags=CV_HAAR_DO_CANNY_PRUNING, min_size= (例如, 对于视频会议的图像区域)

public class test {  
	static CvMemStorage storage;
	static CvHaarClassifierCascade cascade;
	static String XML_FILE = "haarcascade_frontalface_default.xml";
        public static void main(String args[]) throws Exception{ 
	/* 视频人脸检测
	IplImage pFrame=null;
	OpenCVFrameGrabber grabber = new OpenCVFrameGrabber("infile2.wmv");
	grabber.start();
	//FrameGrabber grabber = FrameGrabber.createDefault(0);  //摄像头人脸检测
        //grabber.start();
        pFrame = grabber.grab();
        while( pFrame!=null )
        {
    	detect( pFrame );
        //cvReleaseImage( pFrame );
        pFrame = grabber.grab();
        if( cvWaitKey( 10 ) &gt;= 0 )
            break;
    }
   */
	IplImage img = cvLoadImage("xinsrc_1320805282048718186931.jpg");
	detect( img );

    }

    public static void detect(IplImage src){

		CvHaarClassifierCascade cascade = new 
				CvHaarClassifierCascade(cvLoad(XML_FILE));
		CvMemStorage storage = CvMemStorage.create();
		CvSeq sign = cvHaarDetectObjects(
				src,
				cascade,
				storage,
				1.2,
				2,
				CV_HAAR_DO_CANNY_PRUNING);

		cvClearMemStorage(storage);

		int total_Faces = sign.total();		
                if(total_Faces==0)
        	return;
		for(int i = 0; i &lt; total_Faces; i++){
			CvRect r = new CvRect(cvGetSeqElem(sign, i));
			cvRectangle (   src,
				        cvPoint(r.x(), r.y()),
					cvPoint(r.width() + r.x(), r.height() + r.y()),
					CvScalar.RED,
					2,
					CV_AA,
					0);

		}
		cvShowImage("Result", src);
		cvWaitKey( 0 );
	}
}
3月 162013
 

参考opencv示例

http://www.opencv.org.cn/index.php/%E5%9B%BE%E5%83%8F%E5%88%9B%E5%BB%BA%E3%80%81%E4%BF%9D%E5%AD%98%E5%92%8C%E5%A4%8D%E5%88%B6

public class test { 
public static void main(String args[]){ 
    IplImage image = cvLoadImage("lena.jpg");
    if(image==null)
    {
        System.err.print("Can not open file!\n");
        System.exit(1); 
    }

    IplImage pImg2 = cvCreateImage(cvGetSize(image),
    image.depth(),
    image.nChannels());
    cvCopy(image, pImg2, null);
    cvSaveImage("lena2.jpg", pImg2);//把图像写入文件 

    cvNamedWindow("Example",CV_WINDOW_AUTOSIZE); 
    //在窗口Example中显示图片
    cvShowImage("Example",image); 
    //暂停程序,等待用户触发一个按键
    cvWaitKey(0); 
    //释放图像所分配的内存 
    cvReleaseImage(image); 
    cvReleaseImage(pImg2); 
    //销毁窗口 
    cvDestroyWindow("Example"); 
    } 

}

首先保证当前工作目录下有图片文件,运行程序后
1、使用cvCopy(image, pImg2, null);来拷贝图片
2、使用cvSaveImage(“lena2.jpg”, pImg2);来保存图片
3、释放图片。
cvReleaseImage(image);
cvReleaseImage(pImg2);

3月 152013
 

这里的程序是参考别人的C语言程序移植过来的,没怎么学过java,玩CV顺便学下java吧

参考http://wenku.baidu.com/view/2b6fb9eb856a561252d36f4f.html

import static com.googlecode.javacv.cpp.opencv_core.*; 
import static com.googlecode.javacv.cpp.opencv_imgproc.*; 
import static com.googlecode.javacv.cpp.opencv_highgui.*;

public class test { 
   public static void main(String args[]){ 
      IplImage image = cvLoadImage("D:\\car.bmp"); 
      if (null == image)//如果读入失败,退出程序 
          System.exit(1); 
      //创建一个窗口,标题为Example 
      cvNamedWindow("Example",CV_WINDOW_AUTOSIZE); 
      //在窗口Example中显示图片
      cvShowImage("Example",image); 
      //暂停程序,等待用户触发一个按键
      cvWaitKey(0); 
      //释放图像所分配的内存 
      cvReleaseImage(image); 
      //销毁窗口 
      cvDestroyWindow("Example"); 
    } 
}
编译运行,这样就可以显示图片了,话说wordpress怎么上传图片呐- -
3月 152013
 

突然对Javacv感兴趣了,打算弄个人脸检测啥的,大企鹅已经有人脸登陆功能了。

1、下载OpenCV 2.4.4 http://sourceforge.net/projects/opencvlibrary/files/

2、安装,其实就是解压

3、设置环境变量

这里因为一开始也没有搭建成功所以设置了一堆。

…\opencv\build\x86\vc10\bin;

…\opencv\build;

…\opencv\build\x86\vc10\staticlib;

4、下载javacv-0.4-bin.zip

https://code.google.com/p/javacv/downloads/detail?name=javacv-0.4-bin.zip

这里我也把这个安装目录设置了环境变量,估计不需要,因为后面是直接拷贝到工程里的。

5、解压出一堆*.jar的文件

6、使用Eclipse新建工程

在新建的工程下新建一个文件目录libs/armeabi,建好之后把步骤5里面的jar文件拷贝到libs文件的根目录下

7、刷新项目,然后使用右键工程名->Build Path->Configure Build Path, 在里面Add JARS,把刚才拷贝过来的所有jar包都加入到项目中。

更详细参考

http://blog.csdn.net/haoba1987/article/details/8175390

会遇到的问题:

1、配置玩环境变量后,编译后提示找不到各种库*core,什么一堆库,估计还是环境没配置好,再加点或者试下重启什么的。
2、使用https://code.google.com/p/javacv/这里的示例程序,提示haarcascade_frontalface_alt.xml找不到,该文件在opencv\data\文件夹下面,还有其它的嘴巴、眼睛、body一堆。
3、现在关于javacv的参考太少了,API找不到,网上查了下,其API和python、C++什么的还是挺相似的。

3月 142013
 

strcmp源码
原型:extern int strcmp(const char *s1,const char * s2);
所在头文件:string.h
功能:比较字符串s1和s2。
一般形式:strcmp(字符串1,字符串2)

 int __cdecl strcmp (const char * src, const char * dst)
 {
     int ret = 0 ;
     while( ! (ret = *(unsigned char *)src - *(unsigned char *)dst) &amp;&amp; *dst&amp;&amp;*src)
     ++src, ++dst;
     if ( ret &lt; 0 )
         ret = -1 ;
     else if ( ret &gt; 0 )
         ret = 1 ;
     return( ret );
 }
神一般的 strcpy
考虑NULL指针,const修饰,地址覆盖问题
char *mystrcpy2(char* dst, const char *src)
 {
 char *ret = dst;
 int count = strlen(src)+1;
 assert(dst);
 assert(src);
 if( dst&lt;=src || dst&gt;=(src+count) )//地址不重合,从低字节开始复制
 {
 while(count--)
 {
 *dst++ = *src++;
 }
 }
 else //地址重合,从高字节开始复制
 {
 dst = dst + count - 1;
 src = src + count - 1;
 while(count--)
 {
 *dst-- = *src--;
 }
 }
 return dst;
 }
3月 092013
 

1. tokyo cabinet系统介绍
tokyo cabinet官方主页http://fallabs.com/tokyocabinet/,是一款kv型的数据库,没有数据类型,没有表的概念,key和value都可以是任意长度的字符串。
2. 安装
tokyo cabinet安装比较简单:
1. 下载源文件包:http://fallabs.com/tokyocabinet/tokyocabinet-1.4.47.tar.gz
2. 解压该文件:
tar zxvf tokyocabinet-1.4.48.tar.gz
3. 编译安装
cd tokyocabinet-1.4.48/
./configure ; make ; make install
上面及完成整个tokyo cabinet数据库的安装,tokyo cabinet的使用也非常简单,和通常意义上的数据库操作是类似的:
1. 首先打开数据库,得到和数据库操作的句柄
2. 使用该句柄执行操作
3. 释放该句柄

#include 
#include 
#include 
#include 
#include 
int main(int argc, char **argv){
    TCADB *adb;
    char *key, *value;
    /* create the object 初始化数据库*/
    adb = tcadbnew();
    /* open the database 打开并创建数据库*/
    if(!tcadbopen(adb, "casket.tch")){
        fprintf(stderr, "open error\n");
    }
    /* store records 插入数据*/
    if(!tcadbput2(adb, "foo", "hop") ||
       !tcadbput2(adb, "bar", "step") ||
       !tcadbput2(adb, "baz", "jump")){
        fprintf(stderr, "put error\n");
    }
    /* retrieve records 根据key值获取value*/
    value = tcadbget2(adb, "foo");
    if(value){
        printf("%s\n", value);
        free(value);
    } else {
        fprintf(stderr, "get error\n");
    }
    /* traverse records 遍历所有的数据*/
    tcadbiterinit(adb);
    while((key = tcadbiternext2(adb)) != NULL){
    value = tcadbget2(adb, key);
    if(value){
        printf("%s:%s\n", key, value);
        free(value);
    }
        free(key);
    }
    /* close the database 关闭数据库*/
    if(!tcadbclose(adb)){
        fprintf(stderr, "close error\n");
    }
    /* delete the object 删除数据库*/
        tcadbdel(adb);
    return 0;
}

Tokyo Cabinet的数据结构分为
1.Hash结构
2.B+Tree
3.定长数据库
但无论哪种数据结构,最后都会抽象为以下操作,以及分别对应不同的API

put

Hash: bool tchdbput2(TCHDB *hdb, const char *kstr, const char *vstr);
B+Tree: bool tcbdbput2(TCBDB *bdb, const char *kstr, const char *vstr);
Table: bool tctdbput3(TCTDB *tdb, const char *pkstr, const char *cstr);

get

Hash: char *tchdbget2(TCHDB *hdb, const char *kstr);
B+Tree: char *tcbdbget2(TCBDB *bdb, const char *kstr);
Table: char *tctdbget3(TCTDB *tdb, const char *pkstr);

这样,就为开发相应的接口,增加了不少复杂度,需要针对不同的数据结构,去调用不同的API,但Abstract Database API有效减少了这个麻烦,看下面的代码

TCADB *adb = tcadbnew();
if(!tcadbopen(adb, dbname)) {
    fprintf(stderr, "open error: %s\n", dbname);
}
tcadbput2(adb, key, value);
if(!tcadbclose(adb)){
    fprintf(stderr, "close error:");
    return 0;
}
tcadbdel(adb);

一个tcadbput2,就可以代替所有的put方法了,adb是通过判断所操作数据库的扩展名,来决定调用哪种数据库的API,扩展名对应如下:
Hash: .tch
B+Tree: .tcb
定长数据库: .tcf
—相关API总结—
初始化数据库:adb = tcadbnew();
打开或创建数据库:tcadbopen(adb, “casket.tch”)
插入key-value值:tcadbput2(adb, “foo”, “hop”)
根据key值获取value:value = tcadbget2(adb, “foo”);
将数据库指针指向第0个数据(个人理解):tcadbiterinit(adb);
获取下一个key值,调用后指向下一位:key = tcadbiternext2(adb)
关闭数据库:tcadbclose(adb)
删除数据库:tcadbdel(adb);

参考:
http://qingfeng.github.com/2009/08/06/TokyoCabinet-Abstract-Database-API/
http://blog.csdn.net/xuqianghit/article/details/6929256

3月 092013
 

1、github上删除自己项目里面不需要的文件

首先进入master文件夹下;
然后将git pull origin master将网上的复制到本地
再git rm 文件。
再git push origin master同步到网络。

2、github在建立好工程后,上传文件

git add 待上传文件
git commit -m 'first_commit'
git remote add origin https://github.com/**************.git
git push origin master

会碰到错误fatal: remote origin already exists

git remote rm origin
git remote add origin https://github.com/**************.git
git push origin master
---------------------------2013.03.09-----------------------------