主要思想是允许用户根据用户选择重新着色到特定的墙。
目前我已经使用 cvFloodFill
(帮助准备蒙版图像)实现了这个功能,它可以帮助我改变墙的相对 HSV
值,这样我就可以保留边缘。但这个解决方案的问题是它适用于颜色并且所有墙壁都被重新粉刷而不是用户选择的单一墙壁。
我也尝试过精明的边缘检测,但它只能检测边缘但无法将其转换为区域。
请在下面找到我目前用于重绘功能的代码
准备口罩
cvFloodFill(mask, new CvPoint(295, 75), new CvScalar(255, 255, 255,0), cvScalarAll(1), cvScalarAll(1), null, 4, null);
分频
cvSplit(hsvImage, hChannel, sChannel, vChannel, null);
改变颜色
cvAddS(vChannel, new CvScalar(255*(0.76-0.40),0,0,0), vChannel, mask);
我们如何从图像中检测边缘和相应区域。
我正在寻找可以不是 opencv
但应该适用于 iPhone 和 android 的解决方案
编辑
我可以使用以下步骤实现如下图所示的一些结果
cvCvtColor(image, gray, CV_BGR2GRAY);
cvSmooth(gray,smooth,CV_GAUSSIAN,7,7,0,0);
cvCanny(smooth, canny, 10, 250, 5);
此输出存在两个问题,不知道如何解决它们 1. 靠近边缘 2.去除小边
最佳答案
你可以试试这样的:
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/