c – OpenCV图像转换和透视变化
发布时间:2020-12-16 03:32:15 所属栏目:百科 来源:网络整理
导读:我正在尝试实现以下效果,这里使用GIMP中的透视工具显示. 原始图像(620×466像素) 转变形象 我所拥有的是一个固定的网络摄像头,并且想要插入上述转换矩阵图,导致梯形的无失真输出. 我知道还有其他选项可用于在OpenCV中保留图像,但我真的希望手动提供转换矩阵
|
我正在尝试实现以下效果,这里使用GIMP中的透视工具显示.
原始图像(620×466像素) 转变形象 我所拥有的是一个固定的网络摄像头,并且想要插入上述转换矩阵图,导致梯形的无失真输出. 我知道还有其他选项可用于在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;
}
解决方法
如果你有三个角点使用Warp Affine变换.如果你有四个角点,使用变形透视变换.这里是如何使用变形透视变换.选择图像的四个角点.然后选择所需矩形的四个对应点.经编变换将做其他事情.
cv::Mat OpenWarpPerspective(const cv::Mat& _image,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,cv::Size(_width,_height));
return dst;
}
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
