J'ai beaucoup d'images d'annuaires avec des portraits de personnes et j'essaye de construire un algorithme qui détectera ces portraits. Au moins, pour détecter les portraits rectangulaires corrects. Example 1Example 2Détecter des portraits rectangulaires de personnes sur des images avec OpenCV
Je suis en train d'étudier trois directions:
- Détection des visages
- détection des rectangles noir (Comme portraits sont des formes généralement plus sombres sur fond clair)
- personnes d'extraction de nom de OCR'ed textes
En combinant les résultats de trois algorithmes ci-dessus, j'espère obtenir une méthodologie, qui sera applicable pour de nombreuses pages d'annuaires différentes.
Je serais très reconnaissant pour toute aide pour la détection de rectangles. J'ai commencé avec Java et OpenCV 3.
Voici mon code demandé an image:
System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
Mat source = Imgcodecs.imread("Path/to/image", Imgcodecs.CV_LOAD_IMAGE_ANYCOLOR);
Mat destination = new Mat(source.rows(), source.cols(), source.type());
Imgproc.cvtColor(source, destination, Imgproc.COLOR_RGB2GRAY);
Imgproc.GaussianBlur(destination, destination, new Size(5, 5), 0, 0, Core.BORDER_DEFAULT);
int threshold = 100;
Imgproc.Canny(destination, destination, 50, 100);
Imgproc.Canny(destination, destination, threshold, threshold*3);
À ce stade, je dois ce résultat:
Essayer de trouver les contours des bords ci-dessus:
List<MatOfPoint> contourDetections = new ArrayList<>();
Mat hierarchy = new Mat();
// Find contours
Imgproc.findContours(destination, contourDetections, hierarchy, Imgproc.RETR_EXTERNAL, Imgproc.CHAIN_APPROX_SIMPLE);
// Draw contours
Imgproc.drawContours(source, contours, -1, new Scalar(255,0,0), 2);
Mais vous ne savez pas comment extraire des rectangles de ces contours car beaucoup de lignes sont incomplètes.
Pour en revenir aux bords et en essayant de trouver des lignes verticales et horizontales à l'aide HoughLinesP:
Mat lines = new Mat();
int thre = 50;
int minLineSize = 250;
int lineGap = 80;
int ignoreLinesShorter = 300;
Imgproc.HoughLinesP(destination, lines, 1, Math.PI/180, thre, minLineSize, lineGap);
for(int c = 0; c < lines.rows(); c++) {
double[] vec = lines.get(c, 0);
double x1 = vec[0],
y1 = vec[1],
x2 = vec[2],
y2 = vec[3];
// Filtering only verticat and horizontal lines
if(x1 == x2 || y1 == y2) {
// Filtering out short lines
if(Math.abs(x1 - x2) > ignoreLinesShorter || Math.abs(y1 - y2) > ignoreLinesShorter) {
Point start = new Point(x1, y1);
Point end = new Point(x2, y2);
// Draw line
Imgproc.line(source, start, end, new Scalar(0,0,255), 2);
}
}
}
Résultat:
Comme avec les contours, je ne suis toujours pas voir rectangles corriger les Je pourrais détecter. Pourriez-vous m'aider avec une direction correcte? Peut-être qu'il existe un moyen plus facile d'effectuer cette tâche?
Les contours sont incomplets car les bords sont incomplètes. Avez-vous essayé des valeurs de seuil inférieures dans Canny? Vous pouvez également filtrer les petits contours par taille avec 'contourArea'. –
Que diriez-vous d'augmenter le seuil du contour et d'étendre toutes les lignes verticales et horizontales? –