Je travaille sur un projet de traitement d'images de dalles de marbre comme celui ci-dessous en utilisant OpenCV 3.3.Trouver des contours dans des images avec un arrière-plan complexe et une texture riche dans OpenCV 3.3
Plusieurs autres échantillons avec différentes textures de marbre et de tailles sur lesquels je travaille sont disponibles sur https://1drv.ms/f/s!AjoScZ1lKToFheM6wmamv45R7zHwaQ
Les exigences sont les suivantes:
- séparé la dalle de marbre de l'arrière-plan et Enlevez l'arrière-plan (remplissez avec la couleur blanche) ainsi seulement la dalle est montrée.
- Calculer la surface de la dalle (la distance de la caméra à la dalle de marbre et les paramètres de la lentille sont connus)
La stratégie que je utilise est: 1) trouver le contour de la dalle de marbre, 2) enlever les parties qui ne sont pas dans le contour, 3) obtenir la taille de la zone du contour, 4) calculer sa surface physique.
Le contour de la dalle est représenté en rouge sur l'image ci-dessous (celle-ci a été réalisée à la main).
J'ai essayé plusieurs façons de trouver les contours de la dalle dans l'image, mais n'a pas réussi à obtenir un résultat satisfaisant en raison de l'arrière-plan complexe et la riche texture du marbre.
logique de traitement J'utilise est: convertir l'image en gris et flou et utiliser Canny pour trouver les bords, puis utilisez findContours pour trouver les contours, ce qui suit est le code:
Mat img = imread('test2.jpg', 1);
Mat gray, edge;
cvtColor(img, gray, COLOR_BGR2GRAY);
blur(gray, gray, Size(3, 3));
Canny(gray, edge, 50, 200, 3);
vector<vector<Point> > contours;
vector<Vec4i> lines;
findContours(edge, contours, RETR_LIST, CHAIN_APPROX_SIMPLE);
cout << "Number of contours detected: " << contours.size() << endl;
vector<Vec4i> hierarchy;
for (int i = 0; i < contours.size(); i++)
{
drawContours(img, contours, i, Scalar(0, 0, 255), 1, 8, hierarchy, 0, Point());
}
imshow("Output", img);
J'ai essayé de ajuster le flou et les paramètres Canny pour des dizaines de combinaisons et toujours échoué. J'ai également essayé d'utiliser HoughLinesP pour trouver le bord de la dalle avec plusieurs groupes de paramètres différents, mais aussi pour le faire.
Je suis un débutant à la vision informatique, les questions que j'ai maintenant sont:
- Vais-je vers une mauvaise façon ou d'une stratégie pour trouver le contour de la dalle? Pourrait-il y avoir de meilleurs algorithmes ou combinaisons? Ou dois-je me concentrer sur les paramètres de réglage des algorithmes Canny/findContours/HoughLinesP?
- Ce type d'image est-il vraiment difficile à traiter en raison de l'arrière-plan complexe?
Je suis ouvert à toutes les suggestions qui peuvent m'aider à terminer mon objectif. Merci d'avance.
Quelle partie est la plaque de marbre que vous voulez détecter? – StereoMatching