2013-01-06 31 views
9

GIMP'de perspektif aracını kullanarak burada gösterilen efekti elde etmeye çalışıyorum. görüntüOpenCV görüntü dönüşümü ve perspektif değişikliği

transforming the image

transforme

orijinal görüntü (620x466 piksel)

original image (620x466 pixels)

Ne var sabit bir web ve yukarıda dönüşümü eklentisi istiyoruz matriks figürleri, trapez şeklindeki bozulmamış bir çıkışla sonuçlanır.

OpenCV'de görüntülerin bozulmaması için başka seçenekler olduğunu biliyorum, ancak trapez şeklindeki bir görüntü ile sonlanırken, dönüşüm matrisi rakamlarını el ile sağlamak istiyorum. Etrafa okuyunca

warpPerspective, findHomography veya getPerspectiveTransform yararlı olabilir bir his var, ama herhangi bir yararlı tavsiyeler büyük takdir C++

bu konuda nasıl emin değilim.

Aşağıdaki kodla çalışmayı denedim ancak yalnızca 1 piksel gösteren bir pencere alıyorum.

Belki de piksel cinsinden nokta belirlemiş olduğum yol bu mu?

#include <opencv2/core/core.hpp> 
    #include <opencv2/opencv.hpp> 
    #include <cv.h> 
    #include <opencv2/highgui/highgui.hpp> 
    #include <iostream> 

    using namespace cv; 
    using namespace std; 

      cv::Mat OpenWarpPerspective(const cv::Mat& _image 
       , const cv::Point2f& _lu 
       , const cv::Point2f& _ru 
       , const cv::Point2f& _rd 
       , const cv::Point2f& _ld 
       , const cv::Point2f& _lu_result 
       , const cv::Point2f& _ru_result 
       , const cv::Point2f& _rd_result 
       , const cv::Point2f& _ld_result 
       , cv::Mat& _transform_matrix) 
      { 
       // todo do some checks on input. 

       cv::Point2f source_points[4]; 
       cv::Point2f dest_points[4]; 


       source_points[0] = _lu; 
       source_points[1] = _ru; 
       source_points[2] = _rd; 
       source_points[3] = _ld; 

       dest_points[0] = _lu_result; 
       dest_points[1] = _ru_result; 
       dest_points[2] = _rd_result; 
       dest_points[3] = _ld_result; 

       cv::Mat dst; 
       _transform_matrix = cv::getPerspectiveTransform(source_points, dest_points); 
       cv::warpPerspective(_image, dst, _transform_matrix, dst.size()); 

       return dst; 
      } 

    int main(int argc, char** argv) 
    { 

     Mat image; 
     Mat edited; 

     image = imread("c:/org.png", CV_LOAD_IMAGE_COLOR); // Read the file 

     namedWindow("Display window", CV_WINDOW_AUTOSIZE);// Create a window for display. 

      Point2f one = (0.0, 0.0); 
      Point2f two = (317.0, 0.0); 
      Point2f three = (317.0, 240.0); 
      Point2f four = (0.0, 240.0); 

      Point2f five = (-100.0, 0.0); 
      Point2f six = (617.0, 0.0); 
      Point2f seven = (317.0, 240.0); 
      Point2f eight = (0.0, 240.0); 

      OpenWarpPerspective(image,one,two,three,four,five,six,seven,eight,edited); 

     imshow("Display window", edited);     // Show our image inside it. 

     waitKey(0);           // Wait for a keystroke in the window 
     return 0; 
} 

cevap

14

Üç köşe noktanız varsa Warp Affine dönüşümü kullanın. Dört köşe noktanız varsa Warp Perspective dönüşümü kullanın. Warp Perspective dönüşümünü nasıl kullanmalısınız. Görüntünün dört köşe noktasını seçin. Ardından istenilen dikdörtgenin dört karşılık gelen noktasını seçin. Çözgü dönüşümü dinlenme yapacak.

