android - 如何检测墙壁的长边以准备 mask 和重新着色

标签 android iphone opencv image-processing edge-detection

主要思想是允许用户根据用户选择重新着色到特定的墙。 目前我已经使用 cvFloodFill (帮助准备蒙版图像)实现了这个功能,它可以帮助我改变墙的相对 HSV 值,这样我就可以保留边缘。但这个解决方案的问题是它适用于颜色并且所有墙壁都被重新粉刷而不是用户选择的单一墙壁。

我也尝试过精明的边缘检测,但它只能检测边缘但无法将其转换为区域。

请在下面找到我目前用于重绘功能的代码

  1. 准备口罩

    cvFloodFill(mask, new CvPoint(295, 75), new CvScalar(255, 255, 255,0), cvScalarAll(1), cvScalarAll(1), null, 4, null);

  2. 分频

    cvSplit(hsvImage, hChannel, sChannel, vChannel, null);

  3. 改变颜色

    cvAddS(vChannel, new CvScalar(255*(0.76-0.40),0,0,0), vChannel, mask);

我们如何从图像中检测边缘和相应区域。

我正在寻找可以不是 opencv 但应该适用于 iPhone 和 android 的解决方案

Sample image

编辑

我可以使用以下步骤实现如下图所示的一些结果

cvCvtColor(image, gray, CV_BGR2GRAY);   
cvSmooth(gray,smooth,CV_GAUSSIAN,7,7,0,0);
cvCanny(smooth, canny, 10, 250, 5);

此输出存在两个问题,不知道如何解决它们 1. 靠近边缘 2.去除小边

enter image description here

最佳答案

你可以试试这样的:

 Mat imageOut = Mat::zeros(imageIn.rows, imageIn.cols, CV_8UC3);

 vector<vector<Point> > contours;
 vector<Vec4i> hierarchy;    

 findContours( imageIn, contours, hierarchy, CV_RETR_CCOMP, CV_CHAIN_APPROX_SIMPLE );
 for( int idx = 0; idx >= 0; idx = hierarchy[idx][0] )
 {
     Scalar color( rand()&255, rand()&255, rand()&255 );
     drawContours( imageOut, contours, idx, color, CV_FILLED, 8, hierarchy );
 }

它应该用不同的颜色绘制墙壁。如果它有效,这意味着在“层次结构”中,每面墙都被识别为一个轮廓,然后您必须找出用户在他的触摸屏上选择了哪一个并进行颜色调整处理。

您可能需要更改“findContours”中的不同参数link . 您还需要在轮廓检测之前对输入图像进行平滑处理,以避免对细节或纹理感到厌烦。

希望对您有所帮助, 托马斯

关于android - 如何检测墙壁的长边以准备 mask 和重新着色,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16100708/

相关文章:

Android Studio gradle 不编译指定版本

android - 我能让 body 免疫重力吗?

Android:收集了新标签 - 未知标签类型

iphone - NSData 空检查

xml - Open CV 计算机视觉中的 haar 级联分类器内部是什么?

android - Android 内存不足错误

iphone - 键盘到位时移动 UIScrollView

python - 用另一张图片替换黑色背景

opencv - 使用眼睛位置作为引用裁剪检测到的面部

iphone 3.5 和 4 问题