2013-01-06 17 views
9

मैं निम्नलिखित प्रभाव को प्राप्त करने की कोशिश कर रहा हूं, यहां जीआईएमपी में परिप्रेक्ष्य उपकरण का उपयोग करके दिखाया गया है।ओपनसीवी छवि परिवर्तन और परिप्रेक्ष्य परिवर्तन

मूल छवि (620x466 पिक्सल)

original image (620x466 pixels)

छवि

transforming the image

बदलने क्या मैं एक निश्चित वेब कैमरा है और इसके बाद के संस्करण परिवर्तन प्लगइन चाहते हैं मैट्रिक्स आंकड़े, जिसके परिणामस्वरूप एक ट्रैपेज़ियम आकार के निर्विवाद आउटपुट होते हैं।

मुझे पता है कि ओपनसीवी में छवियों को अनइस्टोर्ट करने के लिए अन्य विकल्प उपलब्ध हैं, लेकिन मैं वास्तव में एक ट्रैपेज़ियम आकार वाली छवि के साथ समाप्त होने पर रूपांतरण मैट्रिक्स आंकड़े मैन्युअल रूप से प्रदान करना चाहता हूं।

मैं चारों ओर पढ़ने से एक लग रहा है warpPerspective, findHomography या getPerspectiveTransform उपयोगी हो सकता है है, लेकिन यकीन है कि सी ++

किसी भी उपयोगी सलाह बहुत सराहना की जाएगी में इस बारे में जाने के लिए कैसे नहीं।


निम्नलिखित कोड के साथ चलने का प्रयास किया लेकिन मुझे केवल 1 पिक्सेल दिखाकर खिड़की मिल गई।

शायद जिस तरह से मैंने पिक्सल में अंक निर्दिष्ट किए हैं, क्या यह सही है?

#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; 
} 

उत्तर

14

यदि आपके पास तीन कोने पॉइंट हैं तो वार्प एफ़िन ट्रांसफॉर्म का उपयोग करें। यदि आपके पास चार कोने पॉइंट हैं तो वार्प पर्स्पेक्टिव ट्रांसफॉर्म का उपयोग करें। यहां बताया गया है कि आपको वार परिप्रेक्ष्य परिवर्तन का उपयोग कैसे करना चाहिए। छवि के चार कोने बिंदुओं का चयन करें। फिर वांछित आयताकार के चार संबंधित बिंदुओं का चयन करें। वार्प ट्रांसफॉर्म बाकी करेगा।

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

उत्तर देने के लिए आपको बहुत बहुत धन्यवाद, यह देखने के लिए बाद में देखें कि मुझे क्या मिलता है – winterDream

-1

डीएसटी के प्रारंभ जोड़ें: चटाई डीएसटी = _image.clone();

0

निम्नलिखित कार्य: कृपया इनपुट छवि पर निर्देशांक को सही करें, मुझे सुराग नहीं मिला।

  #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; 
      } 
संबंधित मुद्दे