2016-01-16 1 views
2

J'ai une image simple contenant des formes: des rectangles et des ellipses, au nombre de 4 ou 5. Les formes peuvent être tournées, mises à l'échelle et superposées. Il y a un exemple d'entrée: Sample image Ma tâche est de détecter toutes ces figures et de préparer quelques informations à leur sujet: taille, position, rotation, etc. À mon avis, le problème central est le fait que les formes peuvent être chevauchées par L'un et l'autre. J'ai essayé de rechercher des informations sur ce genre de problème et de trouver que la bibliothèque OpenCV peut être très utile. OpenCV a la capacité de détecter les contours, puis d'essayer de placer des ellipses ou des rectangles sur ces contours. Le problème est que lorsque les formes sont surlignées, les contours sont mélangés.Reconnaissance de formes superposées (OpenCV)

Je pense à l'algorithme suivant: détecter tous les points caractéristiques: et mettre un point blanc sur eux. J'ai quelque chose comme ça où chaque figure est divisée en sections distinctes: enter image description here Ensuite, je peux essayer de relier ces parties en utilisant des informations, par exemple la valeur de complexité (j'ajuste la courbe approxPolyDP au contour et la lire combien de parties il a). Mais ça commence à être très dur. L'autre idée est d'essayer toutes les permutations de relier les contours et d'essayer de les adapter aux figures. La meilleure compilation sera sortie.

Des idées pour créer une solution simple mais élégante?

+0

comment trouvez-vous les points de jonction? Je pense que flou comme suggéré ci-dessous n'est pas basé sur une propriété mathématique juste son ad-hoc essayer-et-voir - Si vous pouvez trouver les points de jonction alors il devient un problème de graphique; chaque segment entrant aura un segment de sortie possible et basé sur la courbure que vous pouvez faire correspondre. Mais comment détectez-vous les points de jonction? – gpasch

+0

J'ai essayé plusieurs méthodes pour trouver des coins et j'ai trouvé que 'goodFeaturesToTrack' fonctionne le mieux dans ce cas. Le désavantage est qu'il détecte non seulement les jonctions, mais aussi les coreners du rectangle. La capacité de détecter uniquement les jonctions sera simplement l'algorithme à mon avis. –

+0

si elle détecte les coins rectangle c'est tout aussi bien - vous devez jumeler un segment avec un segment - si goodFeaturesToTrack trouve exactement tous vos points surlignés puis c'est ce dont vous avez besoin – gpasch

Répondre

0
flou de l'image

aide à trouver les intersections comme on le voit dans le code

#include "opencv2/imgproc.hpp" 
#include "opencv2/highgui.hpp" 

using namespace cv; 

int main(int argc, char** argv) 
{ 
    Mat src = imread(argv[1]); 
    Mat gray, blurred; 
    cvtColor(src, gray, COLOR_BGR2GRAY); 
    threshold(gray, gray, 127, 255, THRESH_BINARY); 
    GaussianBlur(gray, blurred, Size(), 9); 
    threshold(blurred, blurred, 200, 255, THRESH_BINARY_INV); 
    gray.setTo(255, blurred); 
    imshow("result",gray); 
    waitKey(); 

    return 0; 
} 

image résultat: enter image description here

étape 2

simplement, le code emprunté à generalContours_demo2.cpp

#include "opencv2/imgproc.hpp" 
#include "opencv2/highgui.hpp" 

using namespace cv; 
using namespace std; 

int main(int argc, char** argv) 
{ 
    Mat src = imread(argv[1]); 
    Mat gray, blurred; 
    cvtColor(src, gray, COLOR_BGR2GRAY); 
    threshold(gray, gray, 127, 255, THRESH_BINARY); 
    GaussianBlur(gray, blurred, Size(), 5); 
    threshold(blurred, blurred, 180, 255, THRESH_BINARY_INV); 
    gray.setTo(255, blurred); 
    imshow("result of step 1",gray); 

    vector<vector<Point> > contours; 

    /// Find contours 
    findContours(gray.clone(), contours, RETR_TREE, CHAIN_APPROX_SIMPLE); 

    /// Find the rotated rectangles and ellipses for each contour 
    vector<RotatedRect> minRect(contours.size()); 
    vector<RotatedRect> minEllipse(contours.size()); 

    for(size_t i = 0; i < contours.size(); i++) 
    { 
     minRect[i] = minAreaRect(Mat(contours[i])); 
     if(contours[i].size() > 5) 
     { 
      minEllipse[i] = fitEllipse(Mat(contours[i])); 
     } 
    } 

    /// Draw contours + rotated rects + ellipses 
    for(size_t i = 0; i< contours.size(); i++) 
    { 
     Mat drawing = src.clone(); 
     // contour 
     //drawContours(drawing, contours, (int)i, color, 1, 8, vector<Vec4i>(), 0, Point()); 
     // ellipse 
     ellipse(drawing, minEllipse[i], Scalar(0, 0, 255), 2); 
     // rotated rectangle 
     Point2f rect_points[4]; 
     minRect[i].points(rect_points); 
     for(int j = 0; j < 4; j++) 
      line(drawing, rect_points[j], rect_points[(j+1)%4], Scalar(0, 255, 0), 2); 
     /// Show in a window 
     imshow("results of step 2", drawing); 
     waitKey(); 
    } 

    return 0; 
} 
vous

peut obtenir des images de résultat suivantes entre autres. J'espère que vous allez résoudre l'étape finale. enter image description here enter image description here enter image description here enter image description here

+0

Merci, je vais essayer d'analyser votre solution, il semble être très simple et directe par opposition à mes idées. –

+1

J'espère que cela vous aidera. Vous pouvez essayer de changer les paramètres de 'GaussianBlur' et' threshold' (voir comment j'ai changé en 1er et 2e code) – sturkmen