在这儿介绍一种粗略的普通摄像头深度信息提取方法,很简单,也很实用
“近者大而远者小”,根据目标物体的大小,可以粗略判断出物体的远近
我这里有一个简单的应用,控制图片的大小
视频演示:http://v.youku.com/v_show/id_XMjM2NDk4ODMy.html
截图:
大家可以自己试试看。
也可以下载代码:http://download.csdn.net/source/2979410
或者简单看一下:
//processing window size
const CvSize winSizeProcess=cvSize(320,240);
IplImage* imgColor=cvCreateImage(winSizeProcess,8,3);
IplImage* imgGray=cvCreateImage(winSizeProcess,8,1);
int threshold=140;
cvNamedWindow("processing");
cvMoveWindow("processing",0,0);
cvCreateTrackbar("threshold","processing",&threshold,200,NULL);
int oldImgErea=-1;
bool isZooming=false;
IplImage* imgHand;
while (imgHand=cvQueryFrame(capture)){
cvResize(imgHand,imgColor);
cvCvtColor(imgColor,imgColor,CV_RGB2YCrCb);
cvSplit(imgColor,NULL,NULL,imgGray,NULL);
cvThreshold(imgGray,imgGray,threshold,255,CV_THRESH_BINARY);
cvShowImage("processing",imgGray);
if (isZooming){
cvErode(imgGray,imgGray);
cvDilate(imgGray,imgGray);
CvTarget target;
cvFindTarget(imgGray,target);
if (target.erea>HandEreaThreshold){
float scale=1.0f;
if (oldImgErea>0){
scale=(float)target.erea/oldImgErea;
}
oldImgErea=target.erea;
showSize.width*=scale;
showSize.height*=scale;
//in defense of limit extreme situation
if (showSize.width<4||showSize.height<4||
showSize.width>2000||showSize.width>2000){
showSize=cvGetSize(img);
}
}
}
IplImage* imgResized=cvCreateImage(showSize,8,3);
cvResize(img,imgResized);
static int screenWidth=1024;
static int screenHeight=768;
cvMoveWindow("image",(screenWidth-showSize.width)>>1,(screenHeight-showSize.height)>>1);
cvShowImage("image",imgResized);
cvReleaseImage(&imgResized);
int keyPressed=cvWaitKey(3);
if(keyPressed==27){
break;
}else if (keyPressed==' '){//start/strop zooming
isZooming=!isZooming;
}
}
cvReleaseImage(&img);
cvReleaseCapture(&capture);
return 0;
}