一种粗略的普通摄像头深度信息提取方法

在这儿介绍一种粗略的普通摄像头深度信息提取方法,很简单,也很实用

“近者大而远者小”,根据目标物体的大小,可以粗略判断出物体的远近

 

我这里有一个简单的应用,控制图片的大小

视频演示:http://v.youku.com/v_show/id_XMjM2NDk4ODMy.html

 

截图:

 

 

大家可以自己试试看。

也可以下载代码:http://download.csdn.net/source/2979410

 

或者简单看一下:

[cpp] view plain copy
  1. int main(int argc,char** argv)  
  2. {  
  3.     CvCapture* capture=cvCreateCameraCapture(-1);  
  4.     if (!capture){  
  5.         cout<<"failed to open camera"<<endl;  
  6.         exit(0);  
  7.     }  
  8.     //image for show  
  9.     IplImage* img=cvLoadImage("Song.jpg");  
  10.     if (!img){  
  11.         cout<<"failed to load image"<<endl;  
  12.         exit(0);  
  13.     }  
  14.     CvSize showSize=cvGetSize(img);  
  15.   
  16.     //processing window size  
  17.     const CvSize winSizeProcess=cvSize(320,240);  
  18.     IplImage* imgColor=cvCreateImage(winSizeProcess,8,3);  
  19.     IplImage* imgGray=cvCreateImage(winSizeProcess,8,1);  
  20.       
  21.     int threshold=140;  
  22.     cvNamedWindow("processing");  
  23.     cvMoveWindow("processing",0,0);  
  24.     cvCreateTrackbar("threshold","processing",&threshold,200,NULL);  
  25.   
  26.     int oldImgErea=-1;  
  27.   
  28.     bool isZooming=false;  
  29.     IplImage* imgHand;  
  30.     while (imgHand=cvQueryFrame(capture)){  
  31.         cvResize(imgHand,imgColor);  
  32.         cvCvtColor(imgColor,imgColor,CV_RGB2YCrCb);  
  33.         cvSplit(imgColor,NULL,NULL,imgGray,NULL);  
  34.         cvThreshold(imgGray,imgGray,threshold,255,CV_THRESH_BINARY);  
  35.   
  36.         cvShowImage("processing",imgGray);  
  37.   
  38.         if (isZooming){  
  39.             cvErode(imgGray,imgGray);  
  40.             cvDilate(imgGray,imgGray);  
  41.   
  42.             CvTarget target;  
  43.             cvFindTarget(imgGray,target);  
  44.             if (target.erea>HandEreaThreshold){  
  45.                 float scale=1.0f;  
  46.                 if (oldImgErea>0){  
  47.                     scale=(float)target.erea/oldImgErea;      
  48.                 }  
  49.                 oldImgErea=target.erea;   
  50.   
  51.                 showSize.width*=scale;  
  52.                 showSize.height*=scale;   
  53.                 //in defense of limit extreme situation  
  54.                 if (showSize.width<4||showSize.height<4||  
  55.                     showSize.width>2000||showSize.width>2000){  
  56.                     showSize=cvGetSize(img);  
  57.                 }  
  58.             }  
  59.         }  
  60.           
  61.         IplImage* imgResized=cvCreateImage(showSize,8,3);  
  62.         cvResize(img,imgResized);  
  63.   
  64.         static int screenWidth=1024;  
  65.         static int screenHeight=768;  
  66.         cvMoveWindow("image",(screenWidth-showSize.width)>>1,(screenHeight-showSize.height)>>1);  
  67.         cvShowImage("image",imgResized);  
  68.           
  69.         cvReleaseImage(&imgResized);  
  70.         int keyPressed=cvWaitKey(3);  
  71.         if(keyPressed==27){  
  72.             break;  
  73.         }else if (keyPressed==' '){//start/strop zooming  
  74.             isZooming=!isZooming;  
  75.         }  
  76.     }  
  77.     cvReleaseImage(&img);  
  78.     cvReleaseCapture(&capture);  
  79.     return 0;  
  80. }  

阅读更多
个人分类: 测距
上一篇可以让你玩儿光剑的程序,vc实现方法和代码
下一篇石头剪刀布 手势识别
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭
关闭