Ecken anpassen und das Bild openCV zuschneiden

8

Ich verwende einen offenen Lebenslauf in IOS. Ich habe bereits die Grenze des Papierblattes in einem Bild erkannt, wie in Bild gezeigt, und jetzt muss ich diese Grenzlinie bei Berührung ziehen, um den Zuschnittsrahmen anzupassen. Wie können wir die Grenzlinie anpassen und wie wir das Bild innerhalb der Grenze zuschneiden können?

Das ist in openCV möglich oder ich verwende openGL dafür?

@moosgummi: Ich rufe deine Methode in der unteren Methode

auf %Vor%

Danke allen

    
QueueOverFlow 27.10.2012, 07:08
quelle

2 Antworten

9

Nachdem Sie die Ecken bekommen haben, müssen Sie das Papier entzerren und es zu einem neuen Bild "extrahieren".

Sie sollten Folgendes tun:

  1. Sortiere Eckpunkte (die Reihenfolge ist wichtig; sie müssen in beiden Vektoren in der gleichen Reihenfolge sein)
  2. cv::getAffineTransform
  3. cv::warpAffine

Ich habe mir selbst eine Hilfsfunktion geschrieben, die ein std::vector mit vier cv::Point enthält und sie im Uhrzeigersinn beginnend oben links sortiert. Weitere Informationen zu diesem Thema finden Sie in folgenden Themen:

Eine weitere Sache, die Sie berücksichtigen sollten, ist die Größe des Papiers, das Sie extrahieren möchten. In meinem Beispiel nehme ich an, dass Sie ein DIN-A4-Papier (210x297mm) extrahieren. Fühlen Sie sich frei, paperWidth und paperHeight in meinem Code zu bearbeiten.

Die Kombination sieht so aus:

%Vor%

Verwendung:

%Vor%     
dom 23.11.2012, 12:35
quelle
1

Was Sie tun sollten, ist:

  1. Füge die 4 Ecken, die du gefunden hast, und die 4 echten Ecken des Bildes zu cv::getPerspectiveTransform . Es wird Ihnen eine Matrix der Perspektiventransformation geben, die das Viereck auf das ganze Bild umlenken wird.

  2. Verwenden Sie cv::WarpPerspective , um das gewünschte Bild zu erstellen.

Die Links führen Sie zur Dokumentation.

EDIT: Sie könnten cv::findHomography verwenden, um Schritt 1 zu tun. Aber das ist mehr über eine Menge von entsprechenden Punkten und Ausreißern.

EDIT: Hier ist ein Beispiel. Es ist mit der C-Schnittstelle, aber Sie könnten es leicht machen, mit dem C ++

zu arbeiten %Vor%

Sie sollten das Array first durch Endpunkte des gefundenen Vierecks ersetzen.

EDIT: Hier sind einige Beispiele. Ich habe sie nicht sehr gut angesehen.

Geometrische Bildtransformationen

cvGetPerspectiveTransform

    
Dimitar Slavchev 22.11.2012 10:15
quelle