首页 > 解决方案 > 如何正确使用 warpPerspective?

问题描述

这是文件和输入的输出,这是代码中使用的图像; 代码中使用的实际卡。 . 蓝色位置来自油漆。输出是代码的输出。我附上了我正在谈论的图像。我想获得透视转换,以便获得规范形式的卡片。它不起作用,我得到一个糟糕的输出。

这是我的代码。我从点得到的点是正确的(用函数 circle() 检查)

void main(){
cv::Mat begin = cv::imread("\cards.jpg");
cv::Mat output;
cv::Point2f Poly2[4] = {
              cv::Point2f(222,93),
              cv::Point2f(430,134),
              cv::Point2f(368,426),   //points I got from looking in paint.
              cv::Point2f(162,378),

};

cv::Point2f Points[4] = {
              cv::Point2f(0,0),
              cv::Point2f(300,0),
              cv::Point2f(0,600),       //The picture I want to transform to. 
              cv::Point2f(600,300),

};

for (int i = 0; i < 4; i++) {
    cv::circle(begin, cv::Point2d(Poly2[i].x, Poly2[i].y), 2, cv::Scalar(244, 233, 44), 3, 8, 0);
}

cv::Mat Matrix = cv::getPerspectiveTransform( Points,Poly2);

cv::warpPerspective(begin, output, Matrix, cv::Size(300, 600));

cv::imshow("begin", begin);
cv::imshow("Output", output);
cv::waitKey(0);
     }

标签: c++opencv

解决方案


您的第一个错误是您使用paint(您也可以使用opencvimshow来执行此操作)获得的分数顺序不正确。因此,它们应该是:left-up、和。right-upleft-downright-down

您的第二个也是实际错误与getPerspectiveTransform的顺序有关。您应该首先获取所需的(目的地)。如果您更正这 2 个错误,您将获得如下输出:

在此处输入图像描述

和代码:

#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <iostream>
#include <fstream>

int main()
{

    cv::Mat begin = cv::imread("/home/code/Documents/photos/cards.jpg");
    cv::Mat output;
    cv::Point2f Poly2[4] = {
                  cv::Point2f(222,93),
                  cv::Point2f(430,134),
                  cv::Point2f(162,378),
                  cv::Point2f(368,426),   //points I got from looking in paint.


    };

    cv::Point2f Points[4] = {
                  cv::Point2f(0,0),
                  cv::Point2f(300,0),
                  cv::Point2f(0,300),       //The picture I want to transform to.
                  cv::Point2f(300,300),

    };

    for (int i = 0; i < 4; i++) {
        cv::circle(begin, cv::Point2d(Poly2[i].x, Poly2[i].y), 2, cv::Scalar(244, 233, 44), 3, 8, 0);
    }

    cv::Mat Matrix = cv::getPerspectiveTransform( Poly2,Points);

    cv::warpPerspective(begin, output, Matrix, cv::Size(300, 300));

    cv::imshow("begin", begin);
    cv::imshow("Output", output);
    cv::waitKey(0);


    return 0;
}

感谢您清楚解释的问题


推荐阅读