AD表示像素的灰度差绝对值,SAD表示待匹配像素邻域内所有像素的AD之和。假设左像待匹配像素为P,其邻域为PN ,视差为d,右影像对应像素为p-d,则
AD 匹配代价为
SAD匹配代价为
![](https://i-blog.csdnimg.cn/blog_migrate/4e0b3b89dce9741a4303ae34f1a1cf19.png)
SAD的代码如下:
inline bool XYCheck(const cv::Mat& img, const cv::Point2i& p)
{
return p.x >= 0 && p.x < img.cols&& p.y >= 0 && p.y < img.rows;
}
inline bool XYCheck(const cv::Mat& img, int c, int r)
{
return c >= 0 && c < img.cols&& r >= 0 && r < img.rows;
}
double SAD(const cv::Mat& img1, int c1, int r1,
const cv::Mat& img2, int c2, int r2, int size)
{
if (img1.type() != CV_8UC1 || !XYCheck(img1, c1, r1)
|| img2.type() != CV_8UC1 || !XYCheck(img2, c2, r2) || size <= 0)
{
return FLT_MAX;
}
double diff = 0;
int num = 0;
for (int i = -size; i <= size; i++)
{
for (int j = -size; j <= size; j++)
{
if (XYCheck(img1, c1 + j, r1 + i)
&& XYCheck(img2, c2 + j, r2 + i))
{
diff += fabs(img1.ptr<uchar>(r1 + i)[c1 + j] -
img2.ptr<uchar>(r2 + i)[c2 + j]);
++num;
}
}
}
return num != 0 ? diff / num : FLT_MAX;
}
double SAD(const cv::Mat& img1, const cv::Point2i& p1,
const cv::Mat& img2, const cv::Point2i& p2, int size)
{
return SAD(img1, p1.x, p1.y, img2, p2.x, p2.y, size);
}
本人水平有限,如有错误,还望不吝指正,代码有一定删减,没有重新编译,如有错误,请自行调试,有问题请邮箱联系1299771369@qq.com。