2

floor planПоворот изображения линий в системе координат

Предположим, у меня есть изображение плана этажа, как это показано выше. Есть ли простой способ обработки, чтобы превратить это изображение в набор строк, представленных координатами [(x1, y1), (x2, y2)], [(x2, y2), (x3, y3)], ..., [(xn-1, yn-1), (xn, yn)]

+0

Является ли это изображением того, что вам нужно обработать, или просто пояснительным эскизом? Это может иметь большое значение. –

+0

Представитель. – user2562609

+0

это задача компьютерного зрения, и в CV нет такой вещи, как простая. Вам нужно предоставить реальное входное изображение, чтобы мы увидели, что вы действительно имеете в виду. 2. Я начну с бинаризации изображения каким-либо способом (но если реальное изображение - это другой тип/шум/иллюминация, тогда это может быть не так) 3.Detect lines by hough transform или путем проверки/регрессии найденных пикселей соседей, соединяющих прямые линии. Этот процесс также называется векторизации, поэтому вы знаете, что искать , Это может быть значительно упрощено, если линии имеют ось/угол, а также постоянную известную ширину. – Spektre

ответ

0

Я думаю, вы хотите найти координаты всех линий, которые у вас есть на изображении. Это очень легко найти координаты, следуя инструкции в C++:

  1. Пороговых бинарные Перевернутый
  2. Применить Thinning algorithm уменьшить толщину.
  3. Найдите ненулевые пиксели в двоичном изображении.
  4. Найти контуры & Применить Approx poly для приближения точек.

void thinningIteration(Mat& im, int iter) 
{ 
    Mat marker = Mat::zeros(im.size(), CV_8UC1); 
    for (int i = 1; i < im.rows-1; i++) 
    { 
     for (int j = 1; j < im.cols-1; j++) 
     { 
      uchar p2 = im.at<uchar>(i-1, j); 
      uchar p3 = im.at<uchar>(i-1, j+1); 
      uchar p4 = im.at<uchar>(i, j+1); 
      uchar p5 = im.at<uchar>(i+1, j+1); 
      uchar p6 = im.at<uchar>(i+1, j); 
      uchar p7 = im.at<uchar>(i+1, j-1); 
      uchar p8 = im.at<uchar>(i, j-1); 
      uchar p9 = im.at<uchar>(i-1, j-1); 

      int A = (p2 == 0 && p3 == 1) + (p3 == 0 && p4 == 1) + 
        (p4 == 0 && p5 == 1) + (p5 == 0 && p6 == 1) + 
        (p6 == 0 && p7 == 1) + (p7 == 0 && p8 == 1) + 
        (p8 == 0 && p9 == 1) + (p9 == 0 && p2 == 1); 
      int B = p2 + p3 + p4 + p5 + p6 + p7 + p8 + p9; 
      int m1 = iter == 0 ? (p2 * p4 * p6) : (p2 * p4 * p8); 
      int m2 = iter == 0 ? (p4 * p6 * p8) : (p2 * p6 * p8); 

      if (A == 1 && (B >= 2 && B <= 6) && m1 == 0 && m2 == 0) 
       marker.at<uchar>(i,j) = 1; 
     } 
    } 
    im &= ~marker; 
} 

void thinning(Mat& im) 
{ 
    im /= 255; 
    Mat prev = Mat::zeros(im.size(), CV_8UC1); 
    Mat diff; 
    do 
    { 
     thinningIteration(im, 0); 
     thinningIteration(im, 1); 
     absdiff(im, prev, diff); 
     im.copyTo(prev); 
    } 
    while (countNonZero(diff) > 0); 

    im *= 255; 
} 

void main() 
{ 
    Mat mSource_Bgr,mSource_Gray,mThreshold,mThinning; 
    mSource_Bgr= imread(FileName_S.c_str(),IMREAD_COLOR); 
    mSource_Gray= imread(FileName_S.c_str(),0); 

    threshold(mSource_Gray,mThreshold,120,255,THRESH_BINARY_INV); 

    mThinning= mThreshold.clone(); 

    thinning(mThinning); 

    imshow("mThinning",mThinning); 

enter image description here

vector<Point2i> locations; // output, locations of non-zero pixels 
    findNonZero(mThinning, locations); 

    for (int i = 0; i < locations.size(); i++) 
    { 
     circle(mSource_Bgr,locations[i],2,Scalar(0,255,0),1); 
    } 

    imshow("mResult",mSource_Bgr); 

enter image description here

//To Find the Lines from the image 
    vector<vector<Point> > contours; 
    vector<Vec4i> hierarchy; 
    /// Find contours 
    findContours(mThinning.clone(), contours, hierarchy, CV_RETR_EXTERNAL, CV_CHAIN_APPROX_SIMPLE, Point(0, 0)); 
    /// Approximate contours to polygons + get bounding rects and circles 
    vector<vector<Point> > contours_poly(contours.size()); 
    for(size_t i = 0; i < contours.size(); i++) 
    { 
     approxPolyDP(Mat(contours[i]), contours_poly[i], 2, true); 
    } 

    for (int i = 0; i < contours_poly.size(); i++) 
    { 
     drawContours(mSource_Bgr,contours_poly,i,Scalar(255,0,0),2); 
    } 
    imshow("mResult",mSource_Bgr); 

enter image description here

} 
+0

, который возвращает только изображение, в котором ему нужен полигон в векторной форме ... также вы забыли указать, на каком языке написан ваш код (или я пропустил его) – Spektre

+0

Спасибо, что указал на мое непонимание @Spektre. Теперь все имеет смысл, я думаю! –

Смежные вопросы