基于重心偏移的视差计算

来源:互联网 发布:数据库系统概论第四版 编辑:程序博客网 时间:2024/05/26 12:53

视差的计算,主要要计算待匹配图像对应像素的水平偏移,那么针对一个物体而言,其在场景中的视差大体上应该是平滑的,所以可以直接针对分割出的物体计算重心的水平偏移从而得到视差值,我做了一个小实验,感觉效果还行,下面是代码和实验结果,希望各位有什么想法大家交流。


    有一个问题就是,我这个视差计算出来是这个台灯是221的灰度,标准的是224的灰度。

我的流程是算出横向偏移x,视差 = x * (视差最大层级/255),这个tusukuba图像的视差层级是15,所以算出来是221


效果:



groundtruth:

代码:用opencv1写的,有兴趣的哥们把他改成OpenCV新版的吧


[cpp] view plain copy
 print?
  1. // FindGravity.cpp : 定义控制台应用程序的入口点。  
  2. //  
  3.   
  4. #include "stdafx.h"  
  5. #include <iostream>  
  6. #include <string>  
  7. #include "cv.h"   
  8. #include "highgui.h"   
  9.   
  10.   
  11.   
  12.   
  13. #include <opencv2/core/core.hpp>    
  14. #include <opencv2/highgui/highgui.hpp>  
  15.   
  16.   
  17. #pragma comment(lib,"opencv_core2410d.lib")                  
  18. #pragma comment(lib,"opencv_highgui2410d.lib")                  
  19. #pragma comment(lib,"opencv_imgproc2410d.lib")     
  20.   
  21. using namespace std;  
  22. using namespace cv;  
  23.   
  24.   
  25. void FindGravity()  
  26. {  
  27.       
  28. }  
  29. /** 计算二值图像的重心 
  30. * @param[in] src  输入的待处理图像 
  31. * @param[out] center 重心坐标 
  32. * @retval 0  操作成功 
  33. * @retval -1 操作失败 
  34. * @note 输入图像是二值化图像 
  35. * @note xc=M10/M00, yc=M01/M00, 其中 Mx_order,y_order=SUMx,y(I(x,y)*x^x_order*y^y_order) 
  36.  */  
  37.  static int aoiGravityCenter(IplImage *src, CvPoint ¢er)  
  38.  {  
  39.   //if(!src)  
  40.   // return GRAVITYCENTER__SRC_IS_NULL;  
  41.   double m00, m10, m01;  
  42.   CvMoments moment;  
  43.   cvMoments( src, &moment, 1);  
  44.   m00 = cvGetSpatialMoment( &moment, 0, 0 );  
  45.   if( m00 == 0)   
  46.    return 1;  
  47.   m10 = cvGetSpatialMoment( &moment, 1, 0 );  
  48.   m01 = cvGetSpatialMoment( &moment, 0, 1 );  
  49.   center.x = (int) (m10/m00);  
  50.   center.y = (int) (m01/m00);  
  51.   return 0;  
  52.  }   
  53.   
  54.  IplImage* binary_image(IplImage* src)  
  55.  {  
  56.        
  57.   
  58.         // cvThreshold( src, src, 100, 255, CV_THRESH_BINARY );//100 is the thredhold   
  59.          IplImage* one_channel = cvCreateImage(cvSize(src->width,src->height),IPL_DEPTH_8U,0);  
  60.           
  61.          for(int y = 0;y < src->height;y++)  
  62.          {  
  63.              char *ptr= src->imageData + y * src->widthStep;  
  64.              char *p_one_channel = one_channel->imageData + y * one_channel->widthStep;  
  65.              for(int x = 0;x < src->width;x++)  
  66.              {  
  67.                  int temp = ptr[3*x];  
  68.                  if (temp != 0)//不是黑色也就是说不是背景  
  69.                  {  
  70.                      p_one_channel[x] = 255;//设置为白色  
  71.                  }  
  72.                  else  
  73.                  {  
  74.                      p_one_channel[x] = 0;  
  75.   
  76.                  }  
  77.                  //ptr[3*x]=  
  78.                  //ptr[3*x+1]=  
  79.                  //ptr[3*x+2]=;   
  80.              }  
  81.          }  
  82.          return one_channel;  
  83.   
  84.   
  85.  }  
  86.   
  87.  void showDisparity(int max,int weiyi,IplImage* src)  
  88.  {  
  89.     int danwei = 255/max;  
  90.     int gray_pixel = weiyi*danwei;  
  91.     cout<<gray_pixel<<endl;  
  92.   
  93.   
  94.     IplImage* one_channel = cvCreateImage(cvSize(src->width,src->height),IPL_DEPTH_8U,0);  
  95.   
  96.     for(int y = 0;y < src->height;y++)  
  97.     {  
  98.         char *ptr= src->imageData + y * src->widthStep;  
  99.         char *p_one_channel = one_channel->imageData + y * one_channel->widthStep;  
  100.         for(int x = 0;x < src->width;x++)  
  101.         {  
  102.             int temp = ptr[x];  
  103.             if (temp != 0)//不是黑色也就是说不是背景  
  104.             {  
  105.                 p_one_channel[x] = gray_pixel;//设置为视差  
  106.             }  
  107.             else  
  108.             {  
  109.                 p_one_channel[x] = 0;  
  110.   
  111.             }  
  112.             //ptr[3*x]=  
  113.             //ptr[3*x+1]=  
  114.             //ptr[3*x+2]=;   
  115.         }  
  116.     }  
  117.       
  118.     cvNamedWindow( "disparity", 1 );   
  119.     cvShowImage( "disparity", one_channel );  
  120.  }  
  121.   
  122. int _tmain(int argc, _TCHAR* argv[])  
  123. {  
  124.     string str_name_left = "lamp_left.bmp";  
  125.     string str_name_right = "lamp_right.bmp";  
  126.   
  127.     IplImage* src_left;  
  128.     IplImage* src_right;   
  129.     IplImage* draw = cvLoadImage(str_name_left.c_str(),1);//绘制重心的图像  
  130.       
  131.     if ((src_left = cvLoadImage(str_name_left.c_str(),1))!=0)  
  132.     {  
  133.         //src = binary_image(src);  
  134.         cvNamedWindow( "binary image left", 1 );   
  135.         cvShowImage( "binary image left", binary_image(src_left) );  
  136.   
  137.         src_right = cvLoadImage(str_name_right.c_str(),1);  
  138.         cvNamedWindow( "binary image right", 1 );   
  139.         cvShowImage( "binary image right", binary_image(src_right) );  
  140.     }  
  141.   
  142.     CvPoint xy_left;  
  143.     aoiGravityCenter(binary_image(src_left),xy_left);  
  144.     cout<<"left image gravity center: "<<endl<<xy_left.x<<endl;  
  145.     cout<<xy_left.y<<endl;  
  146.   
  147.     CvPoint xy_right;  
  148.     aoiGravityCenter(binary_image(src_right),xy_right);  
  149.     cout<<"right image gravity center: "<<endl<<xy_right.x<<endl;  
  150.     cout<<xy_right.y<<endl;  
  151.   
  152.   
  153.     cvCircle(draw,cvPoint(xy_left.x,xy_left.y),3,CV_RGB(0,0,255),5);  
  154.   
  155.     cvNamedWindow( "重心", 1 );   
  156.     cvShowImage( "重心", draw );   
  157.   
  158.     int weiyi = ( xy_left.x - xy_right.x);  
  159.     showDisparity(15,weiyi,binary_image(src_left));  
  160.     cvWaitKey(0);  
  161.     return 0;  
  162. }  
0 0
原创粉丝点击