C++实现双目立体匹配Census算法的示例代码
上一篇介绍了双目立体匹配SAD算法,这一篇介绍Census算法。
Census原理:
在视图中选取任一点,以该点为中心划出一个例如3 × 3 的矩形,矩形中除中心点之外的每一点都与中心点进行比较,灰度值小于中心点记为1,灰度大于中心点的则记为0,以所得长度为 8 的只有 0 和 1 的序列作为该中心点的 census 序列,即中心像素的灰度值被census 序列替换。经过census变换后的图像使用汉明距离计算相似度,所谓图像匹配就是在匹配图像中找出与参考像素点相似度最高的点,而汉明距正是匹配图像像素与参考像素相似度的度量。具体而言,对于欲求取视差的左右视图,要比较两个视图中两点的相似度,可将此两点的census值逐位进行异或运算,然后计算结果为1 的个数,记为此两点之间的汉明值,汉明值是两点间相似度的一种体现,汉明值愈小,两点相似度愈大实现算法时先异或再统计1的个数即可,汉明距越小即相似度越高。
下面的代码是自己根据原理写的,实现的结果并没有很好,以后继续优化代码。
具体代码如下:
/
return Img_census;
}
//------------得到汉明距离---------------
int GetHammingWeight( uchar value)
{
int num = 0;
if (value == 0)
return 0;
while (value)
{
++num;
value = (value - 1)&value;
}
return num;
}
//--------------------得到视差图像--------------
Mat getDisparity(Mat &left, Mat &right)
{
int DSR =16;//视差搜索范围
Mat disparity(ImgHeight,ImgWidth,CV_8UC1);
cout << "ImgHeight = " << ImgHeight << " " << "ImgWidth = " << ImgWidth << endl;
for (int i = 0; i < ImgHeight; i++)
{
for (int j = 0; j < ImgWidth; j++)
{
uchar L;
uchar R;
uchar diff;
L = left.at<uchar>(i, j);
Mat Dif(1, DSR, CV_8UC1);
// Mat Dif(1, DSR, CV_32F);
for (int k = 0; k < DSR; k++)
{
//cout << "k = " << k << endl;
int y = j - k;
if (y < 0)
{
Dif.at<uchar>(k) = 0;
}
if (y >= 0)
{
R = right.at<uchar>(i,y);
//bitwise_xor(L, R, );
diff = L^R;
diff = GetHammingWeight(diff);
Dif.at<uchar>(k) = diff;
// Dif.at<float>(k) = diff;
}
}
//---------------寻找最佳匹配点--------------
Point minLoc;
minMaxLoc(Dif, NULL, NULL, &minLoc, NULL);
int loc = minLoc.x;
//cout << "loc..... = " << loc << endl;
disparity.at<uchar>(i,j)=loc*16;
}
}
return disparity;
}
//-------------对得到的视差图进行处理-------------------
Mat ProcessDisparity(Mat &disImg)
{
Mat ProcessDisImg(ImgHeight,ImgWidth,CV_8UC1);//存储处理后视差图
for (int i = 0; i < ImgHeight; i++)
{
for (int j = 0; j < ImgWidth; j++)
{
uchar pixel = disImg.at<uchar>(i, j);
if (pixel < 100)
pixel = 0;
ProcessDisImg.at<uchar>(i, j) = pixel;
}
}
return ProcessDisImg;
}
经过处理后的左图census图像
经过处理后的右图census图像
disparity图像
处理后的disparity图像
以上就是c++实现双目立体匹配Census算法的示例代码的详细内容,更多关于C++双目立体匹配Census算法的资料请关注其它相关文章!
相关文章