c++ - 如何正确使用 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);
}
解决方案
您的第一个错误是您使用paint(您也可以使用opencvimshow
来执行此操作)获得的分数顺序不正确。因此,它们应该是:left-up
、和。right-up
left-down
right-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;
}
感谢您清楚解释的问题
推荐阅读
- android - 在 A 类中获取 GPS 权限 如何在 B 类中获取 A 类数据
- reactjs - 为什么我的 ImageBackground 视图不会延伸到 React Native 中的屏幕底部?
- kotlin - Kotlin 将字符串值转换为正确的表示形式
- ruby-on-rails - Rails 测试错误
- php - PHP如何管理静态和全局变量?
- sql-server - 使用 Partition by function 为每个插入的值添加一个运行总计列
- android - 为同一图像的不同部分设置点击侦听器
- java - Kafka Java Consumer 挂在 Jenkins 上并且没有在本地读取消息
- python - 在python中循环300秒
- c# - 如何在 C# 中读取 msg 附件