cv::Mat OpenWarpPerspective(const cv::Mat& _image 
    , const cv::Point2f& _lu 
    , const cv::Point2f& _ru 
    , const cv::Point2f& _rd 
    , const cv::Point2f& _ld 
    , const cv::Point2f& _lu_result 
    , const cv::Point2f& _ru_result 
    , const cv::Point2f& _rd_result 
    , const cv::Point2f& _ld_result 
    , cv::Mat& _transform_matrix) 
{ 
    // todo do some checks on input. 

    cv::Point2f source_points[4]; 
    cv::Point2f dest_points[4]; 


    source_points[0] = _lu; 
    source_points[1] = _ru; 
    source_points[2] = _rd; 
    source_points[3] = _ld; 

    dest_points[0] = _lu_result; 
    dest_points[1] = _ru_result; 
    dest_points[2] = _rd_result; 
    dest_points[3] = _ld_result; 

    cv::Mat dst; 
    _transform_matrix = cv::getPerspectiveTransform(source_points, dest_points); 
    cv::warpPerspective(_image, dst, _transform_matrix, cv::Size(_width, _height)); 

    return dst; 
} 
+0

Yanıtladığınız için çok teşekkür ederim, ne yaptığımı görmek için daha sonra bunu kontrol edeceğim – winterDream

-1

DST başlatma ekleyin: Mat DST = _image.clone();

0

Aşağıdaki İşler: Lütfen giriş görüntüsündeki koordinatları düzeltin, ipucu almadım.

  #include <opencv2/core/core.hpp> 
      #include <opencv2/opencv.hpp> 
      //#include "cv.hpp" 
      #include <opencv2/highgui/highgui.hpp> 
      #include <iostream> 

      using namespace cv; 
      using namespace std; 

      cv::Mat OpenWarpPerspective(const cv::Mat& _image 
       , const cv::Point2f& _lu 
       , const cv::Point2f& _ru 
       , const cv::Point2f& _rd 
       , const cv::Point2f& _ld 
       , const cv::Point2f& _lu_result 
       , const cv::Point2f& _ru_result 
       , const cv::Point2f& _rd_result 
       , const cv::Point2f& _ld_result 
       ) 
      { 
       // todo do some checks on input. 

       cv::Point2f source_points[4]; 
       cv::Point2f dest_points[4]; 
       cv::Mat _transform_matrix; 

       source_points[0] = _lu; 
       source_points[1] = _ru; 
       source_points[2] = _rd; 
       source_points[3] = _ld; 

       dest_points[0] = _lu_result; 
       dest_points[1] = _ru_result; 
       dest_points[2] = _rd_result; 
       dest_points[3] = _ld_result; 

       cv::Mat dst = _image.clone(); 
       _transform_matrix = cv::getPerspectiveTransform(source_points, dest_points); 
       cv::warpPerspective(_image, dst, _transform_matrix, dst.size()); 

       return dst; 
      } 

      int main(int argc, char** argv) 
      { 

       Mat image; 
       Mat edited; 

       image = imread("img.png", CV_LOAD_IMAGE_COLOR); // Read the file // original image(620x466 pixels) 
       imshow("InputImage", image); 
       waitKey(0); 


       Point2f one = (0.0, 0.0); 
       Point2f two = (500.0, 0.0); 
       Point2f three = (500.0, 100.0); 
       Point2f four = (250.0, 100.0); 

       Point2f five = (250.0, 0.0); 
       Point2f six = (500.0, 0.0); 
       Point2f seven = (500.0, 1000.0); 
       Point2f eight = (250.0, 100.0); 



       edited= OpenWarpPerspective(image, one, two, three, four, five, six, seven, eight); 

       namedWindow("Display window", CV_WINDOW_AUTOSIZE);// Create a window for display. 
       imshow("Display window", edited);     // Show our image inside it. 

       waitKey(0);           // Wait for a keystroke in the window 
       return 0; 
      } 
İlgili konular