簡體   English   中英

如何正確使用 warpPerspective?

[英]How do I use warpPerspective correctly?

這是帶有輸入的output文件,這是代碼中使用的圖像; 代碼中使用的實際卡。 . 藍色位置來自油漆。 Output 是代碼中的 output。 我附上了我正在談論的圖像。 我想獲得透視轉換,以便獲得規范形式的卡片。 它不起作用,我得到一個壞的 output。

這是我的代碼。 我從點得到的點是正確的(用 function 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);
     }

您的第一個錯誤是您使用繪畫獲得的分數(您也可以使用 opencv imshow來執行此操作)的順序不正確。 它們應該是相應的: left-upright-upleft-downright-down

您的第二個也是實際錯誤與getPerspectiveTransform的順序有關。 您應該首先獲取所需的(目的地)。 如果您糾正了這 2 個錯誤,您將得到 output,如:

在此處輸入圖像描述

和代碼:

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

int main()
{

    cv::Mat begin = cv::imread("/home/yongatek02/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;
}

感謝您清楚解釋的問題

問題是您錯誤地計算了轉換的目標坐標。

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),

};

double imWidth = cv::norm(Poly2[1]-Poly2[0]);
double imHeight = cv::norm(Poly2[2]-Poly2[1]);

// Destination points have to be in the same order as input points
cv::Point2f Points[4] = {
              cv::Point2f(0,0),
              cv::Point2f(imWidth-1, 0),
              cv::Point2f(imWidth-1, imHeight-1),       //The picture I want to transform to. 
              cv::Point2f(0, imHeight-1),

};

cv::Mat Matrix = cv::getPerspectiveTransform( Points,Poly2);
cv::warpPerspective(begin, output, Matrix, cv::Size(imWidth, imHeight));

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM