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
- KINECT2深度图的floodfill算法实现(16位ushort)
- floodfill算法的几种实现
- FloodFill算法的优化
- 好用的算法,FloodFill
- 【转载】FloodFill算法的优化
- FloodFill(洪水填充 )算法
- FloodFill(泛洪算法)
- floodfill算法
- floodfill算法
- floodfill算法
- floodfill算法
- floodfill算法
- FloodFill算法
- FloodFill算法实现及填充改进
- floodfill()函数的应用
- kinect2.0开发笔记(二) 获取彩色图和深度图
- OpenCV实现FloodFill泛洪填充算法的代码及相关函数详解
- FloodFill(漫水填充)算法
- Android开发-对于PendingIntent的简单理解
- Android 编程下 Touch 事件的分发和消费机制
- HTTP/1.1 协议规定的 HTTP 请求方法
- Android 自定义缩放球以及水纹效果
- R语言-data.table包
- KINECT2深度图的floodfill算法实现(16位ushort)
- CSS学习(十七)-盒模型
- UVA208 Firetruck
- Odoo中Qweb使用入门
- Android中okHttp+retrofit2.0+RxJava的使用
- 网页设计与构架中的几个SEO优化原则
- 蓝桥杯-蚂蚁感冒
- 浮点数之殇
- Count of Smaller Numbers After Self