OpenCV Peau De Détection
J'ai fait un peu de peau de détection, mais ne peut pas obtenir une surface lisse. L'image ci-dessous contient l'entrée (à gauche) et de sortie (à droite) à l'aide du code ci-dessous. Maintenant, la sortie désirée doit avoir été le plus bas de l'image (le seul qui est lisse sur les bords et ne pas avoir des trous à l'intérieur). Comment puis-je réaliser cette sortie? Un exemple de code sur le point de départ serait d'une grande aide.
D'entrée (à gauche) et de sortie Incorrecte (à droite):
De sortie souhaité:
Le Code pour générer le Incorect de sortie:
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/highgui/highgui.hpp>
using namespace cv;
int main(){
Mat src = imread("qq.jpg");
if (src.empty())
return -1;
blur( src, src, Size(3,3) );
Mat hsv;
cvtColor(src, hsv, CV_BGR2HSV);
Mat bw;
inRange(hsv, Scalar(0, 10, 60), Scalar(20, 150, 255), bw);
imshow("src", src);
imshow("dst", bw);
waitKey(0);
return 0;
}
Code modifié (après Astor suggestion):
(le problème maintenant est: comment faites vous pour adoucir la sortie?)
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/highgui/highgui.hpp>
using namespace cv;
int findBiggestContour(vector<vector<Point> >);
int main(){
Mat src = imread("qq.jpg");
if (src.empty())
return -1;
blur( src, src, Size(3,3) );
Mat hsv;
cvtColor(src, hsv, CV_BGR2HSV);
Mat bw;
inRange(hsv, Scalar(0, 10, 60), Scalar(20, 150, 255), bw);
imshow("src", src);
imshow("dst", bw);
Mat canny_output;
vector<vector<Point> > contours;
vector<Vec4i> hierarchy;
findContours( bw, contours, hierarchy, CV_RETR_TREE, CV_CHAIN_APPROX_SIMPLE, Point(0, 0) );
int s = findBiggestContour(contours);
Mat drawing = Mat::zeros( src.size(), CV_8UC1 );
drawContours( drawing, contours, s, Scalar(255), -1, 8, hierarchy, 0, Point() );
imshow("drw", drawing);
waitKey(0);
return 0;
}
int findBiggestContour(vector<vector<Point> > contours){
int indexOfBiggestContour = -1;
int sizeOfBiggestContour = 0;
for (int i = 0; i < contours.size(); i++){
if(contours[i].size() > sizeOfBiggestContour){
sizeOfBiggestContour = contours[i].size();
indexOfBiggestContour = i;
}
}
return indexOfBiggestContour;
}
OriginalL'auteur Og Namdik | 2012-10-19
Vous devez vous connecter pour publier un commentaire.
Vous devez utiliser
findContours
de détecter le plus grand contour et après ce tirage au sort fondée contour avec remplissage paramètre -1 l'aide de la méthodedrawContours
. Voici un lien utile: http://docs.opencv.org/doc/tutorials/imgproc/shapedescriptors/find_contours/find_contours.htmlEssayez d'utiliser le lissage ou bluring. OpenCV a ces fonctions.
j'ai utilisé pyrMeanShiftFiltering() de la fonction pour le rendre plus fluide.
Protip: seuil avant findContours pour la plupart des résultats cohérents.
OriginalL'auteur ArtemStorozhuk
Pour améliorer la fluidité de la production, ou en d'autres termes afin de réduire les trous noirs dans la détection de la zone essayez d'effectuer les opérations morphologiques sur l'image résultante.
Documentation suivante explique l'érosion et la dilatation des fonctions d'opencv.
http://docs.opencv.org/doc/tutorials/imgproc/erosion_dilatation/erosion_dilatation.html
OriginalL'auteur hbn1991