OpenCV - Entzerren der Perspektive gibt ein falsches Ergebnis heraus



  • Ich versuche, durch alle Endpunkte von Linien zu iterieren, Segmente zwischen ihnen zu bauen und schließlich die perspektivische Verzerrung herauszunehmen. Man kann sich vorstellen, dass all diese "Mini"-Segmente kleine Bilder sind (ca. 70x300, aber es variiert von der Größe her.)

    Was ich getan habe:

    //allPoints are created in another class, but the output 
        //for std::vector<std::pair<cv::Point, cv::Point>> allPoints is as follows:
        //(for the first:)[139, 113][201, 310][223, 339][297, 437][323, 472][381, 465][408, 413][484, 291][505, 151]
        //(for the second:)[139, 210][201, 692][223, 664][297, 550][323, 523][381, 544][408, 580][484, 699][505, 254]
    
        for (int i = 0; i < allPoints.size() - 1; i++) {
    		cv::Vec3b zero(0, 0, 0);
    		cv::Mat_<cv::Vec3b> img_dst(allPoints[i].second.y - allPoints[i].first.y,
    			allPoints[i+1].first.x - allPoints[i].first.x);
    		std::cout << "\nSize of img_dst: " << img_dst.size() << "\n";
    
    		const cv::Point2f src_pt[] = {
    			cv::Point2f(allPoints[i].first),
    			cv::Point2f(allPoints[i].second),
    			cv::Point2f(allPoints[i + 1].second),
    			cv::Point2f(allPoints[i + 1].first) };
    
    		const cv::Point2f dst_pt[] = {
    			cv::Point2f(allPoints[i].first),
    			cv::Point2f(allPoints[i].second),
    			cv::Point2f(allPoints[i + 1].second.x, allPoints[i].second.y),
    			cv::Point2f(allPoints[i + 1].first.x, allPoints[i].first.y) };
    
    		const cv::Mat homography_matrix = cv::getPerspectiveTransform(src_pt, dst_pt);
    
    		cv::warpPerspective(matCopy, img_dst, homography_matrix, img_dst.size());
    
    		cv::imshow("Result", img_dst);
    
    		std::pair<vector<int>, std::string> wallNr = WallParser::wallParser(argument);
    
    		int label = wallNr.first[i];
    		std::cout << label << " ";
    
    		Main::saveAll(img_dst, "", label);
    
    	}
    

    Also eigentlich übergebe ich die richtige Größe und auch die richtigen Punkte, die "entzerrt" werden sollen. Aber ich bekomme statt (wurde schnell in PS erstellt - dort ergibt sich ein größeres Bild) https://i.stack.imgur.com/QpSkk.jpg dieses https://i.stack.imgur.com/rG2Qg.png. Das Bild sieht so aus und all diese Endpunkte sind die Endpunkte der gelben Linien: https://i.stack.imgur.com/Do77n.jpg

    Wie kriege ich es bei "WrapPrespective" hin, dass es auf die Größe richtig entzerrt wird?