Comment identifier carré ou un rectangle avec différentes longueurs et largeur en utilisant javacv?
Je suis le développement de projet à l'aide de java pour identifier les composants à l'aide d'opencv paquet, mais je suis nouveau sur javacv et je veux juste savoir comment identifier les rectangles d'une source particulière de l'image s'il vous plaît pouvez une certaine expérience de la personne de donner quelques notions de la ligne guide vers l'archive cette tâche. J'essaie d'utiliser un modèle d'appariement ici, mais il permet d'identifier exactement la taille du rectangle. Mais Dans mon cas, j'ai besoin d'identifier de longueur variable rectangle ?
import java.util.Arrays;
import static com.googlecode.javacv.cpp.opencv_core.*;
import static com.googlecode.javacv.cpp.opencv_imgproc.*;
import static com.googlecode.javacv.cpp.opencv_highgui.*;
public class TestingTemplate {
public static void main(String[] args) {
//Original Image
IplImage src = cvLoadImage("src\\lena.jpg",0);
//Template Image
IplImage tmp = cvLoadImage("src\\those_eyes.jpg",0);
//The Correlation Image Result
IplImage result = cvCreateImage(cvSize(src.width()-tmp.width()+1, src.height()-tmp.height()+1), IPL_DEPTH_32F, 1);
//Init our new Image
cvZero(result);
cvMatchTemplate(src, tmp, result, CV_TM_CCORR_NORMED);
double[] min_val = new double[2];
double[] max_val = new double[2];
//Where are located our max and min correlation points
CvPoint minLoc = new CvPoint();
CvPoint maxLoc = new CvPoint();
cvMinMaxLoc(result, min_val, max_val, minLoc, maxLoc, null); //the las null it's for
optional mask mat()
System.out.println(Arrays.toString(min_val)); //Min Score
System.out.println(Arrays.toString(max_val)); //Max Score
CvPoint point = new CvPoint();
point.x(maxLoc.x()+tmp.width());
point.y(maxLoc.y()+tmp.height());
cvRectangle(src, maxLoc, point, CvScalar.WHITE, 2, 8, 0); //Draw the rectangule result in original img.
cvShowImage("Lena Image", src);
cvWaitKey(0);
//Release
cvReleaseImage(src);
cvReleaseImage(tmp);
cvReleaseImage(result);
}
}
Veuillez peut-on aider à accomplir cette
Les places? Squires sont plus difficiles.
Dave: s'il vous Plaît pouvez-vous donner quelques ligne de guilde pour l'archivage de ce >
Est-il squire ou CARRÉ ? si non, qu'est-ce que l'écuyer? google dit que c'est l'armure des soldats. Est-ce que vous voulez? Mieux ajouter une image.
Ohh je viens de voir que l'erreur que j'ai vraiment besoin d'identifier des rectangles et des carrés sur l'image. vraiment désolé pour l'erreur que j'avais fait. Maintenant, j'avais corrigé la question.
Dave: s'il vous Plaît pouvez-vous donner quelques ligne de guilde pour l'archivage de ce >
Est-il squire ou CARRÉ ? si non, qu'est-ce que l'écuyer? google dit que c'est l'armure des soldats. Est-ce que vous voulez? Mieux ajouter une image.
Ohh je viens de voir que l'erreur que j'ai vraiment besoin d'identifier des rectangles et des carrés sur l'image. vraiment désolé pour l'erreur que j'avais fait. Maintenant, j'avais corrigé la question.
OriginalL'auteur | 2012-06-19
Vous devez vous connecter pour publier un commentaire.
(Donc il est résolu que la place.)
De détection carrée, OpenCV est livré avec quelques échantillons pour cela. Les Codes sont en C++, C, Python. J'espère que vous pourrez le port de ce JavaCV.
Le code C++ , Le Code Python.
Je vais illustrer comment cela fonctionne:
1 - d'Abord vous séparer l'image à R,G,B des avions.
2 - Ensuite, pour chaque plan, effectuer détection de bord, et en plus de cela, seuil pour différentes valeurs de 50, 100, .... etc.
3 - Et dans toutes ces images binaires, trouver contours ( rappelez-vous c'est le traitement d'un lot d'images, donc peut-être un peu lent, si vous ne voulez pas, vous pouvez supprimer certaines valeurs de seuil).
4 - Après la recherche de contours, de supprimer certaines petites les bruits indésirables par de filtrage selon la zone.
5 - Ensuite, approximative le contour. (Plus sur le contour de l'approximation).
6 - Pour un rectangle, il vous donnera les quatre coins. Pour d'autres, correspondant coins sera donné.
Afin de filtrer ces contours avec le nombre d'éléments dans rapprochait de contour qui doit être de quatre, qui est le même que le nombre de coins. Première propriété du rectangle.
7 - Ensuite, il peut y avoir quelques formes aux quatre coins, mais pas des rectangles. Donc, nous prenons deuxième propriété de rectangles, c'est à dire tous les angles internes sont 90. Nous avons donc trouver l'angle à tous les coins à l'aide de la relation ci-dessous :
Et si cos (theta) < 0.1, c'est à dire theta > 84 degré, qui est un rectangle.
8 - Alors que penser de la place? L'utilisation de ses biens, que tous les côtés sont égaux.
Vous pouvez trouver la distance entre deux points par le rapport comme indiqué ci-dessus. Vérifier si ils sont tous égaux, alors que le rectangle est un carré.
C'est comment le code fonctionne.
Ci-dessous est le résultat que j'ai obtenu en appliquant code mentionné ci-dessus sur une image :
EDIT :
Il a été demandé comment faire pour supprimer le rectangle détecté à la frontière. C'est parce que, opencv trouve des objets blancs sur fond noir, donc de la frontière. Juste inverser l'image à l'aide de cv2.bitwise_not() va résoudre le problème. nous obtenons un résultat comme ci-dessous:
Vous pouvez trouver plus d'informations sur le contour ici : Les Contours - 1 : Prise En Main
Que grand rectangle frontière est détecté, car, opencv contours de trouver des objets blancs sur fond noir. Donc, faire des carrés blancs, c'est à dire simplement inverser l'image. J'ai mis à jour la réponse.
Donc je ne peux pas obtenir le chaque et chaque rectangle séparément ? Si son pouvoir ne pouvez-vous donner un exemple de code pour cela.
Foin, pouvez-vous nous expliquer comment identifier squres à l'aide de code ci-dessus ? Parce qu'il a donné à tous les rectangles ainsi s'il vous plaît pouvez-vous expliquer cela?
Changé les liens.. l'essayer..
OriginalL'auteur Abid Rahman K