在这儿介绍一种粗略的普通摄像头深度信息提取方法,很简单,也很实用
“近者大而远者小”,根据目标物体的大小,可以粗略判断出物体的远近
我这里有一个简单的应用,控制图片的大小
视频演示:http://v.youku.com/v_show/id_XMjM2NDk4ODMy.html
截图:
大家可以自己试试看。
也可以下载代码:http://download.csdn.net/source/2979410
或者简单看一下:
- int main(int argc,char** argv)
- {
- CvCapture* capture=cvCreateCameraCapture(-1);
- if (!capture){
- cout<<"failed to open camera"<<endl;
- exit(0);
- }
- //image for show
- IplImage* img=cvLoadImage("Song.jpg");
- if (!img){
- cout<<"failed to load image"<<endl;
- exit(0);
- }
- CvSize showSize=cvGetSize(img);
- //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;
- }