匹配代价函数之SAD

        AD表示像素的灰度差绝对值,SAD表示待匹配像素邻域内所有像素的AD之和。假设左像待匹配像素为P,其邻域为PN ,视差为d,右影像对应像素为p-d,则

AD 匹配代价为

SAD匹配代价为

 

 
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(r1 + i)[c1 + j] -
					img2.ptr(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);
}

 

本人水平有限,如有错误,还望不吝指正,代码有一定删减,没有重新编译,如有错误,请自行调试,有问题请邮箱联系[email protected]

你可能感兴趣的:(密集匹配,c++,opencv,算法,函数)