KINECT2深度图的floodfill算法实现(16位ushort)

来源:互联网 发布:桌面版windows手机 编辑:程序博客网 时间:2024/06/06 19:47

KINECT2深度图的floodfill算法实现(16位ushort)

最近做Kinect2的项目,需要用到漫水填充floodfill算法,之前一直在用Opencv的函数模块,但是opencv中的floodfill只支持8位单通道或三通道的图像输入,而Kinect2得到的深度图原始数据为16位的,于是就自己写了一个Kinect2深度图的漫水填充算法。
本文主要参考http://blog.csdn.net/jia20003/article/details/8908464

四邻域像素填充法

递归层次可能过多,我自己跑程序时填充范围大的时候会崩溃,填充小范围还可以。
本模块输入为16位深度图,输出为8位黑白二值图像。

Mat image_16 输入16位深度图像
Point t Point数据,洪水填充起始点
ushort up_range 向上填充范围
ushort down_range 向下填充范围
void flood_loop(Mat image_16,Mat out,int x,int y,ushort value,ushort up_range,ushort down_range){//递归程序,容易爆内存    if(out.at<uchar>(y,x) != 255){        if(image_16.at<ushort>(y,x)<=(up_range +value) && (value- down_range)<=image_16.at<ushort>(y,x))        {            out.at<uchar>(y,x) = 255;            ushort test =image_16.at<ushort>(y,x);                  if(x>0 && y>0 && x<image_16.cols && y<image_16.rows){                flood_loop(image_16,out,x+1,y,value,up_range,down_range);                flood_loop(image_16,out,x,y+1,value,up_range,down_range);                flood_loop(image_16,out,x-1,y,value,up_range,down_range);                flood_loop(image_16,out,x,y-1,value,up_range,down_range);            }        }    }}Mat flood_fill_16(Mat image_16,Point t,ushort up_range,ushort down_range){    int x = t.x;    int y = t.y;    ushort vaule = image_16.at<ushort>(y,x);    Mat out = Mat::zeros(image_16.rows,image_16.cols,CV_8UC1);    flood_loop(image_16,out,x,y,vaule,up_range,down_range);    imshow("zyb",out);    return out;}

基于扫描线的像素填充方法

此方案填充范围较大时也可以完成。
本模块输入为16位深度图,输出为8位黑白二值图像。

Mat image_16 输入16位深度图像
Point t Point数据,洪水填充起始点
ushort up_range 向上填充范围
ushort down_range 向下填充范围
void flood_line(Mat image_16,Mat out,int x,int y,ushort value,ushort up_range,ushort down_range)//这个方法效果很好{    if(out.at<uchar>(y,x) == 255) return;    int y1;    y1 = y;    while(y1 < image_16.rows  && image_16.at<ushort>(y1,x)<=(up_range +value) && (value- down_range)<=image_16.at<ushort>(y1,x))    {        out.at<uchar>(y1,x) =255;        y1++;    }    y1 =y-1;    while(y1 >=0  && image_16.at<ushort>(y1,x)<=(up_range +value) && (value- down_range)<=image_16.at<ushort>(y1,x))    {        out.at<uchar>(y1,x) =255;        y1--;    }    y1 = y;    while(y1 < image_16.rows && out.at<uchar>(y1,x) ==255)    {        if(x>0 && image_16.at<ushort>(y1,x-1)<=(up_range +value) && (value- down_range)<=image_16.at<ushort>(y1,x-1))        {            flood_line(image_16,out,x-1,y1,value,up_range,down_range);        }        y1++;    }    y1 =y-1;    while(y1 >0 && out.at<uchar>(y1,x) ==255)    {        if(x>0 && image_16.at<ushort>(y1,x-1)<=(up_range +value) && (value- down_range)<=image_16.at<ushort>(y1,x-1))        {            flood_line(image_16,out,x-1,y1,value,up_range,down_range);        }        y1--;    }    y1 =y;    while(y1 < image_16.rows && out.at<uchar>(y1,x) ==255)    {        if(x<(image_16.cols -1) && image_16.at<ushort>(y1,x+1)<=(up_range +value) && (value- down_range)<=image_16.at<ushort>(y1,x+1))        {            flood_line(image_16,out,x+1,y1,value,up_range,down_range);        }        y1++;    }    y1 =y-1;    while(y1 >0 && out.at<uchar>(y1,x) ==255)    {        if(x<(image_16.cols -1) && image_16.at<ushort>(y1,x+1)<=(up_range +value) && (value- down_range)<=image_16.at<ushort>(y1,x+1))        {            flood_line(image_16,out,x+1,y1,value,up_range,down_range);        }        y1--;    }}Mat flood_fill_16(Mat image_16,Point t,ushort up_range,ushort down_range){    int x = t.x;    int y = t.y;    ushort vaule = image_16.at<ushort>(y,x);    Mat out = Mat::zeros(image_16.rows,image_16.cols,CV_8UC1);    flood_line(image_16,out,x,y,vaule,up_range,down_range);    imshow("zyb",out);    return out;}
0 0
原创粉丝点击