FROM:http://blog.csdn.net/tulun/article/details/6388759

NCC算法(Normal Cross Correlation),具体原理见相关图像处理书籍。

该程序是opencv中文论坛的牛人贡献的,感谢他的工作。

(程序所需图片可以在网上找如http://vision.middlebury.edu/stereo/data/scenes2003/)

#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <cv.h>
#include <cxcore.h>
#include <highgui.h>
#include <math.h>
#include <ctime>

using namespace std;
template<class T> class Image
{
private:
    IplImage* imgp;

public:
    Image(IplImage* img=0){imgp=img;}
    ~Image(){imgp=0;}
    void operator=(IplImage* img){imgp=img;}
    inline T* operator[](const int rowIndx)
    {
        return((T*)(imgp->imageData+rowIndx*imgp->widthStep));
    }

};

typedef struct
{
    unsigned char b,g,r;
}RgbPixel;

typedef struct
{
    float b,g,r;
}RgbPixelFloat;

typedef Image<RgbPixel> RgbImage;
typedef Image<RgbPixelFloat> RgbImageFloat;
typedef Image<unsigned char> BwImage;
typedef Image<float> BwImageFloat;

void displayImageProperty(IplImage* image)
{
    cout<<"-------Image Properties--------"<<endl;
    cout<<"Image width="<<image->width<<endl;
    cout<<"Image height="<<image->height<<endl;
    cout<<"Image depth="<<image->depth<<endl;
    cout<<"Image nSize="<<image->nSize<<endl;
    cout<<"Image nChannels="<<image->nChannels<<endl;

char* origin;
    char* dataOrder;
    if (image->origin==0)
    {
        origin="Top-left";
    }
    else
    {
        origin="Below-left";//image->origin=1
    }

cout<<"Image origin="<<origin<<endl;

if (image->dataOrder==0)
    {
        dataOrder="Order_Pixel(Interleaved)";
    }
    else
    {
        dataOrder="Order_Plane";//image->dataOrder=1
    }
    cout<<"Image dataOrder="<<dataOrder<<endl;
    cout<<"Image widthStep="<<image->widthStep<<" Bytes"<<endl;
}

// display an image in a new window with title to be given.
void displayImageNewWindow(char* title,CvArr* img)
{
    cvNamedWindow(title, CV_WINDOW_AUTOSIZE );
    cvShowImage(title,img);
}

int getMaxMin(double value[],int valueSize, int maxmin)
{
    int pos=0;
    int i=0;
    double max1=-1;//?-999999;
    double min1=999999;
      
    if (maxmin==1)
    {
        //find max
        for (i=0;i<valueSize;i++)
        {
            //find the index with the max ncc;
            if (value[i]>max1)
            {
                pos=i;
                max1=value[i];
            }
         }
    }
      
    if (maxmin==0)
    {
        //find min
        for (i=0;i<valueSize;i++)
        {
            //find the index with the max ncc;
            if (value[i]<min1)
            {
                pos=i;
                min1=value[i];
            }
         }
    }
    return pos;
}

IplImage* generateDisparityImage(IplImage* greyLeftImg32,IplImage* greyRightImg32,int windowSize,int DSR)
{
    int offset=floor((double)windowSize/2);
    int height=greyLeftImg32->height;
    int width=greyLeftImg32->width;
    double* localNCC=new double[DSR];

int x=0, y=0,d=0,m=0;
    int N=windowSize;

IplImage* leftWinImg=cvCreateImage(cvSize(N,N),32,1);//mySubImage(greyLeftImg32,cvRect(0,0,N,N));
    IplImage* rightWinImg=cvCreateImage(cvSize(N,N),32,1);;//mySubImage(greyRightImg32,cvRect(0,0,N,N));
    IplImage* disparity=cvCreateImage(cvSize(width,height),8,1);//or IPL_DEPTH_8U
    BwImage imgA(disparity);
      
    for (y=0;y<height;y++)
    {
        for (x=0;x<width;x++)
        {
            imgA[y][x]=0;
        }
    }
      
    CvScalar s1;
    CvScalar s2;
    for (y=0;y<height-N;y++)
    {
        //height-N
        for (x=0;x<width-N;x++)
        {
            //width-N
            //getWindow(i,j,leftim,wl,N);
            cvSetImageROI(greyLeftImg32, cvRect(x,y,N,N));
            s1=cvAvg(greyLeftImg32,NULL);
            cvSubS(greyLeftImg32,s1,leftWinImg,NULL);//zero-means
            cvNormalize(leftWinImg,leftWinImg,1,0,CV_L2,NULL);//0变成1
            d=0;
            
            //initialise localNCC
            for (m=0;m<DSR;m++)
            {
                localNCC[m]=0;
            }
            
            do{
                if (x-d>=0)
                {
                    cvSetImageROI(greyRightImg32, cvRect(x-d,y,N,N));
                    s2=cvAvg(greyRightImg32,NULL);
                    cvSubS(greyRightImg32,s2,rightWinImg,NULL);//zero-means
                    cvNormalize(rightWinImg,rightWinImg,1,0,CV_L2,NULL);//0变成1
                }
                else
                {
                    break;
                }
                localNCC[d]=cvDotProduct(leftWinImg,rightWinImg);
                cvResetImageROI(greyRightImg32);
                d++;
             }while(d<=DSR);
            
             //to find the best d and store
             imgA[y+offset][x+offset]=getMaxMin(localNCC,DSR,1)*16;
             cvResetImageROI(greyLeftImg32);
          }//x
          if (y%10==0)
              cout<<"row="<<y<<" of "<<height<<endl;
       }//y
      
       cvReleaseImage(&leftWinImg);
       cvReleaseImage(&rightWinImg);
          
       return disparity;
}

int main (int argc, char * const argv[])
{
    // insert code here...
    cout << "Stereo Normalized Cross Correlation"<<endl;
      
    //**********image input*********************//

char* filename1="im0.ppm";//im2_cone.png
    IplImage* greyLeftImg= cvLoadImage(filename1,0);
    char* filename2="im1.ppm";
    IplImage* greyRightImg= cvLoadImage(filename2,0);
      
    if (greyLeftImg==NULL)
    {
        cout << "No valid image input."<<endl;
        //char c=getchar();
        return 1;
    }
    else
    {
        displayImageProperty(greyLeftImg);
    }
      
    if (greyRightImg==NULL)
    {
        cout << "No valid image input."<<endl;
        //char c=getchar();
        return 1;
    }

int width=greyLeftImg->width;
    int height=greyLeftImg->height;

/****************8U to 32F**********************/
    IplImage* greyLeftImg32=cvCreateImage(cvSize(width,height),32,1);//IPL_DEPTH_32F
    IplImage* greyRightImg32=cvCreateImage(cvSize(width,height),32,1);
    cvConvertScale(greyLeftImg, greyLeftImg32, 1/255.);
    cvConvertScale(greyRightImg, greyRightImg32, 1/255.);//1/255. equals to 1/255.0
      
    //-------------Computing stereo matching----------------
    time_t tstart, tend;
    tstart = time(0);
    int windowSize=11,DSR=20;//Disparity Search Range
    IplImage* disparity32=generateDisparityImage(greyLeftImg32,greyRightImg32,windowSize,DSR);
    tend = time(0);
    cout << "It took "<< difftime(tend, tstart) <<" second(s)."<< endl;

displayImageNewWindow("Dispairty Image",disparity32);
    displayImageNewWindow("Left Image",greyLeftImg32);
    displayImageNewWindow("Right Image",greyRightImg32);
    //cvSaveImage("D:/OpenCV_stuff/SampleImages/disparity.jpg",disparity32);

//********destroy window************/
    cvWaitKey(0);
    cvReleaseImage(&greyLeftImg32);
    cvReleaseImage(&greyRightImg32);
    cvReleaseImage(&greyLeftImg);
    cvReleaseImage(&greyRightImg);
    cvReleaseImage(&disparity32);
    cvDestroyWindow("Left Image");
    cvDestroyWindow("Right Image");
    cvDestroyWindow("Dispairty Image");
    return 0;
}

立体匹配之NCC算法相关推荐

  1. python计算机视觉——立体匹配与NCC算法

    文章目录 1. 立体匹配 1.1 概述 1.2 主要立体匹配算法分类 1.3 立体匹配的基本步骤 2. 归一化互相关(NCC)视差匹配法 2.1 原理 2.2 匹配流程 2.3 代码实现 3. 不同窗 ...

  2. 图像匹配—NCC算法,即归一化互相关匹配

    一.NCC的基础概念 NCC(normalized cross correlation)算法,归一化互相关匹配法,是基于图像灰度信息的匹配方法. 二.NCC算法定义为: 三.代码(利用NCC的密集匹配 ...

  3. 立体匹配:经典算法Fast Bilateral Solver

    点击上方"3D视觉工坊",选择"星标" 干货第一时间送达 作者丨HawkWang 来源丨计算摄影学 点击进入->3D视觉工坊学习交流群 一. 前言 你好, ...

  4. 图像匹配算法 MAD、SAD、SSD、MSD、NCC、SSDA、SATD,LBD算法

    图像匹配算法分为3类:基于灰度的匹配算法.基于特征的匹配算法.基于关系的匹配算法 (1)基于灰度的模板匹配算法:模板匹配(Blocking Matching)是根据已知模板图像到另一幅图像中寻找与模板 ...

  5. 基于灰度的模板匹配算法(一):MAD、SAD、SSD、MSD、NCC、SSDA算法

    简介: 本文主要介绍几种基于灰度的图像匹配算法:平均绝对差算法(MAD).绝对误差和算法(SAD).误差平方和算法(SSD).平均误差平方和算法(MSD).归一化积相关算法(NCC).序贯相似性算法( ...

  6. 【图像配准】基于灰度的模板匹配算法(一):MAD、SAD、SSD、MSD、NCC、SSDA、SATD算法

    简介: 本文主要介绍几种基于灰度的图像匹配算法:平均绝对差算法(MAD).绝对误差和算法(SAD).误差平方和算法(SSD).平均误差平方和算法(MSD).归一化积相关算法(NCC).序贯相似性检测算 ...

  7. 基于灰度的模板匹配算法:MAD、SAD、SSD、MSD、NCC、SSDA算法

    简介: 本文主要介绍几种基于灰度的图像匹配算法:平均绝对差算法(MAD).绝对误差和算法(SAD).误差平方和算法(SSD).平均误差平方和算法(MSD).归一化积相关算法(NCC).序贯相似性算法( ...

  8. 【计算机视觉】NCC匹配算法

    NCC匹配算法 1.NCC匹配实验原理 1.1 NCC的基础概念 1.2 NCC算法的基本原理 1.3 相关的数学知识 1.4 双目立体匹配流程 1.4 NCC的特点 2.NCC算法实现视差图匹配实验 ...

  9. 【视觉项目】【day6】8.26关于matchTemplate()以及NCC的思考整理

    NCC与matchTemplate()函数中match_method = TM_CCOEFF_NORMED是否一样? 先看公式: TM_CCOEFF_NORMED NCC TM_CCOEFF_NORM ...

最新文章

  1. Java8自定义条件让集合分组
  2. mysql体系结构:
  3. C语言必知的几个概念
  4. 16-djongo中间件学习
  5. 「网络流24题」试题库问题
  6. vue配置git的子模块
  7. 多点在线构建Noxmobi全球化精准营销系统
  8. 作者:周涛(1979-),男,博士,启明星辰教授级高级工程师、大数据实验室副主任。...
  9. poj1548Robots dfs实践
  10. 为什么Windows的兼容性这么强大,到底用了什么技术?
  11. 自动化运维落实到位的三点基础及常用工具对比
  12. 安卓测试常用的 ADB 命令大全,非常全!!!!!
  13. 水煮TCPMP (转)
  14. Linux三剑客(grep、sed、awk)
  15. Thematic框架主题结构图
  16. 微信id修改服务器繁忙,微信终于可以修改ID了! 但,你可能不行......
  17. 上拉电阻的作用原理_单片机P0口以及上拉电阻
  18. 百度云盘照片导入华为相册里_怎么把云相册的照片导到手机相册里?
  19. SQLSERVER 数据库邮件发送以表格形式发送(存储过程内容发邮件)
  20. python出错 unexpected keyword argument 'categories'

热门文章

  1. 将word文档按分页另存为多个word文件的VBA代码
  2. 使用Apache Archiva搭建Maven Repository Server
  3. 5 加盐_工业软水处理器定期加盐的标准
  4. leetcode算法题--二叉搜索树迭代器
  5. SQL Select语句完整的执行顺序:
  6. react: nextJs koa project basic structure
  7. P2689 东南西北
  8. Spring 多视图配置
  9. Java基础-重写方法
  10. eclipse开发项目关于内存是如何分配的