win*_*eam 9 c++ opencv transformation matrix perspective
我正在尝试使用GIMP中的透视工具来实现以下效果.
原始图像(620x466像素)

改变形象

我所拥有的是一个固定的网络摄像头,并希望插入上面的变换矩阵图形,从而产生梯形形状的无失真输出.
我知道在OpenCV中还有其他可用于未失真图像的选项,但我真的想手动提供变换矩阵图形,同时最终得到梯形图像.
从阅读中我有一种感觉warpPerspective,findHomography或者getPerspectiveTransform可能有用,但不知道如何在C++中实现这一点
任何有用的建议将不胜感激.
尝试使用以下代码运行,但我只得到一个显示1个像素的窗口.
也许我指定像素点的方式,这是正确的吗?
#include <opencv2/core/core.hpp>
#include <opencv2/opencv.hpp>
#include <cv.h>
#include <opencv2/highgui/highgui.hpp>
#include <iostream>
using namespace cv;
using namespace std;
cv::Mat OpenWarpPerspective(const cv::Mat& _image
, const cv::Point2f& _lu
, const cv::Point2f& _ru
, const cv::Point2f& _rd
, const cv::Point2f& _ld
, const cv::Point2f& _lu_result
, const cv::Point2f& _ru_result
, const cv::Point2f& _rd_result
, const cv::Point2f& _ld_result
, cv::Mat& _transform_matrix)
{
// todo do some checks on input.
cv::Point2f source_points[4];
cv::Point2f dest_points[4];
source_points[0] = _lu;
source_points[1] = _ru;
source_points[2] = _rd;
source_points[3] = _ld;
dest_points[0] = _lu_result;
dest_points[1] = _ru_result;
dest_points[2] = _rd_result;
dest_points[3] = _ld_result;
cv::Mat dst;
_transform_matrix = cv::getPerspectiveTransform(source_points, dest_points);
cv::warpPerspective(_image, dst, _transform_matrix, dst.size());
return dst;
}
int main( int argc, char** argv )
{
Mat image;
Mat edited;
image = imread("c:/org.png", CV_LOAD_IMAGE_COLOR); // Read the file
namedWindow( "Display window", CV_WINDOW_AUTOSIZE );// Create a window for display.
Point2f one = (0.0, 0.0);
Point2f two = (317.0, 0.0);
Point2f three = (317.0, 240.0);
Point2f four = (0.0, 240.0);
Point2f five = (-100.0, 0.0);
Point2f six = (617.0, 0.0);
Point2f seven = (317.0, 240.0);
Point2f eight = (0.0, 240.0);
OpenWarpPerspective(image,one,two,three,four,five,six,seven,eight,edited);
imshow( "Display window", edited ); // Show our image inside it.
waitKey(0); // Wait for a keystroke in the window
return 0;
}
Run Code Online (Sandbox Code Playgroud)
wig*_*ily 15
如果你有三个角点使用Warp仿射变换.如果您有四个角点,请使用Warp Perspective变换.以下是使用Warp Perspective变换的方法.选择图像的四个角点.然后选择所需矩形的四个对应点.Warp变换将完成其余的工作.
cv::Mat OpenWarpPerspective(const cv::Mat& _image
, const cv::Point2f& _lu
, const cv::Point2f& _ru
, const cv::Point2f& _rd
, const cv::Point2f& _ld
, const cv::Point2f& _lu_result
, const cv::Point2f& _ru_result
, const cv::Point2f& _rd_result
, const cv::Point2f& _ld_result
, cv::Mat& _transform_matrix)
{
// todo do some checks on input.
cv::Point2f source_points[4];
cv::Point2f dest_points[4];
source_points[0] = _lu;
source_points[1] = _ru;
source_points[2] = _rd;
source_points[3] = _ld;
dest_points[0] = _lu_result;
dest_points[1] = _ru_result;
dest_points[2] = _rd_result;
dest_points[3] = _ld_result;
cv::Mat dst;
_transform_matrix = cv::getPerspectiveTransform(source_points, dest_points);
cv::warpPerspective(_image, dst, _transform_matrix, cv::Size(_width, _height));
return dst;
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
20852 次 |
| 最近记录: |