使用OpenCV进行图像分割

时间:2014-01-04 11:56:41

标签: c++ opencv image-processing edge-detection

我是openCV的新手,想要一点帮助

所以我的基本想法是使用opencv为室内设计创建一个小应用程序。

问题

如何区分图片的墙壁和地板(即使我们在图片中有一些噪音)。

对于例如enter image description here

现在,我的想法是,如果我能找到墙壁或瓷砖的边缘,然后如果有任何将用于室内装饰的物体(例如任何椅子),那么该物体将被完美地放置在地板(即两个图像混合)

我的方法

#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv/cv.h>
using namespace cv;
using namespace std;
int main(){
  Mat image=imread("/home/ayusun/Downloads/IMG_20140104_143443.jpg");
  Mat resized_img,dst,contours,detected_edges;
  resize(image, resized_img, Size(1024, 768), 0, 0, INTER_CUBIC);
  threshold(resized_img, dst, 128, 255, CV_THRESH_BINARY);
  //Canny(image,contours,10,350);

  namedWindow("resized image");
  imshow("resized image",resized_img);

  //imshow("threshold",dst);
  blur( resized_img, detected_edges, Size(2,2) );
  imshow("blurred", detected_edges);

  Canny(detected_edges,contours,10,350);
  imshow("contour",contours);
  waitKey(0);
  return 1;
}
我尝试了canny边缘检测算法,但似乎找到了很多边缘。我仍然不知道如何将房间的地板与椅子的地板结合起来

由于

3 个答案:

答案 0 :(得分:1)

对于非自愿广告感到抱歉,但宜家使用目录智能手机应用程序,该应用程序使用增强现实技术将物体/家具放置在房间的图像周围。那是你想要做的吗?

enter image description here

为了实现这一目标,您需要一个“精确定位”,这是一个将对象挂钩的固定点。这通常有助于区分上面应用中的墙和地板(并使事情变得简单)。

即使对于人类来说,如果墙壁悬挂在他们的脚上并且墙壁/地板上具有相同的纹理,那么区分墙壁和地板也是很难的(但我们设法做到这一点归功于我们的“重力感觉“)。

查找一些关键点或请说明您是否计划使用固定相机(即它永远不会水平放置)

答案 1 :(得分:1)

在一定程度上可以从单个图像中分割墙壁和地板,但需要大量工作,如果您想获得不错的结果,则需要相当复杂的系统。你可以用一对图像(立体重建)做得更好

答案 2 :(得分:1)

OpenCV的POSIT可能对你有用(这是一个例子):http://opencv-users.1802565.n2.nabble.com/file/n6908580/main.cpp

另请参阅增强现实工具包ArUco

对于高级方法,请查看ptam

您可以在此处找到一些有用的链接和论文:http://www.doc.ic.ac.uk/~ajd/