C++ opencv 双目视觉视差匹配算法 SAD算法

鸭梨鸭梨 2017-04-29 03:51:13
void main()
{
Mat srcImgL, srcImgR;
srcImgL = imread("imgs/l_04.jpg",0);
srcImgR = imread("imgs/r_04.jpg",0);
if (srcImgL.data == 0 && srcImgR.data == 0)
{
cout << "img error!" << endl;
}
imshow("srcImgL",srcImgL);
imshow("srcImgR",srcImgR);
resize(srcImgL,srcImgL,Size(srcImgL.cols,srcImgR.rows));
resize(srcImgR,srcImgR,Size(srcImgR.cols,srcImgR.rows));
imshow("resize-srcImgL", srcImgL);
imshow("resize-srcImgR", srcImgR);
/*-------------------------------------Range's demo------------------------------------------*/
/*
Mat test = (Mat_<int>(5, 5) << 0, 1, 2, 3, 4,
5, 6, 7, 8, 9,
10, 11, 12, 13, 14,
15, 16, 17, 18, 19,
20, 21, 22, 23, 24);
Mat test2 = test(Range(0,3),Range(2,5));
cout << test2 << endl;
*/
int winsize = 30;
int diff = 30;
int rowsize = srcImgL.rows - winsize;
int colsize = srcImgL.cols - winsize-diff;
Mat dis(rowsize,colsize,CV_8UC1,Scalar(0));
for (int i = 0; i < rowsize; ++i)
{
uchar *data = dis.ptr<uchar>(i);
for (int j = 0; j < colsize; ++j)
{
Mat reference = srcImgL(Range(i,i+winsize+1),Range(j,j+winsize+1));
long long tempsad = 99999999999999;
int targetdiff = 0;
for (int k = 0; k < diff; ++k)
{
Mat target = srcImgR(Range(i,i+winsize+1),Range(k+j,k+j+winsize+1));
Mat subtraction(winsize, winsize, CV_8UC1, Scalar(0));
absdiff(reference, target, subtraction);
if ((sum(subtraction)[0]) < tempsad)//匹配最小的sad值,并取得该位置的视差
{
tempsad = sum(subtraction)[0];
targetdiff = diff - k;
}
}
//cout << tempsad << endl;
//cout << targetdiff << endl;
//cout << i << ","<<j << endl;

data[j] = targetdiff;
}
}
imshow("dis",dis);
//cout << dis << endl;
dis.release();
srcImgL.release();
srcImgR.release();
waitKey(0);
system("pause");
}
匹配效果:

各位大神帮我看看是我的算法写的不对吗?这视差图出来的效果太差了,就算SAD算法的效果不好,也不至于这么差吧。
...全文
1596 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

3,882

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 其它技术问题
社区管理员
  • 其它技术问题社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