[英]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-up
, right-up
, left-down
和right-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.