Wie konvertiere ich den c ++ – Code in Python für die automatische Bildrotation mit OpenCV?

Ich möchte folgendes machen:

  1. Drehen Sie das Incoming Image , um es perfekt mit dem Template Image auszurichten.
  2. Verwenden Sie cv2.substrate() , um die beiden ausgerichteten Bilder zu vergleichen und den Unterschied auszudrucken.

Ich habe schon den Python-Code, um den Bildvergleich zu machen:

 import cv2 import numpy as np image1 = cv2.imread('letter f5.png') image2 = cv2.imread('letter f.png') difference = cv2.subtract(image1, image2) result = np.any(difference) if result is True: print ("The images are the same") else: cv2.imshow("result.jpg", difference) print ("the images are different") 

Der Bildvergleich funktioniert gut, wenn die beiden Bilder ausgerichtet sind. Wenn das Incoming Image im Uhrzeigersinn um 90 Grad ausgeschaltet ist, funktioniert der Bildvergleich nicht.

Also, wie kann ich dieses Bild drehen:

90 Grad im Uhrzeigersinn gedreht

Dazu:

Ausgerichtetes eingehendes Bild

So dass ich es mit Template Image vergleichen kann.

Ich habe diesen C ++ – Code:

 #include <stdio.h> #include <iostream> #include "opencv2/core/core.hpp" #include "opencv2/features2d/features2d.hpp" #include "opencv2/highgui/highgui.hpp" #include "opencv2/calib3d/calib3d.hpp" #include "opencv2/nonfree/nonfree.hpp" #include "opencv2/imgproc/imgproc.hpp" #define PI 3.14159265 using namespace cv; using namespace std; void rotate(cv::Mat& src, double angle, cv::Mat& dst) { int len = std::max(src.cols, src.rows); cv::Point2f pt(len/2., len/2.); cv::Mat r = cv::getRotationMatrix2D(pt, angle, 1.0); cv::warpAffine(src, dst, r, cv::Size(len, len)); } float angleBetween(const Point &v1, const Point &v2) { float len1 = sqrt(v1.x * v1.x + v1.y * v1.y); float len2 = sqrt(v2.x * v2.x + v2.y * v2.y); float dot = v1.x * v2.x + v1.y * v2.y; float a = dot / (len1 * len2); if (a >= 1.0) return 0.0; else if (a <= -1.0) return PI; else{ int degree; degree = acos(a)*180/PI; return degree; }; } int main() { Mat char1 = imread( "/Users/Rodrane/Documents/XCODE/OpenCV/mkedenemeleri/anarev/rotated.jpg",CV_LOAD_IMAGE_GRAYSCALE ); Mat image = imread("/Users/Rodrane/Documents/XCODE/OpenCV/mkedenemeleri/anarev/gain2000_crop.jpg", CV_LOAD_IMAGE_GRAYSCALE ); if( !char1.data ) { std::cout<< "Error reading object " << std::endl; return -1; } GaussianBlur( char1, char1, Size(3, 3), 2, 2 ); GaussianBlur( image, image, Size(3, 3), 2, 2 ); adaptiveThreshold(char1,char1,255,CV_ADAPTIVE_THRESH_MEAN_C,CV_THRESH_BINARY,9,14); adaptiveThreshold(image,image,255,CV_ADAPTIVE_THRESH_MEAN_C,CV_THRESH_BINARY,9,14); //Detect the keypoints using SURF Detector int minHessian = 200; SurfFeatureDetector detector( minHessian ); std::vector<KeyPoint> kp_object; detector.detect( char1, kp_object ); //Calculate descriptors (feature vectors) SurfDescriptorExtractor extractor; Mat des_object; extractor.compute( char1, kp_object, des_object ); FlannBasedMatcher matcher; namedWindow("Good Matches"); std::vector<Point2f> obj_corners(4); //Get the corners from the object obj_corners[0] = cvPoint(0,0); obj_corners[1] = cvPoint( char1.cols, 0 ); obj_corners[2] = cvPoint( char1.cols, char1.rows ); obj_corners[3] = cvPoint( 0, char1.rows ); Mat frame; Mat des_image, img_matches; std::vector<KeyPoint> kp_image; std::vector<vector<DMatch > > matches; std::vector<DMatch > good_matches; std::vector<Point2f> obj; std::vector<Point2f> scene; std::vector<Point2f> scene_corners(4); Mat H; detector.detect( image, kp_image ); extractor.compute( image, kp_image, des_image ); matcher.knnMatch(des_object, des_image, matches, 2); for(int i = 0; i < min(des_image.rows-1,(int) matches.size()); i++) //THIS LOOP IS SENSITIVE TO SEGFAULTS { if((matches[i][0].distance < 0.6*(matches[i][1].distance)) && ((int) matches[i].size()<=2 && (int) matches[i].size()>0)) { good_matches.push_back(matches[i][0]); } } //Draw only "good" matches drawMatches( char1, kp_object, image, kp_image, good_matches, img_matches, Scalar::all(-1), Scalar::all(-1), vector<char>(), DrawMatchesFlags::NOT_DRAW_SINGLE_POINTS ); if (good_matches.size() >= 4) { for( int i = 0; i < good_matches.size(); i++ ) { //Get the keypoints from the good matches obj.push_back( kp_object[ good_matches[i].queryIdx ].pt ); scene.push_back( kp_image[ good_matches[i].trainIdx ].pt ); cout<<angleBetween(obj[i],scene[i])<<endl; //angles between images } H = findHomography( obj, scene, CV_RANSAC ); perspectiveTransform( obj_corners, scene_corners, H); // cout<<angleBetween(obj[0], scene[0])<<endl; //Draw lines between the corners (the mapped object in the scene image ) } //Show detected matches // resize(img_matches, img_matches, Size(img_matches.cols/2, img_matches.rows/2)); imshow( "Good Matches", img_matches ); waitKey(); return 0; } 

