...



  • ...



  • stell bitte noch ein Testbild und den gesamten Code zur Verfügung sodass man das nur mehr mit Copy und Paste in die IDE einfügen muss, dann kann ichs mir ansehen.



  • Alles klar, wird sofort gemacht 😉



  • Ausgabe: http://www.bilder-upload.eu/show.php?file=c492af-1463141991.jpg

    sowie die 2d Koordinaten der Punkte auf der Kommandozeile:

    Point: [773, 124]
    Point: [634, 131]
    Point: [644, 405]
    Point: [783, 403]
    

    Code:
    Bild einlesen -> auf grau konvertieren -> Schwellwert nach Otsu anwenden -> Binärbild -> Rauschen entfernen -> im Binärbild die Konturen suchen -> ein Polygon auf die Kontur legen -> Ausgabe des Polygons.

    #include <opencv2/opencv.hpp>
    #include <vector>
    #include <iostream>
    #include <ctime>
    
    void show(const char* title, const cv::Mat& img)
    {
    	cv::imshow(title, img);
    	cv::waitKey();
    }
    
    int main()
    {
    	cv::Mat imgColor = cv::imread("xxx.jpg", CV_LOAD_IMAGE_COLOR);
    
    	// rgb -> gray
    	cv::Mat imgGray;
    	cvtColor(imgColor, imgGray, CV_BGR2GRAY);
    
    	// show
    	show("gray", imgGray);
    
    	// gray -> binary
    	cv::Mat imgBW;
    	cv::threshold(imgGray, imgBW, 0, 255, CV_THRESH_BINARY_INV | CV_THRESH_OTSU);
    
    	// remove noise
    	cv::Mat se = cv::getStructuringElement(cv::MORPH_RECT, cv::Size(5, 5));	
    	cv::erode(imgBW, imgBW, se);
    	cv::dilate(imgBW, imgBW, se);
    
    	// show 
    	show("bw", imgBW);
    
    	// Find contours
    	std::vector<std::vector<cv::Point> > contours;
    	std::vector<cv::Vec4i> hierarchy;
    	cv::findContours(imgBW, contours, hierarchy, CV_RETR_TREE, CV_CHAIN_APPROX_SIMPLE);
    
    	// take first contour (TODO: maybe search for contour with biggest area?)
    	if (contours.size() == 0)
    	{
    		std::cout << "NO CONTOUR FOUND!!!\n";
    		return 0;
    	}
    
    	// fit polygon with specified error onto contour
    	std::vector<cv::Point> polygonPoints;
    	double precission = 10.0;
    	cv::approxPolyDP(cv::Mat(contours[0]), polygonPoints, precission, true);
    
    	// draw polygon lines 
    	cv::Mat imgOut;
    	imgColor.copyTo(imgOut);
    	const size_t numPolygonPoints = polygonPoints.size();
    	cv::RNG rng(time(0));
    	for (size_t i = 0; i < numPolygonPoints; ++i)
    	{
    		std::cout << "Point: "<<polygonPoints[i] << "\n";
    		cv::line(imgOut, polygonPoints[i], polygonPoints[(i + 1) % numPolygonPoints], cv::Scalar(rng.uniform(0, 255), rng.uniform(0, 255), rng.uniform(0, 255)), 5);
    	}
    
    	// show
    	show("output", imgOut);
    	cv::imwrite("out.jpg",imgOut);
    
    	return 0;
    }
    


  • Vielen vielen Dank für die Hilfe! Das ist perfekt und bringt mich einen riesigen Schritt weiter und raus aus meiner Verzweiflung! Danke! 😃 😃 😃 😃


Log in to reply