анализ формы, чтобы отличать прямоугольники от других форм

Я пытался выполнить анализ формы, чтобы отличить прямоугольные объекты от непрямоугольных объектов (например, полукругов), используя двоичные изображения.

Некоторые возможные примеры

Прямоугольники

введите здесь описание изображения  введите описание изображения здесь

Непрямоугольники

введите здесь описание изображения  введите описание изображения здесь

Мой алгоритм работает следующим образом:

  1. Извлеките маску объекта с помощью контуров - openCV (как вы можете видеть в приведенных выше примерах)
  2. Выполните анализ формы или вычислите статистику, чтобы определить, является ли объект прямоугольным или нет.

До сих пор я пробовал меры эксцентриситета и прямоугольности.

Например: в идеале прямоугольность должна быть высокой только для прямоугольников. В своих экспериментах я иногда получаю подобную прямоугольность для прямоугольного или круглого объекта. Поэтому я не могу использовать эту меру для анализа, потому что она ненадежна.

Та же проблема возникает с эксцентриситетом. В идеале круг имеет нулевой эксцентриситет, а для прямоугольного объекта он должен быть очень высоким. Но оказывается, что для прямоугольников или кругов очень похоже.

Есть ли способ определить, является ли объект примерно прямоугольником или не используя никакой геометрической информации ??

Любая помощь будет действительно оценена


person user1388142    schedule 28.04.2016    source источник
comment
Пожалуйста, определите работу хорошо, надежно и точно. Как выглядит код анализа? Каковы ваши ожидаемые результаты? Какие реальные результаты вы получаете сейчас?   -  person Dan Mašek    schedule 29.04.2016
comment
привет, я отредактировал вопрос и предоставил подробности   -  person user1388142    schedule 29.04.2016


Ответы (1)


Я думаю, что вы можете использовать приблизительноPolyDP. Я даю вам программу на C ++ и думаю, что ее легко перевести на Python. Идея ищет форму с четырьмя углами, которая приближается к реальному контуру, а затем вычисляет четыре угла (угловой угол). при количестве точек контура больше 4 увеличивается ошибка между новым контуром и реальным контуром. Вам нужно выбрать пороговый угол (90 +/- x °) после того, как вы подумаете, что это не прямоугольник. (Простите за плохой английский)

#include "opencv2/opencv.hpp"
#include <iostream>

using namespace cv;
using namespace std;


int main(int argc, char **argv)
{
vector<String> fileName;
fileName.push_back("2nrTo.jpg");
fileName.push_back("G3I4t.jpg");
fileName.push_back("Q4ZtM.jpg");
fileName.push_back("vWgKx.jpg");
for (int i = 0; i < static_cast<int>(fileName.size()); i++)
{
    Mat mThresh;
    Mat m=imread(fileName[i],CV_LOAD_IMAGE_GRAYSCALE);
    Mat mc;
    vector<vector<Point> > contours;
    vector<Vec4i> hierarchy;
    threshold(m,mThresh,80,255,THRESH_BINARY);
    findContours(mThresh,contours,hierarchy, cv::RETR_CCOMP, cv::CHAIN_APPROX_NONE, cv::Point(0,0));
    cout << "Image " << fileName[i] << "\n";
    imshow(fileName[i],m);
    mc = Mat::zeros(m.size(),CV_8UC3);
    drawContours(mc,contours,0,Scalar(255,0,0),1);
    vector<Point> approx;
    double d=0;
    do
    {
        d=d+1;
        approxPolyDP(contours[0],approx,d,true);
    }
    while (approx.size()>4);
    cout << "#vertices =" <<approx.size() << "\t error max= " <<d<<endl;
    if (approx.size() == 4)
    {
        cout << "Angles\n";
        Point2d u(approx[1]-approx[0]),v(approx[2]-approx[1]),w(approx[3]-approx[2]),x(approx[3]-approx[0]);
        cout<<acos(u.dot(v) / norm(u) / norm(v))<<"\n";
        cout<<acos(v.dot(w) / norm(v) / norm(w))<<"\n";
        cout<<acos(w.dot(x) / norm(w) / norm(x))<<"\n";
        cout<<acos(x.dot(u) / norm(x) / norm(u))<<"\n";

    }
    else
        cout << "looks like a triangle\n";
    contours.push_back(approx);
    drawContours(mc,contours,contours.size()-1,Scalar(0,0,255),1);
    imshow("Ctr",mc);
    waitKey();
}

return 0;
}

С предыдущими изображениями программа дает следующие результаты:

Image 2nrTo.jpg
#vertices =4     error max= 17
Angles
93.3283
90.2247
90
93.553
Image G3I4t.jpg
#vertices =4     error max= 15
Angles
112.503
46.3837
110.346
48.5412
Image Q4ZtM.jpg
#vertices =4     error max= 6
Angles
88.9191
90.0297
88.9488
90
Image vWgKx.jpg
#vertices =4     error max= 49
Angles
87.0753
117.999
90.3148
114.76
person LBerger    schedule 30.04.2016
comment
Просто для уточнения. Углы вычисляются между двумя точками справа ?? Вы можете немного объяснить логику !! Спасибо - person user1388142; 02.05.2016