warpperspective 透视变化的opencv实现


warpperspective 透视变化的opencv2.0实现

1st-------2nd | | | | | |3rd-------4th
原始代码
              cv::Mat src= cv::imread( "c://03p.jpg" ,0);
                 if (!src.data)
                                 return 0;
                  vector<Point> not_a_rect_shape;
                not_a_rect_shape.push_back(Point(122,0));
                not_a_rect_shape.push_back(Point(814,0));
                not_a_rect_shape.push_back(Point(22,540));
                not_a_rect_shape.push_back(Point(910,540));
                 // For debugging purposes, draw green lines connecting those points
                 // and save it on disk
                 const Point* point = &not_a_rect_shape[0];
                 int n = ( int )not_a_rect_shape.size();
                Mat draw = src.clone();
                polylines(draw, &point, &n, 1, true , Scalar(0, 255, 0), 3, CV_AA);
                imwrite( "draw.jpg" , draw);
                 // Assemble a rotated rectangle out of that info
                RotatedRect box = minAreaRect(cv::Mat(not_a_rect_shape));
                std::cout << "Rotated box set to (" << box.boundingRect().x << "," << box.boundingRect().y << ") " << box.size.width << "x" << box.size.height << std::endl;
                 // Does the order of the points matter? I assume they do NOT.
                 // But if it does, is there an easy way to identify and order
                 // them as topLeft, topRight, bottomRight, bottomLeft?
                 //(0,0) (960,0) (0,540) (960,540)
                cv::Point2f src_vertices[4];
                src_vertices[0] = not_a_rect_shape[0];
                src_vertices[1] = not_a_rect_shape[1];
                src_vertices[2] = not_a_rect_shape[2];
                src_vertices[3] = not_a_rect_shape[3];

                Point2f dst_vertices[4];
                dst_vertices[0] = Point(0, 0);
                dst_vertices[1] = Point(960,0);
                dst_vertices[2] = Point(0,540);
                dst_vertices[3] = Point(960,540);
                Mat warpMatrix = getPerspectiveTransform(src_vertices, dst_vertices);
                cv::Mat rotated;
                warpPerspective(src, rotated, warpMatrix, rotated.size(), INTER_LINEAR, BORDER_CONSTANT);
                 // Display the image
                cv::namedWindow( "Original Image" );
                cv::imshow( "Original Image" ,src);
                cv::namedWindow( "warp perspective" );
                cv::imshow( "warp perspective" ,rotated);
                imwrite( "03p.jpg" ,src);
                cv::waitKey();
                 return 0;
结果基本是出来了,下一步就是要将其和现有的代码结合起来。

=====================================================2020年4月23日20:25:54===========================================添加Python版本的实现=======================
import cv2
import numpy  as np

src = cv2.imread( "e:/template/steel03.jpg")
rows,cols,ch = src.shape
pts1 = np.float32([[ 122, 0],[ 814, 0],[ 22, 540],[ 910, 540]])
pts2 = np.float32([[ 0, 0],[ 960, 0],[ 0, 540],[ 960, 540]])
M = cv2.getPerspectiveTransform(pts1,pts2)
dst = cv2.warpPerspective(src,M,(cols,rows))

cv2.imshow( "src",dst)

cv2.waitKey( 0)





免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM