#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <time.h>
#include "cv.h"
#include "highgui.h"
// #define IMGHEIGHT 240
// #define IMGWIDTH 320
int IMGHEIGHT;
int IMGWIDTH;
#define DOMAIN 128
#define WndWidth 9
#define CODEWIDTH 80
typedef struct
{
int codebit[80];
}CodeStruct;
void SAD(unsigned char *LeftImg, unsigned char *RightImg, unsigned char *Disparity);
void SSD(unsigned char *LeftImg, unsigned char *RightImg, unsigned char *Disparity);
void NCC(unsigned char *LeftImg, unsigned char *RightImg, unsigned char *Disparity);
void NSSD(unsigned char *LeftImg, unsigned char *RightImg, unsigned char *Disparity);
void Census(unsigned char *LeftImg, unsigned char *RightImg, unsigned char *Disparity);
void Rank(unsigned char *LeftImg, unsigned char *RightImg, unsigned char *Disparity);
void CensusTransform(unsigned char *Image, CodeStruct Code[]);
int HammingDist( CodeStruct Code1, CodeStruct Code2 );
void RankTransform(unsigned char *Image, unsigned char *RankValue);
void SAD(unsigned char *LeftImg, unsigned char *RightImg, unsigned char *Disparity)
{
int i,j,d;
int absDiff;
int minSum;
int disp;
int *Col;
int *Wnd;
Col = new int[IMGWIDTH*DOMAIN];
Wnd = new int[IMGWIDTH*DOMAIN];
for( i=0; i<IMGWIDTH*DOMAIN; i++ )
{
Col[i]=0;
Wnd[i]=0;
}
for( j=0; j<IMGHEIGHT; j++ )
{
for( i=0; i<IMGWIDTH; i++ )
{
minSum=100000;
disp=0;
for( d=0; d<DOMAIN; d++ )
{
if( i>=DOMAIN )
absDiff=abs(LeftImg[j*IMGWIDTH+i]-RightImg[j*IMGWIDTH+i-d]);
else
absDiff=0;
Col[i*DOMAIN+d]=Col[i*DOMAIN+d]+absDiff;
if( j>WndWidth )
{
if( i>DOMAIN )
absDiff=abs(LeftImg[(j-WndWidth)*IMGWIDTH+i]-RightImg[(j-WndWidth)*IMGWIDTH+i-d]);
else
absDiff=0;
Col[i*DOMAIN+d]=Col[i*DOMAIN+d]-absDiff;
}
if( i<DOMAIN || j<WndWidth )
Wnd[i*DOMAIN+d]=0;
else
Wnd[i*DOMAIN+d]=Wnd[(i-1)*DOMAIN+d]+Col[i*DOMAIN+d]
-Col[(i-WndWidth)*DOMAIN+d];
/*
if( i>WndWidth )
Wnd[i*DOMAIN+d]=Wnd[(i-1)*DOMAIN+d]+Col[i*DOMAIN+d]-Col[(i-WndWidth)*DOMAIN+d];
else
{
if( i>d )
absDiff=abs(LeftImg[j*IMGWIDTH+i]-RightImg[j*IMGWIDTH+i-d]);
else
absDiff=0;
Wnd[i*DOMAIN+d]=Wnd[i*DOMAIN+d]+absDiff;
if( j>WndWidth )
{
if( i>d )
absDiff=abs(LeftImg[(j-WndWidth)*IMGWIDTH+i]-RightImg[(j-WndWidth)*IMGWIDTH+i-d]);
else
absDiff=0;
Wnd[i*DOMAIN+d]=Wnd[i*DOMAIN+d]-absDiff;
}
}
*/
if( Wnd[i*DOMAIN+d]<minSum )
{
minSum=Wnd[i*DOMAIN+d];
disp=d*15;
}
}
if( j>WndWidth && i>DOMAIN )
Disparity[ j * IMGWIDTH+ i]=disp;
}
}
delete []Col;
delete []Wnd;
}
void SSD(unsigned char *LeftImg, unsigned char *RightImg, unsigned char *Disparity)
{
int i,j,d;
int minSum;
int sqDiff;
int disp;
int *Col;
int *Wnd;
Col = new int[IMGWIDTH*DOMAIN];
Wnd = new int[IMGWIDTH*DOMAIN];
for( i=0; i<IMGWIDTH*DOMAIN; i++ )
{
Col[i]=0;
Wnd[i]=0;
}
for( j=0; j<IMGHEIGHT; j++ )
for( i=0; i<IMGWIDTH; i++ )
{
minSum=100000;
disp=0;
for( d=0; d<DOMAIN; d++ )
{
if( i>DOMAIN )
sqDiff=(int)pow((double)(LeftImg[j*IMGWIDTH+i]-RightImg[j*IMGWIDTH+i-d]),2);
else
sqDiff=0;
Col[i*DOMAIN+d]=Col[i*DOMAIN+d]+sqDiff;
if( j>WndWidth )
{
if( i>DOMAIN )
sqDiff=(int)pow((double)(LeftImg[(j-WndWidth)*IMGWIDTH+i]-RightImg[(j-WndWidth)*IMGWIDTH+i-d]),2);
else
sqDiff=0;
Col[i*DOMAIN+d]=Col[i*DOMAIN+d]-sqDiff;
}
if( i<DOMAIN || j<WndWidth )
Wnd[i*DOMAIN+d]=0;
else
Wnd[i*DOMAIN+d]=Wnd[(i-1)*DOMAIN+d]+Col[i*DOMAIN+d]
-Col[(i-WndWidth)*DOMAIN+d];
if( Wnd[i*DOMAIN+d]<minSum )
{
minSum=Wnd[i*DOMAIN+d];
disp=d*15;
}
}
if( j>WndWidth && i>DOMAIN )
Disparity[j * IMGWIDTH+ i]=disp;
}
delete []Col;
delete []Wnd;
}
void Rank(unsigned char *LeftImg, unsigned char *RightImg, unsigned char *Disparity)
{
unsigned char *lfRankValue,*rtRankValue;
lfRankValue = new unsigned char[IMGHEIGHT*IMGWIDTH];
rtRankValue = new unsigned char[IMGHEIGHT*IMGWIDTH];
RankTransform(LeftImg,lfRankValue);
RankTransform(RightImg,rtRankValue);
SAD(lfRankValue,rtRankValue,Disparity);
}
void RankTransform(unsigned char *Image, unsigned char *RankValue)
{
int i,j,p,q;
int TRANSWIND;
int count;
unsigned char center,neighbor;
TRANSWIND = 4;
for( i=0 ; i<IMGHEIGHT ; i++ )
for( j=0 ; j<IMGWIDTH ; j++ )
{
center = Image[i*IMGWIDTH+j];
count=0;
for( p=i-TRANSWIND ; p<=i+TRANSWIND ; p++ )//9*9 wnd
{
for(q=j-TRANSWIND ; q<=j+TRANSWIND ; q++)
{
if( !((p==i)&&(q==j)) )
{
if(p<0 || p>=IMGHEIGHT || q<0 ||q>=IMGWIDTH)
neighbor = 0;
else
neighbor = Image[p*IMGWIDTH+q];
if( neighbor > center )
count++;
}
}
}
RankValue[i*IMGWIDTH+j]=count;
}
}
void Census(unsigned char *LeftImg, unsigned char *RightImg, unsigned char *Disparity)
{
int i,j,d;
int p,q;
int Hdist;
int minSum;
int disp;
int *Col;
int *Wnd;
CodeStruct *lfCode,*rtCode;
lfCode = new CodeStruct[IMGHEIGHT*IMGWIDTH];
rtCode = new CodeStruct[IMGHEIGHT*IMGWIDTH];
/*/////CENSUS TRANSFORM/////*/
for( i=0; i<IMGHEIGHT*IMGWIDTH; i++ )
for( j=0; j<CODEWIDTH; j++ )
{
lfCode[i].codebit[j]=0;
rtCode[i].codebit[j]=0;
}
CensusTransform( LeftImg, lfCode );
CensusTransform( RightImg, rtCode );
/*
int p_col=0;
for( int i_code=0 ; i_code<IMGHEIGHT*IMGWIDTH ; i_code++ )
{
p = i_code/IMGWIDTH;
q = i_code%IMGWIDTH;
minSum = 1000;
d=0;
while( d<32 )
{
disp = 0;
for( i=p-5 ; i<=(p+5) ; i++ )//11*11 wnd
for( j=q-5 ; j<=(q+5) ; j++ )
{
if( i<0 || i>=IMGHEIGHT || j<d || j>=IMGWIDTH )
disp +=0;
else
disp += HammingDist( lfCode[i*IMGWIDTH+j], rtCode[i*IMGWIDTH+j-d] );
}
if( disp < minSum )
{
minSum = disp;
p_col = d;
}
d++;
}
Disparity[p*IMGWIDTH+q]=p_col*12;
}
*/
Col = new int[IMGWIDTH*DOMAIN];
Wnd = new int[IMGWIDTH*DOMAIN];
for( i=0; i<IMGWIDTH*DOMAIN; i++ )
{
Col[i]=0;
Wnd[i]=0;
}
for( j=0; j<IMGHEIGHT; j++ )
for( i=0; i<IMGWIDTH; i++ )
{
minSum=100000;
disp=0;
for( d=0; d<DOMAIN; d++ )
{
if( i>DOMAIN )
Hdist=HammingDist(lfCode[j*IMGWIDTH+i],rtCode[j*IMGWIDTH+i-d]);
else
Hdist=0;
Col[i*DOMAIN+d]=Col[i*DOMAIN+d]+Hdist;
if( j>= WndWidth )
{
if( i>DOMAIN )
Hdist=HammingDist(lfCode[(j-WndWidth)*IMGWIDTH+i],rtCode[(j-WndWidth)*IMGWIDTH+i-d]);
else
Hdist=0;
Col[i*DOMAIN+d]=Col[i*DOMAIN+d]-Hdist;
}
if( i<DOMAIN )
Wnd[i*DOMAIN+d]=0;
else
Wnd[i*DOMAIN+d]=Wnd[(i-1)*DOMAIN+d]+Col[i*DOMAIN+d]
-Col[(i-WndWidth)*DOMAIN+d];
/*
if( i>WndWidth )
Wnd[i*DOMAIN+d]=Wnd[(i-1)*DOMAIN+d]+Col[i*DOMAIN+d]-Col[(i-WndWidth)*DOMAIN+d];
else
{
if( i>d )
Hdist=HammingDist(lfCode[j*IMGWIDTH+i],rtCode[j*IMGWIDTH+i-d]);
else
Hdist=0;
Wnd[i*DOMAIN+d]=Wnd[i*DOMAIN+d]+Hdist;
if( j>WndWidth )
{
if( i>d )
Hdist=HammingDist(lfCode[(j-WndWidth)*IMGWIDTH+i],rtCode[(j-WndWidth)*IMGWIDTH+i-d]);
else
Hdist=0;
Wnd[i*DOMAIN+d]=Wnd[i*DOMAIN+d]-Hdist;
}
}
*/
if( Wnd[i*DOMAIN+d]<=minSum )
{
minSum=Wnd[i*DOMAIN+d];
disp=d*15;
}
}
if( j>WndWidth && i>DOMAIN )
Disparity[j * IMGWIDTH + i]=disp;
}
delete []lfCode;
delete []rtCode;
}
void CensusTransform(unsigned char *Image, CodeStruct Code[])
{
int i,j,p,q;
没有合适的资源?快使用搜索试试~ 我知道了~
census算法,用c编写
共30个文件
pdb:4个
png:4个
manifest:3个
5星 · 超过95%的资源 需积分: 11 42 下载量 143 浏览量
2009-03-20
11:06:28
上传
评论 1
收藏 3.96MB RAR 举报
温馨提示
用C编写的census算法,通过优化加速,更利用使用,对立体匹配的学习很有帮助
资源推荐
资源详情
资源评论
收起资源包目录
Matching.rar (30个子文件)
Matching
Matching
Matching.vcproj 4KB
imR.png 490KB
Debug
StereoMatch.obj 40KB
Matching.exe.embed.manifest 403B
Matching.exe.embed.manifest.res 468B
Matching.exe.intermediate.manifest 385B
vc80.pdb 116KB
BuildLog.htm 11KB
mt.dep 69B
vc80.idb 331KB
[Originals]
imR.png 356KB
imL.png 354KB
Matching.vcproj.ZJU-8D09BCF7A78.Administrator.user 1KB
imL.png 487KB
Release
StereoMatch.obj 36KB
Matching.exe.intermediate.manifest 380B
vc80.pdb 116KB
BuildLog.htm 8KB
mt.dep 69B
vc80.idb 139KB
Matching.vcproj.WWW-A66BA931A2B.Administrator.user 1KB
StereoMatch.cpp 12KB
release
Matching.pdb 219KB
Matching.exe 11KB
Matching.suo 10KB
Matching.ncb 12.01MB
Matching.sln 889B
debug
Matching.ilk 335KB
Matching.pdb 403KB
Matching.exe 48KB
共 30 条
- 1
yanyansuper1987
- 粉丝: 1
- 资源: 2
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
- 1
- 2
前往页