【发布时间】:2020-12-01 07:41:06
【问题描述】:
目前正在处理一个问题,如图所示。
在左侧表示源图像。我有选择区域,可能是 4 个点的多边形。 右侧表示图像切割的结果。可以看出,选择区域中出现的像素被拉伸到生成图像的矩形。
我想知道如何使用常规的 Qt 或 OpenCV 来获得这样的效果?
【问题讨论】:
标签: c++ image qt opencv image-processing
目前正在处理一个问题,如图所示。
在左侧表示源图像。我有选择区域,可能是 4 个点的多边形。 右侧表示图像切割的结果。可以看出,选择区域中出现的像素被拉伸到生成图像的矩形。
我想知道如何使用常规的 Qt 或 OpenCV 来获得这样的效果?
【问题讨论】:
标签: c++ image qt opencv image-processing
m7913d 描述的方法可能有用。 我尝试实现它,但不幸的是,我无法获得好的结果(可能是因为坐标指定错误)。
我还在 OpenCV 中找到了类似的方法。 由于使用起来更简单(在我的情况下),我编写了以下代码:
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, h, CV_8UC4, Scalar(0, 0, 0));
src_img.copyTo(sum);
result.copyTo(sum(Rect(40, 80, result.cols, result.rows)));
imshow("final", sum);
【讨论】:
可以使用 Qt 使用以下函数执行该过程:
QTransform::squareToQuad:创建变换矩阵创建一个变换矩阵 trans,将一个单位正方形映射到一个四边形多边形 quad。如果构造了转换,则返回 true;如果不存在此类转换,则返回 false。
QImage::transformed: 用构造的变换矩阵变换图像返回使用给定变换矩阵和变换模式变换的图像副本。
QImage::copy:提取所需区域将图像的子区域作为新图像返回。
请尝试阅读文档并考虑在可行时发布您的解决方案。
【讨论】: