gpt4 book ai didi

opencv - 如何使用OpenCV检测房间边界

转载 作者:行者123 更新时间:2023-12-02 16:07:29 26 4
gpt4 key购买 nike

我想清除平面图并检测墙壁。我找到了这个解决方案,但是很难理解代码。
特别是这一行(如何删除房间内的文本和其他对象?)

DeleteSmallComponents[Binarize[img, {0, .2}]];

https://mathematica.stackexchange.com/questions/19546/image-processing-floor-plan-detecting-rooms-borders-area-and-room-names-t
img = Import["http://i.stack.imgur.com/qDhl7.jpg"]
nsc = DeleteSmallComponents[Binarize[img, {0, .2}]];
m = MorphologicalTransform[nsc, {"Min", "Max"}]

如何使用OpenCV进行相同操作?

最佳答案

在opencv中,处理镜像的方法略有不同。为了进行一些计算,您必须以更底层的方式进行思考。简而言之,我的意思是思考基本的图像处理操作。

例如,您显示的行:

DeleteSmallComponents[Binarize[img, {0, .2}]];

可以通过算法在opencv中表示:
  • 将图像二值化
  • 形态学上的打开/关闭或简单的扩张/腐 eclipse (基于对象和背景的颜色):
    cv::threshold(img, img, 100, 255, CV_THRESH_BINARY);
    cv::dilate(img, img, cv::Mat());
    cv::dilate(img, img, cv::Mat());

  • enter image description here

    此外,您可以实现自己的距离转换,或使用例如“命中与失败”例程(这在opencv中基本实现)来检测拐角:
    cv::Mat kernel = (cv::Mat_<int>(7, 7) <<
    0, 1, 0,0,0,0,0,
    -1, 1, 0,0,0,0,0,
    -1, 1, 0,0,0,0,0,
    -1,1,0,0,0,0,0,
    -1,1,0,0,0,0,0,
    -1,1,1,1,1,1,1,
    -1,-1,-1,-1,-1,-1,0);
    cv::Mat left_down,left_up,right_down,right_up;
    cv::morphologyEx(img, left_down, cv::MORPH_HITMISS, kernel);
    cv::flip(kernel, kernel, 1);
    cv::morphologyEx(img, right_down, cv::MORPH_HITMISS, kernel);
    cv::flip(kernel, kernel, 0);
    cv::morphologyEx(img, right_up, cv::MORPH_HITMISS, kernel);
    cv::flip(kernel, kernel, 1);
    cv::morphologyEx(img, left_up, cv::MORPH_HITMISS, kernel);

    然后您将获得如下图片:

    left_down corners
    一幅更大点的图片(单次放大后):

    enter image description here
    最后,您可以处理找到的拐角坐标以确定房间。

    编辑:对于具有“双壁线”的图像,例如:
    enter image description here

    我们必须首先“合并”双墙线,因此代码将如下所示:
     cv::threshold(img, img, 220, 255, CV_THRESH_BINARY);
    cv::dilate(img, img, cv::Mat()); //small object textures
    cv::erode(img, img, cv::getStructuringElement(CV_SHAPE_RECT, cv::Size(5, 5)),cv::Point(-1,-1),2);
    cv::dilate(img, img, cv::getStructuringElement(CV_SHAPE_RECT, cv::Size(5, 5)), cv::Point(-1, -1), 3);

    结果图像:

    enter image description here

    可悲的是,如果图像属性发生变化,您将不得不稍微改变算法参数。有可能提供一般的解决方案,但是您必须确定问题的大多数可能变体,它将变得更加复杂。

    关于opencv - 如何使用OpenCV检测房间边界,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46460926/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com