zoukankan      html  css  js  c++  java
  • 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)




  • 相关阅读:
    MySQL的安装和基本管理
    前端基础之jQuery
    前端基础之BOM和DOM
    前端基础之JavaScript
    前端基础之CSS
    前端基础之HTML
    五,pod控制器应用进阶
    运维都该会的Socket知识!
    四,k8s集群资源清单定义入门
    三,k8s集群的应用入门
  • 原文地址:https://www.cnblogs.com/jsxyhelu/p/14281812.html
Copyright © 2011-2022 走看看