问题描述
当前正在处理一个问题,该问题在所代表的图像上进行了说明。
在左侧显示源图像。我有选择区域,可以是4点的多边形。 在右侧显示了图像切割的结果。可以看出,选择区域中出现的像素被拉伸以重新生成图像。
我想知道如何通过使用常规Qt或OpenCV获得这种效果?
解决方法
可以使用Qt使用以下功能来执行该过程:
-
QTransform::squareToQuad
:创建转换矩阵
创建一个转换矩阵trans,将一个单位正方形映射到一个四边形多边形quad。如果构造了转换,则返回true;否则,返回false。
-
QImage::transformed
:使用构造的变换矩阵对图像进行变换
返回使用给定的转换矩阵和转换模式转换的图像的副本。
-
QImage::copy
:提取所需区域
将图像的子区域返回为新图像。
请尝试阅读文档,并考虑在可行时发布解决方案。
,由m7913d描述的方法可能有用。 我尝试实现它,但是不幸的是,我无法获得良好的结果(可能是由于坐标指定错误)。
我还在OpenCV中发现了类似的方法。 而且由于使用更简单的api(以我为例),我编写了以下代码:
Mat src_img = imread(path.toStdString(),1);
imshow("source",src_img);
//vectors for corners
vector<Point2f> origin;
vector<Point2f> dest;
//output image size
int w = src_img.cols;
int h = src_img.rows;
//specifing roi polygon
origin.clear();
origin.push_back(Point2f(w / 2 - 20,h / 2 - 20)); //lt
origin.push_back(Point2f(w / 2 + 20,h / 2 - 100)); //rt
origin.push_back(Point2f(w / 2 - 20,h / 2 + 20)); //lb
origin.push_back(Point2f(w / 2 + 20,h / 2 + 20)); //rb
//resut storage
Mat result(w,h,CV_8UC4);
//specifing area,where we want to place warped roi
dest.clear();
dest.push_back(Point2f(0,0));
dest.push_back(Point2f(w / 2,0));
dest.push_back(Point2f(0,h / 2));
dest.push_back(Point2f(w / 2,h / 2));
//creating transform matrix
Mat warpMatrix = getPerspectiveTransform(origin,dest);
//warping and getting result
warpPerspective(src_img,result,warpMatrix,Size(w / 2,h / 2));
imshow("result",result);
//create a black image and merge images into one
Mat sum(w,CV_8UC4,Scalar(0,0));
src_img.copyTo(sum);
result.copyTo(sum(Rect(40,80,result.cols,result.rows)));
imshow("final",sum);