So drehen Sie das eingehende Bild automatisch so, dass es sich perfekt an das Vorlagenbild anpasst. Ich habe den folgenden Code, der das Eingehende Bild manuell um 90 Grad gegen den Uhrzeigersinn dreht

 import numpy as np import cv2 img = cv2.imread('letter defect f90.png',0) rows,cols = img.shape M = cv2.getRotationMatrix2D((cols/2,rows/2),90,1) dst = cv2.warpAffine(img,M,(cols,rows)) img2 = cv2.imwrite('result_rotate.png',dst) img3 = cv2.imread('letter f.png') img4 = cv2.imread('result_rotate.png') difference = cv2.subtract(img3, img4) result = np.any(difference) if result is True: print ("The images are the same") else: cv2.imshow("result.jpg", difference) print ("the images are different") 

  • Kann ich einen Multi-Frame TIFF über OpenCV laden?
  • OpenCV Grabcut () Hintergrundfarbe und Kontur in Python
  • Capture Einzelbild mit opencv
  • Python OpenCV konvertiert Bild zu Byte String?
  • Äquivalent von copyTo in Python OpenCV Bindungen?
  • Crop Rectangle zurückgegeben von minAreaRect OpenCV [Python]
  • OpenCV facemorpher 1.0.1 Fehler: keine Bildausgabe, fehlende Bibliothek?
  • Loop durch Verzeichnis von Bildern und drehen sie alle x Grad und speichern in Verzeichnis
  • 2 Solutions collect form web for “Wie konvertiere ich den c ++ – Code in Python für die automatische Bildrotation mit OpenCV?”

    Ich vermute, du willst dein Bild drehen. Sie können die in der OpenCV-Bibliothek verfügbare Funktion getRotationMatrix2D () verwenden (Snippet von hier ):

     (x, y) = img.shape[:2] center = (y / 2, x / 2) Mat = cv2.getRotationMatrix2D(center, 90, 1.0) rotate = cv2.warpAffine(img, Mat, (y, x)) cv2.imwrite("rotated.jpg", rotate) 
    • 1. Parameter: Zuerst erhältst du die Mitte des Bildes.
    • 2. Parameter: Drehen Sie das Bild um dieses Zentrum mit einem Winkel Ihrer Wahl.
    • 3. Parameter: Dies ist die Skala . Es entscheidet, wie groß oder klein du willst dein Bild.

    Hier ist dein Originalbild:

    Bildbeschreibung hier eingeben

    Dies ist das gedrehte Bild:

    Bildbeschreibung hier eingeben

    Ich dachte daran, eine Lösung zu bekommen, nachdem ich Ihren Kommentar bekommen habe. Meine Antwort mag nicht perfekt sein, aber hoffe es gibt eine Idee zu einer besseren Lösung.

    • Führen Sie eine Konturoperation des Bildes aus, für das Sie die Rotation finden möchten.
    • Setzen Sie eine Ellipse um die Kontur, die Sie erhalten haben.
    • Nun, basierend auf der erhaltenen Ellipse können Sie zu einer Schlussfolgerung kommen, ob das Bild vertikal, horizontal oder in jede andere Richtung geneigt ist.

      -Wenn Ihr Konturobjekt breit ist, wird die Hauptachse der Ellipse fit horizontal sein.

      -Wenn Ihr Konturobjekt dünn und groß ist, wird die Hauptachse der Ellipse fit vertikal.

    • Wenn nun die erhaltene Ellipse nicht vertikal oder horizontal ist, müssen Sie eine Orientierungsausrichtung durchführen.

    Ich hoffe es hilft!!!!

    Python ist die beste Programmiersprache der Welt.