Ich habe einige Haut-Erkennung gemacht, kann aber keine glatte Haut bekommen. Das Bild unten enthält die Eingabe (links) und Ausgabe (rechts) mit dem unten angehängten Code. Jetzt sollte die gewünschte Ausgabe das unterste Bild sein (dasjenige, das an den Rändern glatt ist und keine Löcher darin hat). Wie erreiche ich diese Ausgabe? Ein Beispielcode für den Start wäre eine große Hilfe.OpenCV Skin Detection
Input (links) und fehlerhafte Ausgabe (rechts):
gewünschter Ausgang:
-Code die incorect Ausgabe zu erzeugen:
#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;
}
Modifizierter Code (nach Astor Vorschlag): (das Problem ist jetzt: Wie beurteilen Sie die Ausgabe glätten)
#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;
}
danke! Ich habe eine Ausgabe, die näher an der gewünschten Ausgabe ist. Darf ich fragen, wie ich die Ränder der Ausgabe glätten kann? –
Versuchen Sie, Glättung oder Bluring zu verwenden. OpenCV hat diese Funktionen. – ArtemStorozhuk
Ich habe die Funktion pyrMeanShiftFiltering() benutzt, um sie glatter aussehen zu lassen. –