gpt4 book ai didi

opencv - 使用opencv进行图像变形

转载 作者:行者123 更新时间:2023-12-02 17:42:14 24 4
gpt4 key购买 nike

我想使用opencv执行图像变形
我已经检测到图像的四个角((例如)4000x4000),并在opencv中使用getPerspectiveTransform获得了变换矩阵。
现在,我想在图像中心扭曲图像。
所以我用warpPerspective
我输入的源图像的大小为450x450,并且使用为整个图像计算的变换矩阵。

但是屏幕上没有任何显示。
任何帮助表示赞赏。

这是示例代码和示例图像。

这是源图像。
This is source image.

检测到该图像
This image is detected

这是我想要从图像中变形的区域。(代码中的src_crop)

enter image description here

这是结果。

enter image description here

        source[0] = Point2f(lt.x, lt.y);
source[1] = Point2f(rt.x, rt.y);
source[2] = Point2f(rb.x, rb.y);
source[3] = Point2f(lb.x, lb.y);

dst[0] = Point2f(6, 10);
dst[1] = Point2f(3899, 7);
dst[2] = Point2f(3901, 3899);
dst[3] = Point2f(9, 3902);

Mat transformMatrix ;
transformMatrix = getPerspectiveTransform(source, dst);



Mat dstFrame ;
warpPerspective(src_crop, dstFrame, transformMatrix, Size(450, 450));

最佳答案

转换失败,因为您为getPerspectiveTransform方法使用了错误的值。您似乎混淆了如何创建输出图像以及如何从该图像的数据填充目标角。

同样,链接数组的右角(左上,右上,左下,右下)也很重要,您似乎将它们混在一起了。

本示例将向您展示如何连接正确的点并将其输出到空白的输出图像中:

// Assuming your source image is called 'sourceImage' and you have the corner points you need:

// Create vectors to store the corners
vector<Point2f> originalCorners;
vector<Point2f> destinationCorners;

// Put the Sudoku corners in your originalCorners
originalCorners.clear();
originalCorners.push_back(Point2f(lt.x, lt.y);
originalCorners.push_back(Point2f(rt.x, rt.y);
originalCorners.push_back(Point2f(lb.x, lb.y);
originalCorners.push_back(Point2f(rb.x, rb.y);

// Output image size of 450x450
int ouputImageWidth = 450;
int outputImageHeight = 450;

// Create an empty image (450x450) to output your transformation result in
Mat transformedOutputImage(ouputImageWidth, outputImageHeight, sourceImage.type());

// Now put the corners of the output image so the warp knows where to warp to
destinationCorners.clear();
destinationCorners.push_back(Point2f(0, 0));
destinationCorners.push_back(Point2f(ouputImageWidth, 0));
destinationCorners.push_back(Point2f(0, outputImageHeight));
destinationCorners.push_back(Point2f(ouputImageWidth, outputImageHeight));

// Now we have all corners sorted, so we can create the warp matrix
Mat warpMatrix = getPerspectiveTransform(originalCorners, destinationCorners);

// And now we can warp the Sudoku in the new image
warpPerspective(sourceImage, transformedOutputImage, warpMatrix, Size(ouputImageWidth, ouputImageHeight));

现在,假设您知道要变形的图像部分的拐角点。如果您不知道如何获得中间正方形的点,建议您看看 these excellent answers

但是,只要您有四个角点,此方法就可以使用。您甚至可以通过手动查找中间的方形角点并将其插入来进行尝试。

关于opencv - 使用opencv进行图像变形,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43226702/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com